Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
24.11.2011, 16:01
|
|||
---|---|---|---|
дополнительное поле в order by ускоряет выборку |
|||
#18+
есть вьюха. выборка последних 100 записей к указанной дате стабильно длится 2-3 секунды, если в order by дописываю ещё одно поле (любое, кроме hasFlag), то выборка происходит практически мгновенно поясните доступно, что произошло вьюха и запрос Код: plaintext 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.
планы Код: plaintext 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
24.11.2011, 16:12
|
|||
---|---|---|---|
дополнительное поле в order by ускоряет выборку |
|||
#18+
вас интересует именно "почему" сервер при изменении текста запроса выбрал другой план или что? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
24.11.2011, 16:16
|
|||
---|---|---|---|
дополнительное поле в order by ускоряет выборку |
|||
#18+
Дедушка, и это, и каким образом добиться быстрой выборки без указания ненужного поля но уже нашёл что проглядел - на таблице tableSE был только индекс (kodA, ..., dt) и не было индекса с dt на первом месте в принципе, тема закрыта :) ... |
|||
:
Нравится:
Не нравится:
|
|||
|
24.11.2011, 16:21
|
|||
---|---|---|---|
дополнительное поле в order by ускоряет выборку |
|||
#18+
ShakillДедушка, и это, и каким образом добиться быстрой выборки без указания ненужного поля но уже нашёл что проглядел - на таблице tableSE был только индекс (kodA, ..., dt) и не было индекса с dt на первом месте в принципе, тема закрыта :) в быстром - nested loops , а в медленном - merge join можно проверить медленный вариант с добавлением OPTION (LOOP JOIN) ... |
|||
:
Нравится:
Не нравится:
|
|||
|
24.11.2011, 16:32
|
|||
---|---|---|---|
дополнительное поле в order by ускоряет выборку |
|||
#18+
komradможно проверить медленный вариант с добавлением OPTION (LOOP JOIN) сработало, медленный вариант стал быстрым даже при старом индексе ... |
|||
:
Нравится:
Не нравится:
|
|||
|
24.11.2011, 16:43
|
|||
---|---|---|---|
дополнительное поле в order by ускоряет выборку |
|||
#18+
komrad...можно проверить медленный вариант с добавлением OPTION (LOOP JOIN) вряд ли это "проверить", скорее уж "нагнуть". :) ... |
|||
:
Нравится:
Не нравится:
|
|||
|
24.11.2011, 16:58
|
|||
---|---|---|---|
дополнительное поле в order by ускоряет выборку |
|||
#18+
Дедушкаkomrad...можно проверить медленный вариант с добавлением OPTION (LOOP JOIN) вряд ли это "проверить", скорее уж "нагнуть". :) ну так уж и нагнуть ;) просто подсказать неразумной машине быстрый вариант - она (оптимизатор) же работает в цейтноте ... |
|||
:
Нравится:
Не нравится:
|
|||
|
25.11.2011, 03:08
|
|||
---|---|---|---|
дополнительное поле в order by ускоряет выборку |
|||
#18+
Правдоподобность сказанного не означает его верность. "Идентичность" описанного не означает её оптимальности. Да, "выпадение" оптимизатора не доказательство ошибочности подхода, но подсказывает о возможности. Интересно другое почему он выпадает (статистика и т.п., конструкция), как описать задачу по другому и какой подход "кошернее". После просмотра планов... С виду баг . PRINT @@Version пжалуста. Top(Low) + MERGE + LOOP (не MERGE) по идее не должно быть просто никак. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
25.11.2011, 11:34
|
|||
---|---|---|---|
дополнительное поле в order by ускоряет выборку |
|||
#18+
Mnior, Microsoft SQL Server 2008 (SP2) - 10.0.4321.0 (Intel X86) Sep 2 2011 17:25:33 а почему такой выбор планов может считаться багом? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
25.11.2011, 11:37
|
|||
---|---|---|---|
|
|||
дополнительное поле в order by ускоряет выборку |
|||
#18+
MniorПравдоподобность сказанного не означает его верность. "Идентичность" описанного не означает её оптимальности. Да, "выпадение" оптимизатора не доказательство ошибочности подхода, но подсказывает о возможности. Магистр Йода говоришь ты как! ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
|
29.11.2011, 11:10
|
|||
---|---|---|---|
дополнительное поле в order by ускоряет выборку |
|||
#18+
Shakillа почему такой выбор планов может считаться багом?Нет скорее я ошибся. MERGE вроде как не должен ждать окончания роботы LOOP. Всё вроде как потоком делается и TOP должен тупо обрубить процесс. Только HASH дву-этапный и ждёт все данные. Тут дело в скане и ordered. Но к сожадению, у вас план обрезался , притом на важном месте. Выложите XML (графический) желательно, или полный текстовый (не желательно). А вот главная их часть: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
План интересный, да ещё и секции. Совершенно непонятно почему в случае MERGE не сраьатывает SEEK для PK_TableSL т.е. Вместо поиска по ключу в постоянной таблице делается скан и соединение по ключу LOOP-ом. Shakill , умоляю, выложите весь план в графике (XML), ваш план показывает баг оптимизатора на простой таблице, который мучает нас всех на временных. Это очень ценный экземпляр. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
29.11.2011, 12:43
|
|||
---|---|---|---|
дополнительное поле в order by ускоряет выборку |
|||
#18+
Mnior, пока что план выложить не могу, но предположу, что в медленном запросе скан TableSL может появляться из-за её размера (всего несколько записей с несколькими интами в каждой). предикат в быстром запросе (то что вы выделили красным) выглядел как sh.dt <= '2010-05-25' и ORDERED FORWARD ... |
|||
:
Нравится:
Не нравится:
|
|||
|
29.11.2011, 13:11
|
|||
---|---|---|---|
дополнительное поле в order by ускоряет выборку |
|||
#18+
почему сразу баг? а вдруг просто перекошенная статистика? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
29.11.2011, 13:16
|
|||
---|---|---|---|
дополнительное поле в order by ускоряет выборку |
|||
#18+
Mnior, план быстрого запроса ... |
|||
:
Нравится:
Не нравится:
|
|||
|
29.11.2011, 13:17
|
|||
---|---|---|---|
дополнительное поле в order by ускоряет выборку |
|||
#18+
Mnior, план медленного запроса ... |
|||
:
Нравится:
Не нравится:
|
|||
|
29.11.2011, 14:27
|
|||
---|---|---|---|
дополнительное поле в order by ускоряет выборку |
|||
#18+
lockyпочему сразу баг? а вдруг просто перекошенная статистика?Mnior Вместо SEEK по кластерному PK в постоянной таблице делается скан по кластерному PK и соединение в LOOP-е по PK Никакая статистика такое не отмажет. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
29.11.2011, 16:37
|
|||
---|---|---|---|
дополнительное поле в order by ускоряет выборку |
|||
#18+
TableSHTableSLActual Number of Rows814540721 Estimated Number of Rows63.92125MniorВместо SEEK по кластерному PK в постоянной таблице делается скан по кластерному PK и соединение в LOOP-е по PKВот, сформулировал проблему: Наличие неактуальной статистики не должно порождать наиболее неоптимальный план в возможных случаяхТ.е. я за более стабильные планы. Кто за то чтобы вообще запретить выбор SCAN на малых строках ? Кто скажет на сколько падает скорость при смене SCAN на SEEK? Пруф в студю. Закидайте тыцами. Вот смотрите, он (оптимизатор) думает, зачем я буду делать 64 раза SEEK в 5 строках, лучше SCAN. @..ть экономия на щепках от спичек. Ладно, допустим 100500 на 5. И что? Что разница такая сущестченная что SEEK на 5 строках гигантски тормознее чем SCAN??? В этих буферизациях, синхронизация кэша проца, переключения задач бла-бла-бла, больше проседания, чем эти лишние такты. Если ты (оптимизатор) такой вумный, возми отсортируй эти 5 строк и за-MERGE-и. Или LOOP быстрее MERGE на 5 строках? (Не верю ©) Как раз для таких случаев. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
29.11.2011, 17:48
|
|||
---|---|---|---|
дополнительное поле в order by ускоряет выборку |
|||
#18+
MniorTableSHTableSLActual Number of Rows814540721 Estimated Number of Rows63.92125MniorВместо SEEK по кластерному PK в постоянной таблице делается скан по кластерному PK и соединение в LOOP-е по PKВот, сформулировал проблему: Наличие неактуальной статистики не должно порождать наиболее неоптимальный план в возможных случаяхТ.е. я за более стабильные планы. статистика актуальная. на всякий случай проапдейтил, в долгом запросе в пределах 1% поменялись стоимости Sort на TableSE и Seek на TableSH. в остальном, картина та же ... |
|||
:
Нравится:
Не нравится:
|
|||
|
30.11.2011, 10:08
|
|||
---|---|---|---|
дополнительное поле в order by ускоряет выборку |
|||
#18+
Shakillстатистика актуальная.Этим ты хочешь MS добить? Shakillв долгом запросе в пределах 1% поменялись стоимости Sort на TableSE и Seek на TableSH. в остальном, картина та жеНужно не стоимости, а сравнить Estimated Number of Rows сравнить с Actual Number of Rows . Они должны быть порядком. И, мужики , подключайтесь, 11678999 , вопросы же есть, мнения. Или мне опять самим с собой вести беседу?! ... |
|||
:
Нравится:
Не нравится:
|
|||
|
30.11.2011, 10:39
|
|||
---|---|---|---|
|
|||
дополнительное поле в order by ускоряет выборку |
|||
#18+
Интересная вьюха. А этот кусок на иннер джоин нельзя переписать? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
30.11.2011, 10:40
|
|||
---|---|---|---|
дополнительное поле в order by ускоряет выборку |
|||
#18+
MniorShakillстатистика актуальная.Этим ты хочешь MS добить? Shakillв долгом запросе в пределах 1% поменялись стоимости Sort на TableSE и Seek на TableSH. в остальном, картина та жеНужно не стоимости, а сравнить Estimated Number of Rows сравнить с Actual Number of Rows . Они должны быть порядком. И, мужики , подключайтесь, 11678999 , вопросы же есть, мнения. Или мне опять самим с собой вести беседу?! А чего тут подключаться? В данном конкретном примере явно какие то проблемы со статистикой и cardinality, отсюда и все тормоза. И если только заменить scan 5 строк на seek 5 строк то что-то прям кардинально должно поменятся? Сомневаюсь. Корень проблемы то не в этом. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
30.11.2011, 11:05
|
|||
---|---|---|---|
дополнительное поле в order by ускоряет выборку |
|||
#18+
[quot Mind]MniorВ данном конкретном примере явно какие то проблемы со статистикой и cardinality, отсюда и все тормоза.Было же сказано, что статистика актуальна. Или вы имеете ввиду что тут два бага, один ещё и в статистике. MindИ если только заменить scan 5 строк на seek 5 строк то что-то прям кардинально должно поменятся? Сомневаюсь.Вы вообще внимательно читали? Вы хоть планы смотрели? Разжёвываю: 1. На 5 строках нет разницы (это и я доказываю) 2. Скуль меняет SEEK на SCAN (проитив чего я распинаюсь) 3. Статистика "соврала" и там 100500 строк (пофиг почему) 4. 100500 строк со SCAN валят запрос (это факт, см планы, лентяи) 5. SEEK на 100500 строк летает. (Если бы он был бы. см второй запрос) MindКорень проблемы то не в этом.Ну теперь вы поняли, что как раз в этом то и соль. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
30.11.2011, 12:21
|
|||
---|---|---|---|
дополнительное поле в order by ускоряет выборку |
|||
#18+
MniorShakillстатистика актуальная.Этим ты хочешь MS добить? Shakillв долгом запросе в пределах 1% поменялись стоимости Sort на TableSE и Seek на TableSH. в остальном, картина та жеНужно не стоимости, а сравнить Estimated Number of Rows сравнить с Actual Number of Rows . Они должны быть порядком. Estimated и Actual в скане остались те же. но вот чего я не понимаю: в TableSL всего 7 строк, из них фильтру удовлетворяют 5. то есть, Estimated определилось абсолютно точно. а Actual Number (40721) приблизительно совпало с Estimated Number * Number of Executions (8145). кто-то может пояснить? VolochkovaИнтересная вьюха. А этот кусок на иннер джоин нельзя переписать? в ней была логическая ошибка, сейчас рабочая вьюха уже не так выглядит. а старый экземпляр держу для этой ветки ) ... |
|||
:
Нравится:
Не нравится:
|
|||
|
30.11.2011, 13:02
|
|||
---|---|---|---|
дополнительное поле в order by ускоряет выборку |
|||
#18+
Shakillно вот чего я не понимаю: в TableSL всего 7 строк, из них фильтру удовлетворяют 5. то есть, Estimated определилось абсолютно точно. а Actual Number (40721) приблизительно совпало с Estimated Number * Number of Executions (8145). кто-то может пояснить?Чёрд. Кажись я второй раз ошибся. Из-за того что не видел кусок урезаного плана, не важно. Ща буду разбирать графический знуля. Там 13 тысч против 305 строк. И именно LOOP (не константа) в быстром плане урезает секции (RangePartitionNew) в TableSH. (Сам процесс урезания - аллилуя) В медленном "бегает" по всем 174 секциям сразу. Может первое предположение (MERGE + LOOP) всётаки верно ? А. MERGE дожидается окончания LOOP Б. TOP не режет процесс В. TOP не успевает срезать ? Нужет ответ на вариант А. Так, сосредоточились. Актульные план с Actual Rows говорит, что столько-то строк таки и было получено рельано на каждом этапе. Следовательно тормоза были из-за объёмов. Что-бы определить какой из вариантов (А,Б,В), нужно посмотреть реальные планы без TOP-а (или с большим значением). Если количество строк для MERGE будет такое же, то верно первоначальное утверждение (А). Иначе проблемы с TOP (Б,В). PS: Но тынц на SCAN замест SEEK на малых строках всё равно требую. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
30.11.2011, 21:46
|
|||
---|---|---|---|
дополнительное поле в order by ускоряет выборку |
|||
#18+
MniorБыло же сказано, что статистика актуальна. Или вы имеете ввиду что тут два бага, один ещё и в статистике. Статистика может и актуальна, хотя мы не знаем с каким sample rate она обновлена, но сюда по тому что таблицы сравнительно не большие это не должно быть проблемой. Но тем не менее правильные оценки сервер не может сделать. Статистика сама по себе далеко не совершенна, хранится всего 200 значений, не отслеживается корреляция значений etc. Так что оптимизатор явно где-то лажает при определении количества строк из TableSH, вопрос - почему? Есть ли какие-то известные проблемы связанные со статистикой на партиционированных таблицах? Особенно как в этом случае, когда партиций под 2 сотни? MniorВы вообще внимательно читали? Вы хоть планы смотрели? Разжёвываю: 1. На 5 строках нет разницы (это и я доказываю) 2. Скуль меняет SEEK на SCAN (проитив чего я распинаюсь) 3. Статистика "соврала" и там 100500 строк (пофиг почему) 4. 100500 строк со SCAN валят запрос (это факт, см планы, лентяи) 5. SEEK на 100500 строк летает. (Если бы он был бы. см второй запрос) Так ведь если оценки изначально были бы сделаны правильно, то там был бы другой план. Ну или хотя бы LOOP был бы заменен на HASH. И говорить о том что seek будет быстрее чем scan смысла бы не было. MniorНу теперь вы поняли, что как раз в этом то и соль. Даже если обратится с этим вопросом/предложением к мелкомягким, они полюбому укажут в первую очередь на неправильные оценки количества строк (хотя может тут как раз и есть баг). Простым фиксом (scan на seek при количество строк <=5) с их стороны явно не обойтись, а менять всю оценочную модель они уж точно не будут. Там все завязано на предположение что оценки верны, а не на том, что если вдруг статистика наврала тогда лучше сделаем так и так. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=46&mobile=1&tid=1715450]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
29ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
67ms |
get tp. blocked users: |
2ms |
others: | 21ms |
total: | 169ms |
0 / 0 |