Чи корисне використання DISTINCT як підказки у підзапитах?


18

Чи додавання DISTINCTв наступному прикладі чи впливає на час виконання запиту?
Чи розумно використовувати його як підказку іноді?

SELECT *
FROM   A
WHERE  A.SomeColumn IN (SELECT DISTINCT B.SomeColumn FROM B) 

Відповіді:


25

Якщо вам цікаво про такі речі, вам слід порівняти плани виконання ваших запитів.

Форма плану виконання вашого запиту, звичайно, буде відрізнятися залежно від кількості рядків у ваших таблицях та визначених індексів.
Один із сценаріїв, який показує, що різниці в продуктивності немає, це коли в них значно більше рядків, Aніж у B. Потім оптимізатор вибере Bв якості таблиці, що веде, у вкладеному циклі A. Щоб повернути правильний результат, Bв обох запитах необхідно використовувати потоковий агрегат на таблиці, щоб отримати лише окремі рядки B. Тож у цьому випадку окреме ключове слово не впливає на продуктивність.

введіть тут опис зображення

введіть тут опис зображення

План виконання для двох інших очевидних для тестування очевидних випадків: більше рядків у B, ніж A і рівна кількість рядків у таблицях, також показує точно такий же план виконання для запитів.

Оновлення

Перед оптимізацією запиту запит проходить етап спрощення. Ви можете бачити, як виглядає логічне дерево, використовуючи прапор трасування 8606.

Дерево вводу для запитів чітко відрізняються, але після спрощення вони однакові.

Ref: Більше недокументованих прапорів слідів оптимізатора запитів та глибокого занурення оптимізатора запитів - частина 2

Дерево введення та спрощене дерево для запиту з використанням різних:

*** Input Tree: ***
        LogOp_Project QCOL: [xx].[dbo].[A].SomeColumn
            LogOp_Select
                LogOp_Get TBL: A A TableID=213679909 TableReferenceID=0 IsRow: COL: IsBaseRow1002 
                ScaOp_SomeComp 2
                    ScaOp_Identifier QCOL: [xx].[dbo].[A].SomeColumn
                    LogOp_GbAgg OUT(QCOL: [xx].[dbo].[B].SomeColumn,) BY(QCOL: [xx].[dbo].[B].SomeColumn,)
                        LogOp_Project
                            LogOp_Project
                                LogOp_Get TBL: B B TableID=229679966 TableReferenceID=0 IsRow: COL: IsBaseRow1006 
                                AncOp_PrjList 
                            AncOp_PrjList 
                        AncOp_PrjList 
            AncOp_PrjList 
*******************
*** Simplified Tree: ***
        LogOp_LeftSemiJoin
            LogOp_Get TBL: A A TableID=213679909 TableReferenceID=0 IsRow: COL: IsBaseRow1002 
            LogOp_Get TBL: B B TableID=229679966 TableReferenceID=0 IsRow: COL: IsBaseRow1006 
            ScaOp_Comp x_cmpEq
                ScaOp_Identifier QCOL: [xx].[dbo].[A].SomeColumn
                ScaOp_Identifier QCOL: [xx].[dbo].[B].SomeColumn
*******************

Дерево введення та спрощене дерево для запиту, не використовуючи різного:

*** Input Tree: ***
        LogOp_Project QCOL: [xx].[dbo].[A].SomeColumn
            LogOp_Select
                LogOp_Get TBL: A A TableID=213679909 TableReferenceID=0 IsRow: COL: IsBaseRow1002 
                ScaOp_SomeComp 2
                    ScaOp_Identifier QCOL: [xx].[dbo].[A].SomeColumn
                    LogOp_Project
                        LogOp_Get TBL: B B TableID=229679966 TableReferenceID=0 IsRow: COL: IsBaseRow1006 
                        AncOp_PrjList 
            AncOp_PrjList 
*******************
*** Simplified Tree: ***
        LogOp_LeftSemiJoin
            LogOp_Get TBL: A A TableID=213679909 TableReferenceID=0 IsRow: COL: IsBaseRow1002 
            LogOp_Get TBL: B B TableID=229679966 TableReferenceID=0 IsRow: COL: IsBaseRow1006 
            ScaOp_Comp x_cmpEq
                ScaOp_Identifier QCOL: [xx].[dbo].[A].SomeColumn
                ScaOp_Identifier QCOL: [xx].[dbo].[B].SomeColumn
*******************
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.