Оптимізація select distinct

(За матеріалами статті Neil Boyle на swynk.com "Speed ​​up SELECT DISTINCT queries")

Ніл пише, що багато хто використовує опцію DISTINCT в інструкції select для фільтрації дублікатів. Наприклад, простий запит для бази даних PUBS:

select DISTINCT
au_fname,
au_lname
from authors

select DISTINCT
au_fname,
au_lname
from authors a join titleAuthor t
on t.au_id = a.au_id

select au_fname, au_lname
from authors a
where exists (
select *
from titleAuthor t
where t.au_id = a.au_id
)

select DISTINCT o.name
from sysobjects o
join sysindexes i
on o.id = i.id
where o.type = 'U'

select o.name
from sysobjects o
where o.type = 'U'
and exists (
select 1
from sysindexes i
where o.id = i.id
)

Ви повинні зрозуміти особливості об'єднання двох (або більше) таблиць, щоб використовувати це для ефективного виконання. Наступні два запити для бази даних Northwind призначені для повернення ID замовника, у якого встановлено знижку більше ніж 2 відсотки для будь-якої позиції. На перший погляд вони будуть вести себе так само, як в попередньому прикладі (формати запитів схожі), але отримані фактичні результати виявляться іншими.

select DISTINCT customerID
from orders o
join [order details] od
on o.OrderID = od.OrderID
where discount> 0.02

select customerID from orders o
where exists (
select *
from [order details] od
where o.OrderID = od.OrderID
and discount> 0.02
)

Різниця ефективності виконання цих запитів в тому, що OrderID, який визначає залежність між двома таблицями, не є ім'ям замовника. Другий запит поверне безліч імен замовника - одне для кожної позиції, отриманої замовником. Пробуйте додати стовпець OrderID в список SELECT, щоб побачити це.