Чи існує ЯКЩО-небудь спосіб зробити результат, щоб створити рівно 3 чіткі посібники і не більше? Я сподіваюся, що зможу краще відповісти на питання в майбутньому, включивши посібники щодо плану із запитами типу CTE, на які посилаються багато разів, щоб подолати деякі випробування CTE на SQL Server.
Не сьогодні. Нерекурсивні загальні табличні вирази (CTE) розглядаються як визначення рядкового перегляду та розширюються в дерево логічних запитів у кожному місці, на яке вони посилаються (як і звичайні визначення перегляду) перед оптимізацією. Логічне дерево вашого запиту:
LogOp_OrderByCOL: Union1007 ASC COL: Union1015 ASC
LogOp_Project COL: Union1006 COL: Union1007 COL: Union1014 COL: Union1015
LogOp_Join
LogOp_ViewAnchor
LogOp_UnionAll
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_ViewAnchor
LogOp_UnionAll
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
Зауважте два прив’язки для перегляду та шість викликів до внутрішньої функціїnewid
перед тим, як почати оптимізацію. Тим не менш, багато людей вважають, що оптимізатору слід було б визначити, що розширені під деревами спочатку були єдиним посилається об'єктом і відповідно спрощувати його. Також було кілька запитів на підключення щоб дозволити явну матеріалізацію CTE або похідної таблиці.
Більш загальна реалізація дозволила б оптимізатору розглянути можливість матеріалізації довільних загальних виразів для підвищення продуктивності ( CASE
з підзапитом - ще один приклад, коли проблеми можуть виникнути сьогодні). Корпорація Microsoft Research опублікувала документ (PDF) про це ще в 2007 році, хоча він досі залишається без змін. Наразі ми обмежені явною матеріалізацією, використовуючи такі речі, як змінні таблиці та тимчасові таблиці.
SQLKiwi згадав про складання планів у SSIS, чи є спосіб чи корисний інструмент, який допоможе скласти хороший план для SQL Server?
Це було просто бажане мислення з мого боку, і вийшло далеко за межі ідеї зміни довідників плану. В принципі, можливо, написати інструмент для прямого керування XML-шоу програми, але без конкретних інструментів оптимізатора за допомогою інструменту, можливо, це стане неприємним досвідом для користувача (і розробник придумає це).
У конкретному контексті цього питання такий інструмент все ще не зможе реалізувати вміст CTE таким чином, який могли б використовувати декілька споживачів (для подачі обох входів для перехресного з'єднання в цьому випадку). Оптимізатор та механізм виконання підтримують багатопотужні котушки, але лише для конкретних цілей - жодна з яких не може бути застосована до цього конкретного прикладу.
Хоча я не впевнений, у мене досить сильна думка про те, що за RelOps можна дотримуватися (Nested Loop, Lazy Spool), навіть якщо запит не такий, як план - наприклад, якщо ви додали 4 та 5 до CTE , він все ще продовжує використовувати той самий план (здавалося б - протестований на SQL Server 2012 RTM Express).
Тут є розумна кількість гнучкості. Широка форма плану XML використовується для керування пошуком остаточного плану (хоча багато атрибутів повністю ігноруються, наприклад, тип розподілу на біржах), а звичайні правила пошуку також значно послаблені. Наприклад, раннє обрізання альтернатив на основі міркувань витрат вимкнено, дозволено чітке введення перехресних з'єднань, а скалярні операції ігноруються.
Занадто багато деталей, щоб заглибитись, але розміщення фільтрів та обчислювальних скалярів не може бути вимушеним, і предикати форми column = value
узагальнені, щоб план, що містить X = 1
або X = @X
може бути застосований до запиту, що містить X = 502
абоX = @Y
. Ця особлива гнучкість може сильно допомогти у пошуку природного плану, який слід застосовувати.
У конкретному прикладі константа Union All завжди може бути реалізована як постійне сканування; кількість входів до Союзу Все не має значення.