|
Оптимизация вложенных запросов с GROUP BY
|
|||
---|---|---|---|
#18+
Навеяло вот этой темой: /topic/806691&pg=1 Суть в том что если в запросе с маленьким количеством ключей, используется внутренний запрос с Group By и большой статистикой ключей, то SQL сервера похоже не догадываются проталкивать "внешнее" условие внутрь. То есть если у меня есть временная таблица документов и мне нужно рассчитать скажем сумму по документу, то мне придется вручную проталкивать JOIN в подзапрос. Так вот этот запрос будет очень медленно работать (высчитывая подзапрос по всей базе) Код: plaintext
Если же внутри добавить JOIN нужные_документы.ключ=позиции.документ все будет очень быстро. Мы сделали автоматическое проталкивание ключей внутрь, если они join\'ся с небольшими временными таблицами (как в примере).Но сейчас хотим обобщить и проталкивать внутрь условия, когда внешняя статистика значительно меньше внутренней. Но для этого надо рассчитывать эту статистику, что по сути эквивалентно задаче Join Ordering, то есть по сути надо дублировать этот механизм SQL сервера в нашем компиляторе запросов. Соответственно вопрос почему этого не делают сами SQL сервера. Или может я просто чего-то не понимаю. ЗЫ: Да я в курсе, что есть SubQuery Expressions, но они не помогают если подзапрос надо связывать по INNER, а не LEFT JOIN :( ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 12:43 |
|
Оптимизация вложенных запросов с GROUP BY
|
|||
---|---|---|---|
#18+
Bond_JamesBondСоответственно вопрос почему этого не делают сами SQL сервера. Вот не нужно так громко говорить "SQL сервера" про один PG. Или марки всех испытанных серверов - в студию! Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 13:06 |
|
Оптимизация вложенных запросов с GROUP BY
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, В том же топике тестили Oracle. MS SQL никогда не отличался чем-то инновационным... Но собственно вопрос поэтому в топике Сравнение СУБД, чтобы выяснить кто с такой проблемой сталкивался и как решал. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 13:20 |
|
Оптимизация вложенных запросов с GROUP BY
|
|||
---|---|---|---|
#18+
On 13.07.2011 13:43, Bond_JamesBond wrote: > Соответственно вопрос почему этого не делают сами SQL сервера. Или может я > просто чего-то не понимаю. Хочу напомнить, что SQL Server -- это продукт фирмы Microsoft. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 13:55 |
|
Оптимизация вложенных запросов с GROUP BY
|
|||
---|---|---|---|
#18+
я, может, не понял чего, но: Код: 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.
Microsoft SQL Server 2008 (SP2) - 10.0.4000.0 (X64) Sep 16 2010 19:43:16 Copyright (c) 1988-2008 Microsoft Corporation Express Edition with Advanced Services (64-bit) on Windows NT 5.2 <X64> (Build 3790: Service Pack 2) ну, конечно, на более сложных запросах может всякое быть. но, по крайней мере, вот в таком примитивном случае получаем, вроде бы то, что вы и хотите? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 14:31 |
|
Оптимизация вложенных запросов с GROUP BY
|
|||
---|---|---|---|
#18+
для запроса из темы, на которую вы ссылаетесь, имеем: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 14:42 |
|
Оптимизация вложенных запросов с GROUP BY
|
|||
---|---|---|---|
#18+
On 13.07.2011 15:31, daw wrote: > select *from t1inner join (select id,sum(ssum) ssumfrom t2group by id) ton t1.id = t.id > go В таком простейшем случае внешний запрос вообще ничего не делает, его можно просто выкинуть, что СУБД и делает, скорее всего. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 14:46 |
|
Оптимизация вложенных запросов с GROUP BY
|
|||
---|---|---|---|
#18+
MasterZiv, Нет, почему, он как раз все правильно делает в отличии от остальных... Хм... Спасибо, посмотрю как MS SQL Server себя ведет в таких случаях... Правда за отсутствие в Window функциях нормальных Aggregate функций (хотя бы SUM) им нужно руки отрывать. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 14:56 |
|
Оптимизация вложенных запросов с GROUP BY
|
|||
---|---|---|---|
#18+
ну, добавим еще и третью таблицу, чтоб уж совсем похоже на авторский запрос было: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 15:03 |
|
Оптимизация вложенных запросов с GROUP BY
|
|||
---|---|---|---|
#18+
daw, А если внутрь запрос вставить join, то есть Код: plaintext 1. 2. 3. 4.
? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 15:08 |
|
Оптимизация вложенных запросов с GROUP BY
|
|||
---|---|---|---|
#18+
Bond_JamesBond, Просто под рукой нет MS SQL, сейчас буду искать... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 15:09 |
|
Оптимизация вложенных запросов с GROUP BY
|
|||
---|---|---|---|
#18+
Хотя конечно самый веселый случай такой : Код: plaintext 1. 2. 3. 4. 5.
И evaluate: Код: plaintext 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 15:23 |
|
Оптимизация вложенных запросов с GROUP BY
|
|||
---|---|---|---|
#18+
ну, например, вот: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 15:27 |
|
Оптимизация вложенных запросов с GROUP BY
|
|||
---|---|---|---|
#18+
Хотя последнее бред написал имел ввиду вот что: Код: plaintext 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 15:28 |
|
Оптимизация вложенных запросов с GROUP BY
|
|||
---|---|---|---|
#18+
Bond_JamesBondПравда за отсутствие в Window функциях нормальных Aggregate функций (хотя бы SUM) им нужно руки отрывать. Ждите SQL Server 2011. Ну, или CTP3 ставьте, который вчера вышел. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 15:31 |
|
Оптимизация вложенных запросов с GROUP BY
|
|||
---|---|---|---|
#18+
В догонку: OVER Clause Support EnhancedThe OVER clause has been extended to support window functions. Window functions perform a calculation across a set of rows that are in some relationship to the current row. For example, you can use the ROWS or RANGE clause over a set of rows to calculate a moving average or cumulative total. For more information, see OVER Clause (Transact-SQL). In addition, ordering rows within a partition is now supported in the aggregate functions that allow the OVER clause to be specified. Analytic FunctionsThe following analytic functions have been added. CUME_DIST (Transact-SQL)LAST_VALUE (Transact-SQL)PERCENTILE_DISC (Transact-SQL)FIRST_VALUE (Transact-SQL)LEAD (Transact-SQL)PERCENT_RANK (Transact-SQL)LAG (Transact-SQL)PERCENTILE_CONT (Transact-SQL) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 15:35 |
|
Оптимизация вложенных запросов с GROUP BY
|
|||
---|---|---|---|
#18+
daw, А насколько большие t2 и t4, а то может она cheat'ит и не включает внешнюю таблицу в Join Ordering. То есть если они большие то это будет достаточно медленный план. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 15:38 |
|
Оптимизация вложенных запросов с GROUP BY
|
|||
---|---|---|---|
#18+
pkarklin, Это в 2011 будет? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 15:39 |
|
Оптимизация вложенных запросов с GROUP BY
|
|||
---|---|---|---|
#18+
Bond_JamesBondЭто в 2011 будет? Уже сейчас есть в SQL Server Code Name "Denali" CTP3. ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 15:44 |
|
Оптимизация вложенных запросов с GROUP BY
|
|||
---|---|---|---|
#18+
> А насколько большие t2 и t4 так, я же скрипты заполнения привел - по паре тысяч строк. если по 20 000 запихать, план уже другой получается. но это уже ни о чем разговор, по-моему - сферические таблицы и запрос в вакууме. :) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 16:05 |
|
Оптимизация вложенных запросов с GROUP BY
|
|||
---|---|---|---|
#18+
11g XE на пустых таблицах выдает нормальный план Код: 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. 45. 46. 47.
если дадут скрипты заполнения можно поглядеть и с данными, но врядли план измениться без причины ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 16:13 |
|
Оптимизация вложенных запросов с GROUP BY
|
|||
---|---|---|---|
#18+
Yo.!, В той ветке вроде были ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 16:38 |
|
Оптимизация вложенных запросов с GROUP BY
|
|||
---|---|---|---|
#18+
Bond_JamesBond, ну а есть оракловые ? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 16:49 |
|
Оптимизация вложенных запросов с GROUP BY
|
|||
---|---|---|---|
#18+
автор, сформируйте пожауйста csv-фалый с тестовыми данными, и приаттачьте его сюда. Так просто будет легче искать "истину" имея у всех одну и то-же модель. Так-же прицепом сразу скрипты создания таблиц, без лишних полей. P.S. Навскидку, особо не вдаваясь в тонкости проблемы я бы таакой скрипт как у вас не писал. Я бы Join-ами формировал саму выборку, а группировка этой выборки должна быть в секции group by главного запроса. Оптимизатор такое все равно пправильно разберет. т.е. что-то вроде: Код: plaintext 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 19:30 |
|
Оптимизация вложенных запросов с GROUP BY
|
|||
---|---|---|---|
#18+
Ggg_old, А вы уверены что она не ругнется, что документы.дата не в GROUP BY? Честно говоря не совсем понимаю как сделать файл, который можно приаттачить ко всем СУБД. ЗЫ: кстати, а никто не кинет ссылку где хотя бы контурно описывается как и когда MS SQL так проталкивает внешний контекст. Что-то не удалось установить себе 2008 сервер :( Так бы попроверял гипотезы... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2011, 23:18 |
|
|
start [/forum/topic.php?fid=35&msg=37349848&tid=1552654]: |
0ms |
get settings: |
11ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 160ms |
0 / 0 |