Управление дубликатами

Повышение производительности запросов в 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

Таблицы фруктов

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...