|
Баг оптимизатора
|
|||
---|---|---|---|
#18+
Кому не лень, и у кого версия меньше или равна Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0, проверьте пожалуйста следующий запрос: Код: sql 1. 2. 3. 4. 5.
У меня в первом случае ошибка о невозможности построить план, во втором, ок. Также, если это поведение джойнов уже где-то описано - буду признателен за ссылку. На коннекте и в гугле искал - не нашел. Всем спасибо. п.с. В 2012 не проявляется. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2013, 16:10 |
|
Баг оптимизатора
|
|||
---|---|---|---|
#18+
Microsoft SQL Server 2008 (SP2) - 10.0.4064.0 (X64) Та же картина сообщениеQuery processor could not produce a query plan because of the hints defined in this query. Resubmit the query without specifying any hints and without using SET FORCEPLAN. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2013, 16:16 |
|
Баг оптимизатора
|
|||
---|---|---|---|
#18+
Microsoft SQL Server 2008 R2 (SP1) - 10.50.2861.0 (X64) Aug 20 2012 19:28:58 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) Msg 8622, Level 16, State 1, Line 1 Query processor could not produce a query plan because of the hints defined in this query. Resubmit the query without specifying any hints and without using SET FORCEPLAN. (0 row(s) affected) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2013, 16:16 |
|
Баг оптимизатора
|
|||
---|---|---|---|
#18+
Microsoft SQL Server 2008 (SP3) - 10.0.5828.0 (X64) то же самое ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2013, 16:25 |
|
Баг оптимизатора
|
|||
---|---|---|---|
#18+
SomewhereSomehow, Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) Apr 2 2010 15:48:46 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor) Msg 8622, Level 16, State 1, Line 1 Query processor could not produce a query plan because of the hints defined in this query. Resubmit the query without specifying any hints and without using SET FORCEPLAN. (1 row(s) affected) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2013, 16:27 |
|
Баг оптимизатора
|
|||
---|---|---|---|
#18+
Не вызывает ошибку только Код: sql 1.
Скорее всего связанно с тем как работают механизмы джойнов внутри "мотора" ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2013, 16:28 |
|
Баг оптимизатора
|
|||
---|---|---|---|
#18+
SomewhereSomehow, Воспроизвелось на версиях: Microsoft SQL Server 2005 - 9.00.4053.00 (Intel IA-64) Microsoft SQL Server 2005 - 9.00.5057.00 (X64) Microsoft SQL Server 2008 R2 (SP1) - 10.50.2550.0 (X64) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2013, 16:44 |
|
Баг оптимизатора
|
|||
---|---|---|---|
#18+
SomewhereSomehow, Microsoft SQL Server 2008 R2 (SP1) - 10.50.2811.0 (X64) Apr 6 2012 01:59:29 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) Msg 8622, Level 16, State 1, Line 1 Обработчик запросов не может предоставить план запроса из-за подсказок, определенных в запросе. Заново запустите запрос без указания подсказок и без использования SET FORCEPLAN. (1 row(s) affected) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2013, 16:49 |
|
Баг оптимизатора
|
|||
---|---|---|---|
#18+
Всем спасибо! Значит не мерещится. Maxx, Если в смысле "мотора" имеется ввиду execution engine, то до туда не доходит, падает еще на этапе построения плана. Пока, затрудняюсь сказать с чем связано, пойду как раз сейчас домой и по-изучаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2013, 16:50 |
|
Баг оптимизатора
|
|||
---|---|---|---|
#18+
SomewhereSomehow, Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (X64) Apr 22 2011 19:23:43 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) Сообщение 8622, уровень 16, состояние 1, строка 1 Обработчик запросов не может предоставить план запроса из-за подсказок, определенных в запросе. Заново запустите запрос без указания подсказок и без использования SET FORCEPLAN. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2013, 16:54 |
|
Баг оптимизатора
|
|||
---|---|---|---|
#18+
SomewhereSomehow немного не точно выразился..loop будет делать "перебор" и если чето не найдет ну и фиг с ним по факту,а вот для двух других (для hash , конечно с натяжкой) будет все таки пытаться "сделать" 2 набора ,видимо так сделано , что построитель планов для всех кроме loop при таком варианте пытаться сразу "просчитать" наборы ,а передан только 1 набор и он сразу дает от ворот поворот. (Я так себе могу пояснить,почему такое поведение ,косвенно здесь подтверждание,хотя уверен сие вы читали) Если чет раскопаете - делитесь . ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2013, 17:21 |
|
Баг оптимизатора
|
|||
---|---|---|---|
#18+
SomewhereSomehowКому не лень, и у кого версия меньше или равна Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0, проверьте пожалуйста следующий запрос: Код: sql 1. 2. 3. 4. 5.
У меня в первом случае ошибка о невозможности построить план, во втором, ок. Также, если это поведение джойнов уже где-то описано - буду признателен за ссылку. На коннекте и в гугле искал - не нашел. Всем спасибо. п.с. В 2012 не проявляется. пришлось поправить название таблиц и колонок Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2013, 08:12 |
|
Баг оптимизатора
|
|||
---|---|---|---|
#18+
HandKot, sysobjects - содержит в себе UNION sys.objects - нет ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2013, 10:46 |
|
Баг оптимизатора
|
|||
---|---|---|---|
#18+
MaxxHandKot, sysobjects - содержит в себе UNION sys.objects - нетВ 2000-м? А разве там sysobjects не таблицей была? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2013, 10:48 |
|
Баг оптимизатора
|
|||
---|---|---|---|
#18+
iap, ой я не помню , помоему в 2000 ето все таки была таблица.... сорри версию не досмотрел в 2000 вообще в схеме sys помоему ничего не существовало ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2013, 10:51 |
|
Баг оптимизатора
|
|||
---|---|---|---|
#18+
iapMaxxHandKot, sysobjects - содержит в себе UNION sys.objects - нетВ 2000-м? А разве там sysobjects не таблицей была? ага таблицей, тоже не сразу посмотрел так что мой пост не в счет :) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2013, 11:34 |
|
Баг оптимизатора
|
|||
---|---|---|---|
#18+
В общем, примерно понятно, в чем дело. Оптимизатор сам себя обхитряет. Большой практической ценности бага не имеет, имхо, по крайней мере, в моем случае, т.к. существенного влияния на производительность не оказало. Но обратил внимание потому, что присутствие NL в плане было не очень логичным. Однако эффекты недоработка производит забавные. Желающим понаблюдать ниже примеры. БД opt Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Забавные эффекты Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Причина оказалась в том, как оптимизатор выполняет упрощение дерева операторов. До того, как он доходит до самой оптимизации, он всячески пытается упростить дерево операторов. В частности он проталкивает предикаты вниз на уровень доступа к данным, при этом он умеет учитывать транзитивные зависимости. Т.е. если t1.a = t2.b, и t1.a = 1, то значит что и t2.b = 1. И вот что дальше делает оптимизатор - он исключает из дерева само условие соединения t1.a = t2.b, превращая его в некое подобие кросс-джойна. И хотя, на этом этапе все ок, но когда начинается сама оптимизация и поиск альтернатив, то если исключен NL, остаются только SM, HS, которые требуют как минимум один equi предикат в условии соединения. И вот тут отличие 2005-2008R2 от 2012, в 2012 в методе построения SM джойна есть расширение функционала в виде дополнительных методов, типа PexprConstructColumnEqualsColumnPredicate , которое строит предикат необходимый джойну и в итоге в плане получается такое условие соединения ([opt].[dbo].[t2].b) = ([opt].[dbo].[t1].a) для мерджа. Насчет 2000, нужно посмотреть на примерах с джойнами, у меня нет инстанса под рукой. Оптимизатор вроде сильно изменился от версии 2000 к 2005, так что не знаю. В общем, получается, что если оптимизатор может исключить условие соединения, то он сам себя ограничивает только NL. Постараюсь найти время написать про это подробнее в блоге. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2013, 11:49 |
|
Баг оптимизатора
|
|||
---|---|---|---|
#18+
SomewhereSomehow, Во втором примере только t1.a+1 уже можно убрать оставив просто t1.a, иначе непонятно что иллюстрирует пример. Опечатался я. * 2. * Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2013, 11:52 |
|
Баг оптимизатора
|
|||
---|---|---|---|
#18+
SomewhereSomehowЗабавные эффекты Насчет 2000, нужно посмотреть на примерах с джойнами, у меня нет инстанса под рукой. У меня есть "Microsoft SQL Server 2000 - 8.00.2039 (Intel X86)". В нём нет опции recompile для запросов, поэтому я её убрал. Первые 3 эффекта повторились, как для версии 2008R2. В четвёртом эффекте вы, наверное, перепутали местами "Error" и "Ok"? Ибо запрос, помеченный "Error", выполняется успешно, а запрос "Ok" — выдаёт ошибку (на версии 2008R2). На версии 2000 оба запроса из "четвёртого эффекта" отработали нормально, что меня немного озадачило. Потом я понял, что это из-за опции recompile. MSSQL, выполняя запрос 4.1, перекомпилирует его, подставляя актуальное значение переменной, и получает такое: Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
что эквивалентно такому запросу: Код: sql 1. 2. 3. 4. 5. 6.
Здесь merge не смущает оптимизатор, и он строит требуемый план запроса. В примере 4.2 после подстановки @a = 1 получается такой запрос: Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Что эквивалентно запросу 1.1 (который завершается с ошибкой). MSSQL 2000 не умеет делать подобные подстановки в план запроса в рантайме, поэтому успешно выполняет оба запроса из примера 4. Если же убрать recompile, то и MSSQL 2005/2008 успешно выполнят пример 4. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2013, 14:54 |
|
Баг оптимизатора
|
|||
---|---|---|---|
#18+
Гость333, Да, совершенно верно, в 4м тож опечатался =). Все остальное тоже понятно, спасибо что потестили на 2000. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2013, 15:18 |
|
Баг оптимизатора
|
|||
---|---|---|---|
#18+
А про 2014 будет в вашем блоге? Конечно хорошо что они фиксят такие откровенные баги, но 2014 они же хвалят как что-то особенное. Да и багом это нельзя назвать, ибо баги только в допиленных идеальных вещах. А тут зачатки системы оптимизации, им ещё пилить и пилить. :) OffTop И ещё, как знатока оптимизатора планов: Вы более познаёте со стороны или имеете "доступ к тайным знаниям"? Имеете ли связи с группой разрабов? Интересуют вопросы по развитию оптимизатора в целом. К примеру (с потолка) использование GPU для параллельному поиску оптимального плана, к примеру. Ссори за ламерность вопроса. И возможно уже спрашивал(и). PS: Ну да, закатал я губень, что хочу аналога Феймана, но по теории БД. Популяризаторы всегда в спросе. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2013, 18:08 |
|
Баг оптимизатора
|
|||
---|---|---|---|
#18+
Mnior, До 2014 очень хотелось бы добраться, самому интересно, но пока не получается со временем. Тайных знаний нет, при личном знакомстве они тоже ничего секретного не выдадут =) Касательно общего развития, лучше спросить местных MVP, знаю, что по крайней мере раньше они вели какие-то дискуссии с группой разработчиков на тему , как сейчас не знаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2013, 20:04 |
|
|
start [/forum/topic.php?fid=46&gotonew=1&tid=1706121]: |
0ms |
get settings: |
9ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
41ms |
get topic data: |
13ms |
get first new msg: |
9ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
others: | 242ms |
total: | 396ms |
0 / 0 |