Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 много однородных запросов  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
клиент сыпет подобные запросы в базу.


SELECT 
    [Extent1].[ID] AS [ID], 
    [Extent1].[AID] AS [AID], 
    [Extent1].[code] AS [code], 
    [Extent1].[Name] AS [Name], 
    [Extent1].[Core] AS [Core], 
    [Extent1].[ID_Column] AS [ID_Column], 
    [Extent1].[ID_Vers_Column] AS [ID_Vers_Column], 
    [Extent1].[Function_Interval] AS [Function_Interval], 
    [Extent1].[Owner_ID] AS [Owner_ID], 
    [Extent1].[Structure_Change_Date] AS [Structure_Change_Date], 
    [Extent1].[Data_Change_Date] AS [Data_Change_Date], 
    [Extent1].[Property] AS [Property]
    FROM [nsi].[Catalog] AS [Extent1]
    WHERE [Extent1].[ID] IN (cast('7e8fdaaa-2798-4a9c-be42-2b2ed2acdcca' as uniqueidentifier), cast('f9ad43b8-f196-4e91-9480-2df548de3fac' as uniqueidentifier), cast('9b877687-c821-42fa-9741-349fd578187c' as uniqueidentifier))


понятно, что для каждого нового ида и их кобинаций будет собственный запрос и планы.
самым оптимальным кажется склейка ХМЛ и через параметр в подзапрос

declare @p3 xml
set @p3=convert(xml,N'<row ID="368e59c1-33a3-4cdc-888a-0c9376a6f171"/><row ID="a5911f80-576f-45d1-b101-7bb2be09a7d0"/>')
exec sp_executesql 
N'select 
        ......
from 
      [meta].[Table_Selectable_Fields] a
where 
       a.Table_ID in (select ID = obj.r.value(''@ID'',''uniqueidentifier'') from @Table_List.nodes(''/row'') as obj(r))   
                               ,N'@Table_List xml',@Table_List=@p3


или есть варианты получше?
4 дек 15, 16:10    [18514791]     Ответить | Цитировать Сообщить модератору
 Re: много однородных запросов  [new]
_human
Member

Откуда:
Сообщений: 560
Mike_za,

Как альтернатива
Собрать ИДы в темповую таблицу или табличную переменную(если их немного).
Далее джоинить с [nsi].[Catalog].
4 дек 15, 16:23    [18514864]     Ответить | Цитировать Сообщить модератору
 Re: много однородных запросов  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Mike_za,

а вопрос в чем заключается, как избежать размножения однотипных планов? Для этого есть механизм "Руководства планов", если таких запросов мало или включить для всех запросов в свойствах базы "параметризация" = принудительная, если все запросы этим страдают.
4 дек 15, 16:25    [18514879]     Ответить | Цитировать Сообщить модератору
 Re: много однородных запросов  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Владислав Колосов,
и как это поможет в ситуации, когда в фильтре то 1, то 2 , то 10 констант?
4 дек 15, 17:10    [18515153]     Ответить | Цитировать Сообщить модератору
 Re: много однородных запросов  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Mike_za,

будет всего 10 планов, а на 10 тысяч.
4 дек 15, 17:11    [18515165]     Ответить | Цитировать Сообщить модератору
 Re: много однородных запросов  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Надо поэкспериментировать и посмотреть профайлером, раздел событий "производительность".
4 дек 15, 17:13    [18515177]     Ответить | Цитировать Сообщить модератору
 Re: много однородных запросов  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Владислав Колосов
будет всего 10 планов, а на 10 тысяч.
Это если запрос будет автопараметризован.
В противном случае, на каждый запрос с различными значениями констант - свой план.
4 дек 15, 17:23    [18515257]     Ответить | Цитировать Сообщить модератору
 Re: много однородных запросов  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
_human, временная таблица вне запроса приведет к гарантированной рекомпиляции. Табличная переменная внешняя только начиная с 2008.
Или вы о другом?
4 дек 15, 22:37    [18516383]     Ответить | Цитировать Сообщить модератору
 Re: много однородных запросов  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Даже супер полезная книжка пасует))

IN Lists
One of the areas where Entity Framework does not perform well is working with lists of rows. Let’s try to load multiple
customers based on the list of their CustomerId values. Listing 16-17 shows the client code and generated SQL for doing this. Listing 16-17. Loading a list of rows
/*C# Code*/
var list = new List<int>();
for (int i = 1; i < 100; i++)
        list.Add(i);
using (var context = new EFDbContext())
{
}
var q = context.Customers.Where(t => list.Contains(t.CustomerId))
        .Select(t => new {t.CustomerID, t.FirstName, t.LastName});
var result = q.ToList();


/* Generated SQL */
SELECT
        [Extent1].[CustomerId] AS [CustomerId],
        [Extent1].[FirstName] AS [FirstName],
        [Extent1].[LastName] AS [LastName]
FROM [dbo].[Customers] AS [Extent1]
WHERE [Extent1].[CustomerId] IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
        11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
        27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
        43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58,
        59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74,
        75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
        91, 92, 93, 94, 95, 96, 97, 98, 99)'

There are two problems with this code. First, SQL Server does not parameterize the statement, which, as we already discussed, adds the load to SQL Server. Moreover, SQL Server does not work efficiently with large IN lists. Those statements take a longer time to compile, execution plans consume large amounts of memory, and they are not always efficient.

Unfortunately, there is very little that can be done in this scenario. Loading rows one by one or in small batches is not efficient either. The best approach would be to execute a custom SQL Statement using table-valued parameters, and to create objects manually afterwards. However, this requires a large amount of coding. With all that being said, Entity Framework is not the best choice for systems that require batch data processing.
4 дек 15, 23:31    [18516657]     Ответить | Цитировать Сообщить модератору
 Re: много однородных запросов  [new]
_human
Member

Откуда:
Сообщений: 560
Mike_za,

Неверное об этом. но не будет ли временная таблица всегда быстрее чем IN ?
5 дек 15, 15:21    [18517875]     Ответить | Цитировать Сообщить модератору
 Re: много однородных запросов  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Mike_za
временная таблица вне запроса приведет к гарантированной рекомпиляции.
Не обязательно.
Можно избавиться от рекомпиляций - создавать временную таблицу один раз на сеанс, после создания обновить статистику с norecompute.
5 дек 15, 23:00    [18519272]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить