Керування дублікатами

Покращення продуктивності запитів у SQL Server

Dean Smith

Founder, Atamai Analytics

Запит повертає дублікати

SELECT PlayerName,
       Team
FROM PlayerStats; 
PlayerName Team
... ...
Emmanuel Mudiay DEN
Emmanuel Mudiay NYK
Enes Kanter NYK
Eric Bledsoe PHO
Eric Bledsoe MIL
... ...
Покращення продуктивності запитів у SQL Server

Вилучення дублікатів за допомогою DISTINCT()

SELECT DISTINCT(PlayerName)
FROM PlayerStats;
PlayerName
...
Emmanuel Mudiay
Enes Kanter
Eric Bledsoe
Eric Gordon
Eric Moreland
...
Покращення продуктивності запитів у SQL Server

GROUP BY замість DISTINCT()

SELECT DISTINCT(PlayerName)
FROM PlayerStats;
SELECT PlayerName
FROM PlayerStats 
GROUP BY PlayerName;
Покращення продуктивності запитів у SQL Server

GROUP BY замість DISTINCT()

SELECT DISTINCT(PlayerName)
FROM PlayerStats;
SELECT PlayerName
FROM PlayerStats 
GROUP BY PlayerName;
SELECT PlayerName,
    COUNT(Team) AS TeamsPlayedFor
FROM PlayerStats 
GROUP BY PlayerName;
PlayerName TeamsPlayedFor
... ...
Emmanuel Mudiay 2
Enes Kanter 1
Eric Bledsoe 2
Eric Gordon 1
Eric Moreland 1
... ...
Покращення продуктивності запитів у SQL Server

Чи є інший спосіб?

SELECT PlayerName
FROM Players;
PlayerName
...
Emmanuel Mudiay
Enes Kanter
Eric Bledsoe
Eric Gordon
Eric Moreland
...
Покращення продуктивності запитів у SQL Server

Таблиці Fruits

Fruits1

FruitName FruitType
Grapefruit Citrus
Orange Citrus
Peach Stone
Strawberry Berry

Fruits2

FruitName FruitType
Marionberry Berry
Orange Citrus
Plum Stone
Strawberry Berry
Покращення продуктивності запитів у SQL Server

Дублікати фруктів

 

 

 

  • Orange і Strawberry задубльовані

Fruits1 додано до Fruits2

FruitName FruitType
... ...
Orange Citrus
Orange Citrus
Plum Stone
Strawberry Berry
Strawberry Berry
Покращення продуктивності запитів у SQL Server

Прибрати дублікати за допомогою UNION

SELECT FruitName, FruitType
FROM Fruits1

UNION

SELECT FruitName, FruitType
FROM Fruits2
FruitName FruitType
Grapefruit Citrus
Orange Citrus
Peach Stone
Strawberry Berry
Marionberry Berry
Plum Stone
Покращення продуктивності запитів у SQL Server

А як щодо UNION ALL?

 

  • UNION ALL
    • додає рядки з однієї чи кількох таблиць і _не_ прибирає дублікати

 

  • UNION
    • додає рядки з однієї чи кількох таблиць і прибирає дублікати
Покращення продуктивності запитів у SQL Server

DISTINCT() і UNION

  • Використовуйте обережно
  • Може використовувати внутрішнє сортування для порядкування й перевірки дублікатів
  • Може збільшити час виконання запиту
Покращення продуктивності запитів у SQL Server

Використання DISTINCT()

Перш ніж використовувати DISTINCT(), запитайте себе:

  • Чи є альтернативний спосіб?
    • натомість використати таблицю з унікальним ключем
  • Чи запит використовує агрегатну функцію?
    • згрупувати за допомогою GROUP BY
Покращення продуктивності запитів у SQL Server

Використання UNION

Перш ніж використовувати UNION, запитайте себе:

  • Чи прийнятні дублікати рядків?
  • Чи спричинить об'єднання запитів дублікати?
  • Розгляньте UNION ALL, якщо дублікати прийнятні або їх не буде створено
Покращення продуктивності запитів у SQL Server

Давайте потренуємось!

Покращення продуктивності запитів у SQL Server

Preparing Video For Download...