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

Откуда:
Сообщений: 30
Есть запрос в стиле:
SELECT * FROM T WHERE T.ID1 IN (~10 000 значений int) AND T.ID2 IN (< 30 значений int)
{ID1, ID2} - primary key, clustered index
в таблице 500 000 записей
сейчас запрос выполняется 30..60 секунд, что очень долго
Как его можно оптимизировать?
9 ноя 11, 12:43    [11568661]     Ответить | Цитировать Сообщить модератору
 Re: нужен совет по оптимизации простого запроса  [new]
Glory
Member

Откуда:
Сообщений: 104751
Bogdan0x400
IN (~10 000 значений int)

И откуда берутся эти 10 000 значений ?

Сообщение было отредактировано: 9 ноя 11, 12:45
9 ноя 11, 12:45    [11568685]     Ответить | Цитировать Сообщить модератору
 Re: нужен совет по оптимизации простого запроса  [new]
Bogdan0x400
Member

Откуда:
Сообщений: 30
Glory
Bogdan0x400
IN (~10 000 значений int)

И откуда берутся эти 10 000 значений ?

Это внешние ключи на другую таблицу. С их количеством ничего поделать нельзя.
Может есть смысл представить их в виде множества диапазонов? Типо ID1 <= ID1_top AND ID1 >= ID1_bottom ? Это ускорит что-то?
count(distinct ID1) выдаёт ~260 000
count(distinct ID2) выдаёт 375
9 ноя 11, 12:52    [11568746]     Ответить | Цитировать Сообщить модератору
 Re: нужен совет по оптимизации простого запроса  [new]
SanyL
Member

Откуда: Москва
Сообщений: 4540
план выполнения у запроса существует?
9 ноя 11, 12:53    [11568759]     Ответить | Цитировать Сообщить модератору
 Re: нужен совет по оптимизации простого запроса  [new]
Glory
Member

Откуда:
Сообщений: 104751
Bogdan0x400
Это внешние ключи на другую таблицу.

Да хоть "внутренние"
Как эти 10000 значений попадают внутрь IN ?
Вы руками перечисляете их что ли ?
9 ноя 11, 12:55    [11568796]     Ответить | Цитировать Сообщить модератору
 Re: нужен совет по оптимизации простого запроса  [new]
Bogdan0x400
Member

Откуда:
Сообщений: 30
Glory
Bogdan0x400
Это внешние ключи на другую таблицу.

Да хоть "внутренние"
Как эти 10000 значений попадают внутрь IN ?
Вы руками перечисляете их что ли ?

Это LINQ to Entity интерпретирует int[].Contains()
9 ноя 11, 12:59    [11568825]     Ответить | Цитировать Сообщить модератору
 Re: нужен совет по оптимизации простого запроса  [new]
Glory
Member

Откуда:
Сообщений: 104751
Bogdan0x400
Это LINQ to Entity интерпретирует int[].Contains()

А MSSQL запрос то какой ?
9 ноя 11, 13:01    [11568843]     Ответить | Цитировать Сообщить модератору
 Re: нужен совет по оптимизации простого запроса  [new]
Bogdan0x400
Member

Откуда:
Сообщений: 30
SanyL
план выполнения у запроса существует?

Там только Clustered Index Seek 100%.
9 ноя 11, 13:01    [11568844]     Ответить | Цитировать Сообщить модератору
 Re: нужен совет по оптимизации простого запроса  [new]
Bogdan0x400
Member

Откуда:
Сообщений: 30
Glory
Bogdan0x400
Это LINQ to Entity интерпретирует int[].Contains()

А MSSQL запрос то какой ?
У меня MS SQL Server 2008 Express, у клиента хз шо, но точно не экспресс, и работает так же медленно.
9 ноя 11, 13:03    [11568868]     Ответить | Цитировать Сообщить модератору
 Re: нужен совет по оптимизации простого запроса  [new]
Glory
Member

Откуда:
Сообщений: 104751
Bogdan0x400
У меня MS SQL Server 2008 Express, у клиента хз шо, но точно не экспресс, и работает так же медленно.

