|
|
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
CammomileДля набегающего итога? Окно >> Сэлфджоин >> ОТВ >> Курсор Поскольку твой 2008 не может решить задачу окном, то тебе нужен самоджойн. Почему лучше, потому, что быстрее. Просто быстрее во всех случаях. как раз в 2008-ом нарастающий итог быстрее всего считается курсором ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2017, 12:17:00 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
Minamoto, снова эти непохожие примеры про гвозди, шо ж их тут так любят? я описал проблему и спросил как её решить. новичок - он на то и новичок, что не знает что и где искать. для вашего чсв важно считать меня неграмотным - наздоровье, я неграмотный. кто хотел помочь - помог уже. вон комментом ниже подробно объясняют, дают полезную информацию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2017, 12:25:53 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
Yasha123 как раз в 2008-ом нарастающий итог быстрее всего считается курсором Исследования в студию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2017, 12:31:47 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
CammomileВ моей картине мира есть ровно ДВА случая, когда нужно использовать именно ОТВ. В моей наоборот... Я теперь только через CTE пишу.. удобнее же... Код: sql 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. Напишите это без CTE Код: sql 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. Такие вещи очень хороши с OVER т.к. результат оконки нельзя использовать в WHERE в текущем контексте, поэтому если надо потом отфильтровать то надо оборачивать в подзапросы... А это удобнее с CTE Важно только понимать что подзапросы не будут выполнятся в том порядке в котором они идут в CTE, а сервер после разворота сам решит... Новички обычно на этом и спотыкаются.. Даже... Я не раз слышал от коллег работающих довольно долго с SQL но не хотящих вдаваться в подробности кухни MSSQL, что они когда так пишут всерьез думают что сервер и один раз выполнит и типа положит в буфер результат, чтобы N раз обратится.. и порядок выполнения тоже.... А потом удивляются откуда там 20 млрд reads и cpu умирает... После чего мне хотелось сказать -50% к премии.. Жаль нет полномочий ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2017, 12:32:44 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
CammomileЧто значит чем лучше мой вариант чем ЦТЕ. Вопрос в том, для решения какой задачи лучше? Для набегающего итога? Окно >> Сэлфджоин >> ОТВ >> Курсор Поскольку твой 2008 не может решить задачу окном, то тебе нужен самоджойн. Почему лучше, потому, что быстрее. Просто быстрее во всех случаях. Для инкапсуляции "промежуточных наборов данных"? Это опять же бабушка на двое сказала. Лично я не люблю СТЕ из-за ограничений, которые они накладывают на написание кода. СТЕ ты обязан использовать СРАЗУ после объявления, и никак иначе. Понятно почему, потому, что это (кроме случая с рекурсией) простой синтаксический сахар, который развернется, в итоге в тоже что и Код: sql 1. . Работу СТЕ ты не можешь, например, легко проверить во время написания процедуры, в отличие от #таблицы. Ласт, бат нот лист, весь синтаксис ОТВ довольно необычен для скуль кода, и прямо скажем, режет глаз, особенно когда один за другим идет ворох ОТВшек- сложно распутывать. Таким образом именно для меня ОТВ вообще ничем не лучше других способов вращать данные, при этом наличиствуют очевидные недостатки. В моей картине мира есть ровно ДВА случая, когда нужно использовать именно ОТВ. а) рекурсивные запросы б) ты пишешь инлайн функцию, в которой у тебя физически нет возможности использовать временные таблицы для каких то предрасчетов. Очередной очень ценный коммент. Если быстее - то не вопрос что лучше. Насчёт как на глаз - мне интуитивно как раз CTE легче читается. Особенно когда тянет из разных баз. И главное, так и не понял, как обойти unbounded preceding в 2008? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2017, 12:34:42 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
X-CiteВажно только понимать что подзапросы не будут выполнятся в том порядке в котором они идут в CTE, а сервер после разворота сам решит... Новички обычно на этом и спотыкаются.. Даже... Я не раз слышал от коллег работающих довольно долго с SQL но не хотящих вдаваться в подробности кухни MSSQL, что они когда так пишут всерьез думают что сервер и один раз выполнит и типа положит в буфер результат, чтобы N раз обратится.. и порядок выполнения тоже.... А потом удивляются откуда там 20 млрд reads и cpu умирает... А откуда знаем как именно выполняется, чтоб избежать "20 млрд reads и cpu умирает". Где почитать про это? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2017, 12:39:49 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
авторВажно только понимать что подзапросы не будут выполнятся в том порядке в котором они идут в CTE, а сервер после разворота сам решит... Ага, и в какой то момент твоя логика встанет колом, потому, что поменялось качество данных, слетела статистика, инопланетяне облучили твой сервак из космоса и так далее. И человек, который подхватывает твою разработку, 10 раз проклянет тебя, за эти твои ОТВ. авторНапишите это без CTE SELECT .. INTO #SmallFilterTable SELECT .. INTO #AggregateTable SELECT .. INTO #IDs ... SELECT ... FROM #IDs MERGE JOIN #SmallFilterTable LOOP JOIN #AggregateTable ... MaintTable OPTION(F ORCE ORDER ) ;-) Чего в твоих ЦТЕ попросту не взлетит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2017, 12:44:09 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
CammomileавторНапишите это без CTE SELECT .. INTO #SmallFilterTable SELECT .. INTO #AggregateTable SELECT .. INTO #IDs ... SELECT ... FROM #IDs MERGE JOIN #SmallFilterTable LOOP JOIN #AggregateTable ... MaintTable OPTION(F ORCE ORDER ) ;-) Чего в твоих ЦТЕ попросту не взлетит. Так есть же голова... Смотрим.. Большой запрос с 20 подзапросами.. Данных в таблицах под 100 млн... Оптимизатор не может подобрать оптимальный толковый план.. Смотрим по частям и видим что можно часть данных перекинуть во времянки, положить туда индексов, и уже над ними проводить действия... И это будет быстрее... Я же не говорю, что CTE везде и всегда... На все есть голова, знания, и опыт, чтобы понимать когда и что применять... Но в большинстве случаев когда данных в среднем до 1 млн, оптимизатор отлично справляется... У нас есть View которая инкапсулирует в себе ценовые предложения для клиента с учетом скидок, наценок, правил и.т.п. View - Это одна большая инструкция, без времянок.. Подзапросов CTE там около 20 штук... Если их оформить одним запросом, то сам черт ногу сломит... А не View нельзя, потому что на нее маппится Entity Framework который считает ее метаобъектом и может над ней строить запросы используя свою объектную модель... slovnetА откуда знаем как именно выполняется, чтоб избежать "20 млрд reads и cpu умирает". Где почитать про это? SET STATISTICS IO ON SET STATISTICS TIME ON Плюс планы запросов, плюс профайлер + понимание теории построения индексов и внутренних операторов MSSQL при построении плана, плюс понимание логического конвейера обработки запросов... + опыт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2017, 12:58:55 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
CammomileYasha123 как раз в 2008-ом нарастающий итог быстрее всего считается курсором Исследования в студию. репро приводит то, кто несет фигню. но специально для вас вот, пожалуйста: Best approaches for running totals – updated for SQL Server 2012 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2017, 13:13:03 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
Yasha123Cammomileпропущено... Исследования в студию. репро приводит то, кто несет фигню. но специально для вас вот, пожалуйста: Best approaches for running totals – updated for SQL Server 2012 Вы грамотно не выделили последнее предложение Все же не самым быстрым, а с минимальным количеством чтений. По крайней мере, в этом репро у курсора четвертое место по скорости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2017, 13:21:47 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
MinamotoYasha123пропущено... репро приводит то, кто несет фигню. но специально для вас вот, пожалуйста: Best approaches for running totals – updated for SQL Server 2012 Вы грамотно не выделили последнее предложение Все же не самым быстрым, а с минимальным количеством чтений. По крайней мере, в этом репро у курсора четвертое место по скорости. товарищ, вы о чем? мы говорим о 2008 -ом? значит, window functions-решения мы отметаем, так? ААрон отмел CTE и quirky update, и даже написано почему. ну и наконец, Камомиля утветждал, что "самоджойн быстрее всего". ну так вот вам картинкой время выполнения курсора и "самоджойна". вы правда не видите, что быстрее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2017, 13:31:00 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
для тех, кто не видит, что речь о 2008 + cursor vs Сэлфджоин Yasha123CammomileДля набегающего итога? Окно >> Сэлфджоин >> ОТВ >> Курсор Поскольку твой 2008 не может решить задачу окном, то тебе нужен самоджойн . Почему лучше, потому, что быстрее. Просто быстрее во всех случаях . как раз в 2008-ом нарастающий итог быстрее всего считается курсором ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2017, 13:33:46 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
авторНапишите это без CTE SELECT .. INTO #SmallFilterTable SELECT .. INTO #AggregateTable SELECT .. INTO #IDs ... Да, (если возможно) лучше без сложных CTE. Времменые таблицы - оч. полезная вещь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2017, 13:54:16 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
Yasha123Minamotoпропущено... Вы грамотно не выделили последнее предложение Все же не самым быстрым, а с минимальным количеством чтений. По крайней мере, в этом репро у курсора четвертое место по скорости. товарищ, вы о чем? мы говорим о 2008 -ом? значит, window functions-решения мы отметаем, так? ААрон отмел CTE и quirky update, и даже написано почему. ну и наконец, Камомиля утветждал, что "самоджойн быстрее всего". ну так вот вам картинкой время выполнения курсора и "самоджойна". вы правда не видите, что быстрее? О том, что он является самым быстрым при исключении ненадежных способов, которые, теоретически, могут дать неверные результаты (но это не точно). Но не "самым быстрым", о чем заявляли вы. Если бы вы сразу сказали, что "курсор быстрее самоджойна", и привели бы точно такое же обоснование - вопросов бы не было ) Я лишь зацепился за фразу "It has the highest duration of the "faster" solutions". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2017, 13:56:49 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
X-Cite А не View нельзя, потому что на нее маппится Entity Framework который считает ее метаобъектом и может над ней строить запросы используя свою объектную модель... Типичная ситуация, когда херовое проектирование тянет за собой плохой код. Это аргумент не в защиту СТЕ, это аргумент против того рукожопа, который 20 СТЕ свел в одно представление. Yasha123 , окей, картинка убедительная. Я в 2008 не работал уже лет 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2017, 14:03:26 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
Правда, остается вопрос, почему по защите аргумента "в 2008 курсой быстрее" ты приводишь статью про "2012", но это мы оставим на твоей совести. Протестировать сам я не могу, за неимением 2008р2 под рукой, а в сети, увы, не смог найти подобного исследования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2017, 14:05:02 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
slovnet И главное, так и не понял, как обойти unbounded preceding в 2008? Ну вот видишь, по последним данным от Ящьки123, самое быстрое в твоем случае, это курсор. Если, конечно, у тебя не стоит задача написать функцию. Тогда курсор не подойдет. под спойлером самоджойн если ты не разобрался Код: sql 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2017, 14:13:22 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
Cammomile, slovnetИ главное, так и не понял, как обойти unbounded preceding в 2008? Так можно в 2008 сделать самоджойном или нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2017, 14:14:16 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
Cammomile, Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2017, 14:16:18 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
MinamotoО том, что он является самым быстрым при исключении ненадежных способов, которые, теоретически, могут дать неверные результаты (но это не точно). Но не "самым быстрым", о чем заявляли вы. Если бы вы сразу сказали, что "курсор быстрее самоджойна" , и привели бы точно такое же обоснование - вопросов бы не было ) Я лишь зацепился за фразу "It has the highest duration of the "faster" solutions". у меня вообще-то приведена цитата того, что я опровергаю. и на картинке у меня подчеркнуто именно то, что относится к запрашиваемому репро. товарищ попросил "исследования в студию" в ответ на мою реплику о курсоре, который в 2008-ом быстрее. а почему я ему не рассказываю о "ненадежных способов, которые, теоретически, могут дать неверные результаты (но это не точно)", это мое личное дело ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2017, 14:32:27 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
CammomileНу вот видишь, по последним данным от Ящьки123 исследование не мое, а Аарона. а имя не корежь, оно не мое, так звали моего покойного кота. но если тебе доставляет удовольствие, то да, наверняка он в гробу перевернулся от такого к нему внимания ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2017, 14:34:56 |
|
||
|
Best practice по сведению двух CTE
|
|||
|---|---|---|---|
|
#18+
Yasha123... а имя не корежь... но при этом Yasha123... ну и наконец, Камомиля утветждал... За собой следи, для начала. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2017, 14:37:30 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39564306&tid=1690743]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
195ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 220ms |
| total: | 482ms |

| 0 / 0 |
