Чи додавання DISTINCT
в наступному прикладі чи впливає на час виконання запиту?
Чи розумно використовувати його як підказку іноді?
SELECT *
FROM A
WHERE A.SomeColumn IN (SELECT DISTINCT B.SomeColumn FROM B)
Чи додавання DISTINCT
в наступному прикладі чи впливає на час виконання запиту?
Чи розумно використовувати його як підказку іноді?
SELECT *
FROM A
WHERE A.SomeColumn IN (SELECT DISTINCT B.SomeColumn FROM B)
Відповіді:
Якщо вам цікаво про такі речі, вам слід порівняти плани виконання ваших запитів.
Форма плану виконання вашого запиту, звичайно, буде відрізнятися залежно від кількості рядків у ваших таблицях та визначених індексів.
Один із сценаріїв, який показує, що різниці в продуктивності немає, це коли в них значно більше рядків, 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
*******************