Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Разный план выполнения / 25 сообщений из 32, страница 1 из 2
26.09.2019, 12:20
    #39867256
Разный план выполнения
Коллеги, подскажите, куда копать и из-за чего может быть такая ситуация:

Есть простой запрос (исходный был конечно более сложный, но суть его такая же)
Select * from dbo.[Новый транзит] where [Из города]='Москва' or [В город]='Москва'
Выполняется приемлемо быстро. Исходная таблица с большим количеством накладных. Индексы построены.

Если меняем 'Москва' на 'Екатеринбург' запрос отрабатывает в РАЗЫ медленнее!
Планы выполнения при этом разные.

Как такое может быть? И что с этим делать?
...
Рейтинг: 0 / 0
26.09.2019, 12:37
    #39867265
Разный план выполнения
Только что обнаружил, что
на производительность влияет условие
[В город] = 'Москва' - работает быстро
[В город] = 'Екатеринбург' - работает медленно
Индекс по полю "В город" пересоздавал и реорганизовывал - ничего не поменялось
...
Рейтинг: 0 / 0
26.09.2019, 12:37
    #39867266
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разный план выполнения
Статистику обновите (желательно с full scan) по индексам [Из города] и [в город]
...
Рейтинг: 0 / 0
26.09.2019, 13:16
    #39867286
Разный план выполнения
К сожалению никак не помогло...
...
Рейтинг: 0 / 0
26.09.2019, 13:23
    #39867292
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разный план выполнения
Соколов Валерий,

OPTION (RECOMPILE) :)
...
Рейтинг: 0 / 0
26.09.2019, 13:44
    #39867302
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разный план выполнения
TaPaKOPTION (RECOMPILE)С литеральными параметрами?

Соколов ВалерийК сожалению никак не помогло...Планы показывайте. Актуальные, в формате sqlplan.
...
Рейтинг: 0 / 0
26.09.2019, 13:56
    #39867307
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разный план выполнения
Соколов Валерий,

опрометчивое решение тестировать производительность на select *

вам действительно нужны все столбцы из таблицы?
...
Рейтинг: 0 / 0
26.09.2019, 22:47
    #39867592
Mind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разный план выполнения
felix_ffСоколов Валерий,

опрометчивое решение тестировать производительность на select *

вам действительно нужны все столбцы из таблицы?+1

Еще избавьтесь от OR. Сервер плохо его понимает. Замените на два запроса соединенных через UNION или UNION ALL, в зависимости от данных и бизнес логики. UNION ALL быстрее, но нужно убедиться что [Из города] никогда не равно [В город], ну или тупо исключить фильтром в одном из запросов.
...
Рейтинг: 0 / 0
26.09.2019, 23:51
    #39867635
Разный план выполнения
Попытаюсь всем ответить как могу :)

1. Статистику таблицы по столбцам [Из города], [В город] обновлял - результаты те же, индексы перестраивал
2. OPTION (RECOMPILE) в SELECTе применял - никаких изменений
3. Я производительность не тестирую. Выбираю все столбцы просто что бы упростить запрос для понимания.
4. Сам запрос такой:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT top 2000 [новый транзит].*
FROM         dbo.контрагенты AS Отправитель RIGHT OUTER JOIN
                      dbo.контрагенты AS Получатель RIGHT OUTER JOIN
                      dbo.[контрагенты - адреса] AS СкладПолучателя RIGHT OUTER JOIN
                      dbo.[новый транзит] ON СкладПолучателя.[ID адреса] = dbo.[новый транзит].[Получатель склад] ON 
                      Получатель.[№_клиента] = dbo.[новый транзит].[код клиента пол] ON Отправитель.[№_клиента] = dbo.[новый транзит].[код клиента] LEFT OUTER JOIN
                      dbo.контрагенты AS Плательщик ON dbo.[новый транзит].[код плательщика] = Плательщик.[№_клиента] LEFT OUTER JOIN
                      dbo.[контрагенты - адреса] AS СкладОтправителя ON dbo.[новый транзит].[Отправитель склад] = СкладОтправителя.[ID адреса]
