管理重复项

改进 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 中的查询性能

重复的水果

 

 

 

  • OrangeStrawberry 重复

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 中的查询性能

Passons à la pratique !

改进 SQL Server 中的查询性能

Preparing Video For Download...