【发布时间】:2021-08-02 05:49:45
【问题描述】:
我有三张桌子:
表 A(大约 500 000 条记录)
| ID | ID_B | Text |
|---|---|---|
| 1 | 10 | bla |
| 2 | 10 | blabla |
| 3 | 30 | blablabla |
表 B(大约 100 000 条记录)
| ID | Text |
|---|---|
| 10 | blab |
| 20 | blaba |
| 30 | blabb |
表 C(大约 600 000 条记录)
| ID | ID_A |
|---|---|
| 1 | 1 |
| 2 | 1 |
| 3 | 2 |
现在我想加入这三个表:
SELECT A.Text
FROM A
JOIN B ON B.ID = A.ID_B
JOIN C ON C.ID_A = A.ID
我在表 A 上创建了聚集主键索引 (ID) 和非聚集索引 (ID_B)。
根据执行计划,一开始使用聚集索引连接A和C。 之后,结果集按列 ID_B 排序,然后用于与 B 的合并连接。
排序操作是最昂贵的。 (约占总成本的 40%)
有没有办法在整体性能方面优化这个查询?
【问题讨论】:
-
当您只想要一张表中的一列时,为什么要
JOIN? -
使用“粘贴计划”向我们展示您的执行计划
-
@Larnu 可能是只有在存在 fk 关系的情况下才应该包含结果(也可以通过使用 exists 来完成)。鉴于信息有限,显然只是我的猜测。
-
@Larnu:因为我不需要 A 中的所有行
-
请参阅paste the plan 了解在您的问题中包含执行计划的更好方法。请阅读this,了解一些改进问题的技巧。
标签: sql sql-server performance tsql join