WHERE     
Плательщик.[Регион выст счетов] ='Екатеринбург'
OR
 dbo.[новый транзит].[Из города]  ='Екатеринбург'
OR                                                           
dbo.[новый транзит].[В город]  ='Екатеринбург'




На всякий случай сообщаю:
Когда делаю выборку по "Москве" - возвращаемых записей порядка 400 000, по "Екатеринбургу" - всего 1 900 штук
В запросе делаю TOP 2000

Прикладываю планы выполнения.
Упростив запросы увидел что планы по структуре одинаковые, но смутило то что, операция "Просмотр строк таблицы [Новый транзит]" гораздо больше по стоимости когда выборка идет по Екатеринбургу. При этом показатель "Фактическое количество строк" примерно 700 000, по Москве - около 8 000. Что это значит - не понимаю!

Как только меняю "В город" на Москву - все начинает летать.
...
Рейтинг: 0 / 0
27.09.2019, 00:44
    #39867645
Gerros
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разный план выполнения
Соколов Валерий,

проверьте количество чтений для обоих запросов.

А пока что - задача:
Представьте себе склад (это файл БД), а в нём ящики (это страницы), и в каждом ящике по сто фруктов (это строки). Фрукты в ящиках могут быть красные (Москва) или жёлтые (не Москва), причём в среднем в каждом ящике девяносто красных и десять жёлтых. Логично предположить, что чтобы достать сто красных фруктов, со склада достаточно принести примерно два ящика.
Сколько ящиков нужно принести, чтобы достать сто жёлтых фруктов?
...
Рейтинг: 0 / 0
27.09.2019, 02:11
    #39867651
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разный план выполнения
Соколов Валерий,

еще раз: вам реально нужны все столбцы из ваших таблиц?

дело в том что к примеру
Код: sql
1.
select * from table where id = 1



будет сильно отличаться по плану от
Код: sql
1.
select [name] from table where id = 1



селект с звездочкой выбирает все колонки таблицы, мало вероятно что у вас везде в предикате все выводится на поиск по кластеризованным индексам. в таком случае вы не оставляете оптимизатору большого выбора поскольку rid/key-lookup дорогостоящие операции, основная оценка будет происходить из кардинальности по предикату. для достаточно большого объема оптимизатор выберет сканирование таблицы один раз что собственно и видно у вас по предикату где город "москва"

но вот для относительно малого объема будет выбираться поиск + rid/key lookup что может дать достаточно существенную деградацию.

установите
Код: sql
1.
set statistics io on


и сравните логические чтения когда идет сканирование таблицы и когда идет запрос по seek+lookup

второй вариант выгоден на относительно малых объемах строк
...
Рейтинг: 0 / 0
27.09.2019, 02:23
    #39867653
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разный план выполнения
Расскажите уже кто-нибудь ТС про forceseek.
...
Рейтинг: 0 / 0
27.09.2019, 02:24
    #39867654
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разный план выполнения
Гавриленко Сергей Алексеевич,

так у него с сиками как раз и тормозит на сколько я понял из постов выше
...
Рейтинг: 0 / 0
27.09.2019, 02:30
    #39867657
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разный план выполнения
felix_ff,

Тогда рассказывать надо про forcescan, и про то, что не надо пудрить приличной публике мозги.
...
Рейтинг: 0 / 0
27.09.2019, 02:40
    #39867660
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разный план выполнения
Гавриленко Сергей Алексеевичfelix_ff,

Тогда рассказывать надо про forcescan, и про то, что не надо пудрить приличной публике мозги.

это конечно да, но если ему реально потом понадобится 2-3 колонки из всего зверинца план со сканом в итоге проиграет.

я все к тому что имхо достаточно странно пытаться искать оптимальный план пока нет действительного конечного запроса
...
Рейтинг: 0 / 0
27.09.2019, 10:28
    #39867724
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разный план выполнения
Соколов ВалерийПрикладываю планы выполнения.Видимо не туда приложили.

MindЗамените на два запроса соединенных через UNION или UNION ALLТам и так union all посредством index intersection.
...
Рейтинг: 0 / 0
27.09.2019, 11:29
    #39867747
Разный план выполнения
Планы
...
Рейтинг: 0 / 0
27.09.2019, 14:39
    #39867894
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разный план выполнения
Соколов ВалерийПланы

План одинаковые.

Для Москвы перед фильтром (1000) выбирается 1547 записей размером 13Мб.

Для Свердловска перед фильтром (1000) выбирается 310 тыс записей размером 1.5Г.
...
Рейтинг: 0 / 0
27.09.2019, 20:59
    #39868155
Разный план выполнения
PaulWist,

Понимаю - это "задача" от Gerros...
Но не понимаю как с этим бороться? Уж простите начинающего... :) разъясните плиз!
...
Рейтинг: 0 / 0
27.09.2019, 23:19
    #39868209
Gerros
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разный план выполнения
Соколов Валерий,

[новый транзит].[№ записи] - это первичный ключ? по нему индекс есть? кластерный не хотите сделать?
[новый транзит].[код плательщика] - индекс есть?
...
Рейтинг: 0 / 0
28.09.2019, 06:46
    #39868287
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разный план выполнения
Соколов ВалерийНо не понимаю как с этим бороться? Уж простите начинающего... :) разъясните плиз!

Экстенсивно или интенсивно можно бороться. Более мощный сервер или оптимизация и уменьшение выборки (если это вообще возможно). Другими словами - вам надо, что бы ваши физические ресурсы соответствовали вашим запросам, при условии качественной оптимизации запросов конечно же.

Для начала можно посмотреть, а надо ли вам действительно все 310 тыс записей размером 1.5Г выбирать по регулярному запросу, или можно эти записи как то пре-агрегировать например.
...
Рейтинг: 0 / 0
29.09.2019, 14:54
    #39868639
Разный план выполнения
PizzaPizzaСоколов ВалерийНо не понимаю как с этим бороться? Уж простите начинающего... :) разъясните плиз!


Для начала можно посмотреть, а надо ли вам действительно все 310 тыс записей размером 1.5Г выбирать по регулярному запросу, или можно эти записи как то пре-агрегировать например.

Так а мне и не надо 310 000 - При выборке по Екатеринбургу их там столько и нет! Там всего 2 000 записей!
...
Рейтинг: 0 / 0
29.09.2019, 15:22
    #39868650
Разный план выполнения
GerrosСоколов Валерий,

[новый транзит].[№ записи] - это первичный ключ? по нему индекс есть? кластерный не хотите сделать?
[новый транзит].[код плательщика] - индекс есть?

[№ записи] - да. первичный ключ. Был некластеризованный, пересоздал. Изменений нет.
[код плательщика] - да. индекс есть.
...
Рейтинг: 0 / 0
29.09.2019, 15:24
    #39868651
Разный план выполнения
PaulWistСоколов ВалерийПланы

План одинаковые.

Для Москвы перед фильтром (1000) выбирается 1547 записей размером 13Мб.

Для Свердловска перед фильтром (1000) выбирается 310 тыс записей размером 1.5Г.

Вот мне непонятно что есть "выбирается"? Там всего записей по "Свердловску" около 2 000!
Они все подряд выгребаются? беtз учета условия "[В город]=Екатеринбург"
...
Рейтинг: 0 / 0
29.09.2019, 19:59
    #39868693
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разный план выполнения
Соколов ВалерийPaulWistпропущено...


План одинаковые.

Для Москвы перед фильтром (1000) выбирается 1547 записей размером 13Мб.

Для Свердловска перед фильтром (1000) выбирается 310 тыс записей размером 1.5Г.

Вот мне непонятно что есть "выбирается"? Там всего записей по "Свердловску" около 2 000!
Они все подряд выгребаются? без учета условия "[В город]=Екатеринбург"Что бы найти N записей, которые удовлетворяют условиям, может понадобиться прочитать больше N записей (и, как правило, так и происходит).

Вы же рассказываете про операцию "Просмотр строк таблицы [Новый транзит]" ?
Вы же не думаете, что все 2000 записей, удовлетворяющих всем условиям запроса, находятся в начале таблицы?
А там уж как повезёт; если они в конце таблицы, то придётся просмотреть, и проверить на условия, все записи в таблице.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Разный план выполнения / 25 сообщений из 32, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]