改进 SQL Server 中的查询性能
Dean Smith
Founder, Atamai Analytics



Select ps.Team, count(p.PlayerName)
As NonNthAmerPlayers from
PlayerStats ps inner
join (select PlayerName FROM Players
WHERE Country <> 'USA' Or Country
<> 'Canada' )
p on p.PlayerName = ps.PlayerName
group BY ps.Team
having Count(p.PlayerName)
>=24 Order by NonNthAmerPlayers desc
| Team | NonNthAmerPlayers |
|---|---|
| HOU | 24 |
| LAL | 24 |
| MEM | 24 |
| MIL | 24 |
SELECT、FROM、WHERE 等ON 语句AND/OR 条件AS 起别名原始
Select ps.Team, count(p.PlayerName)
As NonNthAmerPlayers from
PlayerStats ps inner
join (select PlayerName FROM Players
WHERE Country <> 'USA' Or Country
<> 'Canada' )
p on p.PlayerName = ps.PlayerName
group BY ps.Team
having Count(p.PlayerName)
>=24 Order by NonNthAmerPlayers desc
优化为
SELECT ps.Team,
COUNT(p.PlayerName) NonNthAmerPlayers
FROM PlayerStats ps
INNER JOIN
(SELECT PlayerName
FROM Players
WHERE Country <> 'USA'
OR Country <> 'Canada' ) p
ON p.PlayerName = ps.PlayerName
GROUP BY ps.Team
HAVING COUNT(p.PlayerName) >=24
ORDER BY NonNthAmerPlayers DESC;
/* 返回拥有 24 名或以上非北美球员的 NBA 球队列表。 */SELECT ps.Team, COUNT(p.PlayerName) NonNthAmerPlayers FROM PlayerStats ps INNER JOIN (SELECT PlayerName FROM Players WHERE Country <> 'USA' OR Country <> 'Canada' ) p ON p.PlayerName = ps.PlayerName GROUP BY ps.Team HAVING COUNT(p.PlayerName) >=24 ORDER BY NonNthAmerPlayers DESC;
使用 /* 与 */ 注释一段(块)代码或文本
/* 返回拥有 24 名或以上非北美球员的 NBA 球队列表。 */SELECT ps.Team, COUNT(p.PlayerName) NonNthAmerPlayers FROM PlayerStats ps INNER JOIN (SELECT PlayerName FROM Players WHERE Country <> 'USA' OR Country <> 'Canada' ) p ON p.PlayerName = ps.PlayerName GROUP BY ps.Team HAVING COUNT(p.PlayerName) >=24 ORDER BY NonNthAmerPlayers DESC;
使用 /* 与 */ 注释一段(块)代码或文本
| Team | NonNthAmerPlayers |
|---|---|
| HOU | 24 |
| LAL | 24 |
| MEM | 24 |
| MIL | 24 |
使用 -- 注释单独一行代码或文本
SELECT ps.Team,
COUNT(p.PlayerName) NonNthAmerPlayers
FROM PlayerStats ps
INNER JOIN
(SELECT PlayerName
FROM Players
WHERE Country <> 'USA'
OR Country <> 'Canada' ) p
ON p.PlayerName = ps.PlayerName
GROUP BY ps.Team
HAVING COUNT(p.PlayerName) >=24
ORDER BY NonNthAmerPlayers DESC;
使用 -- 注释单独一行代码或文本
SELECT ps.Team,
COUNT(p.PlayerName) NonNthAmerPlayers -- 球员数量
FROM PlayerStats ps
INNER JOIN
(SELECT PlayerName
FROM Players
WHERE Country <> 'USA'
OR Country <> 'Canada' ) p -- 缩进的子查询
ON p.PlayerName = ps.PlayerName
GROUP BY ps.Team
HAVING COUNT(p.PlayerName) >=24
ORDER BY NonNthAmerPlayers DESC;
使用 -- 注释单独一行代码或文本
SELECT ps.Team,
COUNT(p.PlayerName) NonNthAmerPlayers -- 球员数量
FROM PlayerStats ps
-- 从这里开始 INNER JOIN
INNER JOIN
(SELECT PlayerName
FROM Players
WHERE Country <> 'USA'
OR Country <> 'Canada' ) p -- 缩进的子查询
ON p.PlayerName = ps.PlayerName
GROUP BY ps.Team
HAVING COUNT(p.PlayerName) >=24
-- 移除 ORDER BY,非必需
ORDER BY NonNthAmerPlayers DESC;
INNER JOIN 前留出分隔
ORDER BY 的必要性使用 -- 注释单独一行代码或文本
SELECT ps.Team,
COUNT(p.PlayerName) NonNthAmerPlayers -- 球员数量
FROM PlayerStats ps
-- 从这里开始 INNER JOIN
INNER JOIN
(SELECT PlayerName
FROM Players
WHERE Country <> 'USA'
OR Country <> 'Canada' ) p -- 缩进的子查询
ON p.PlayerName = ps.PlayerName
GROUP BY ps.Team
HAVING COUNT(p.PlayerName) >=24;
-- 移除 ORDER BY,非必需
-- ORDER BY NonNthAmerPlayers DESC
ORDER BY 语句注释掉改进 SQL Server 中的查询性能