Мда. Попробуем еще раз
Предоставьте _текст запроса_, который выполняет ваш MS SQL Server
И план выполнения
Все перечисленное лучше в оригинальном виде
9 ноя 11, 13:05    [11568886]     Ответить | Цитировать Сообщить модератору
 Re: нужен совет по оптимизации простого запроса  [new]
SanyL
Member

Откуда: Москва
Сообщений: 4540
Bogdan0x400
SanyL
план выполнения у запроса существует?

Там только Clustered Index Seek 100%.


ну если ток Clustered Index Seek - то и оптимизировать нечего.
9 ноя 11, 13:05    [11568889]     Ответить | Цитировать Сообщить модератору
 Re: нужен совет по оптимизации простого запроса  [new]
komrad
Member

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

10000 значений запихнуть во времянку и сджойнить её с T
9 ноя 11, 13:09    [11568933]     Ответить | Цитировать Сообщить модератору
 Re: нужен совет по оптимизации простого запроса  [new]
Bogdan0x400
Member

Откуда:
Сообщений: 30
Glory
Bogdan0x400
У меня MS SQL Server 2008 Express, у клиента хз шо, но точно не экспресс, и работает так же медленно.

Мда. Попробуем еще раз
Предоставьте _текст запроса_, который выполняет ваш MS SQL Server
И план выполнения
Все перечисленное лучше в оригинальном виде

Что-то у меня не получается перехватить запрос с помощью AnjLab SQLExpressProfiler :( . Его там просто нету, или он транслируется в что-то другое. Но я читал что Contains интерпретируется в IN. Возможно проблема в том что оно не интерпретируется в IN, а интерпретируется в какую-то фигню. Сейчас соберу такой же запрос сам.
9 ноя 11, 14:06    [11569538]     Ответить | Цитировать Сообщить модератору
 Re: нужен совет по оптимизации простого запроса  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Bogdan0x400,

Для MS SQL Server 2008 Express есть Management Studio, в нем закладка Tools - SQL Server Profiler
9 ноя 11, 14:13    [11569638]     Ответить | Цитировать Сообщить модератору
 Re: нужен совет по оптимизации простого запроса  [new]
Glory
Member

Откуда:
Сообщений: 104751
Bogdan0x400
Но я читал что Contains интерпретируется в IN.

Представляете себе этот IN из 10 000 даже хотя бы одноразрядных натуральных чисел через запятую ?
9 ноя 11, 14:14    [11569655]     Ответить | Цитировать Сообщить модератору
 Re: нужен совет по оптимизации простого запроса  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 7498
ТС,

BOL
Including an extremely large number of values (many thousands) in an IN clause can consume resources and return errors 8623 or 8632. To work around this problem, store the items in the IN list in a table.
9 ноя 11, 15:31    [11570308]     Ответить | Цитировать Сообщить модератору
 Re: нужен совет по оптимизации простого запроса  [new]
Bogdan0x400
Member

Откуда:
Сообщений: 30
trew
Bogdan0x400,

Для MS SQL Server 2008 Express есть Management Studio, в нем закладка Tools - SQL Server Profiler
нету
9 ноя 11, 17:01    [11571134]     Ответить | Цитировать Сообщить модератору
 Re: нужен совет по оптимизации простого запроса  [new]
Bogdan0x400
Member

Откуда:
Сообщений: 30
Glory
Bogdan0x400
Но я читал что Contains интерпретируется в IN.

Представляете себе этот IN из 10 000 даже хотя бы одноразрядных натуральных чисел через запятую ?

я этот запрос написал, работает меньше, чем за секунду
так что проблема в LINQ
9 ноя 11, 17:02    [11571138]     Ответить | Цитировать Сообщить модератору
 Re: нужен совет по оптимизации простого запроса  [new]
Bogdan0x400
Member

Откуда:
Сообщений: 30
Спасибо env'y и komrad'y за совет запихнуть всё в временную таблицу. Я сначала всё-таки сделаю простым запросом без LINQ, а потом переделаю с использованием временной таблицы если будет нужда.
Кстати, actual execution plan для смоделированного запроса выглядит как на приататченном файле.

К сообщению приложен файл. Размер - 10Kb
9 ноя 11, 17:06    [11571177]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить