powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Разный план выполнения
25 сообщений из 32, страница 1 из 2
Разный план выполнения
    #39867256
Коллеги, подскажите, куда копать и из-за чего может быть такая ситуация:

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

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

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

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

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

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

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

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

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

Еще избавьтесь от OR. Сервер плохо его понимает. Замените на два запроса соединенных через UNION или UNION ALL, в зависимости от данных и бизнес логики. UNION ALL быстрее, но нужно убедиться что [Из города] никогда не равно [В город], ну или тупо исключить фильтром в одном из запросов.
...
Рейтинг: 0 / 0
Разный план выполнения
    #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
Разный план выполнения
    #39867645
Gerros
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколов Валерий,

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

А пока что - задача:
Представьте себе склад (это файл БД), а в нём ящики (это страницы), и в каждом ящике по сто фруктов (это строки). Фрукты в ящиках могут быть красные (Москва) или жёлтые (не Москва), причём в среднем в каждом ящике девяносто красных и десять жёлтых. Логично предположить, что чтобы достать сто красных фруктов, со склада достаточно принести примерно два ящика.
Сколько ящиков нужно принести, чтобы достать сто жёлтых фруктов?
...
Рейтинг: 0 / 0
Разный план выполнения
    #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
Разный план выполнения
    #39867653
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Расскажите уже кто-нибудь ТС про forceseek.
...
Рейтинг: 0 / 0
Разный план выполнения
    #39867654
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич,

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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


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

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

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

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

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


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