Mad*_*dan 5 sql-server index-tuning
在下面的查询中,在连接条件中使用的列上使用索引有什么好处?
select * from table_a
inner join table_b on
table_a.col1 = table_b.col1 and
table_a.col2 = table_b.col2
Run Code Online (Sandbox Code Playgroud)
在上面的join中,是否有利于索引表 table_a(col1,col2)或表table_b(col1,col2)中列的顺序是否影响性能?
如果假设有一个索引table_b(col1,col2)。这是否意味着我们需要按如下方式更改查询?
select * from table_a
inner join table_b on
table_b.col1 = table_a.col1 and
table_b.col2 = table_a.col2
Run Code Online (Sandbox Code Playgroud)
B 树索引提供三个主要好处:
如果没有有用的索引,优化器的主要连接策略是hash join,其中来自较小表的连接键用于构建哈希表,然后来自较大表的连接键用于探测该哈希表以进行匹配。散列连接需要内存来保存完整的散列表。
使用有用的索引,优化器还可以考虑索引嵌套循环连接或合并连接策略:
这种物理连接策略主要利用上面的好处#1。它从较小的表中读取,然后根据连接键查找较大表上的索引。对于 equi-join,索引键顺序并不重要。寻求(col1, col2)可能的索引键是否(col1, col2)还是(col2, col1)。
对于您的示例,任一表上的索引(col1, col2)或(col2, col1)表的索引将启用索引嵌套循环连接策略。理想情况下,索引应位于较大的表上。
这种物理连接主要使用上面的好处#2(索引顺序)。索引必须包括所有连接列,两个表上的键顺序相同。合并连接 on(col1, col2)可以使用(col1, col2)或上的索引(col2, col1),但两个表的键顺序必须相同。
当至少一个输入在连接键上是唯一的时,合并连接是最有效的。
对于您的示例,需要在两个表上(col1, col2)或(col2, col1)两个表上建立索引。索引需要在两者上具有相同的键顺序,理想情况下,对于至少一个表,索引在这些列上应该是唯一的。
db<>fiddle 演示ON子句谓词的文本顺序并不重要。以下是完全等效的。您使用哪种纯粹是风格问题:
-- I prefer this style
SELECT *
FROM dbo.table_a AS TA
JOIN dbo.table_b AS TB
ON TB.col1 = TA.col1
AND TB.col2 = TA.col2;
SELECT *
FROM dbo.table_a AS TA
JOIN dbo.table_b AS TB
ON TA.col1 = TB.col1
AND TA.col2 = TB.col2;
Run Code Online (Sandbox Code Playgroud)
更一般地说,索引如何影响物理连接选择只是等式的一部分。索引可用于查询中的其他(非连接)谓词,以及其他操作,如聚合、窗口化和最终呈现顺序。
平衡整个查询和工作负载中所有查询的索引有用性与维护这些索引的成本是数据库管理和调优艺术的重要组成部分。
| 归档时间: |
|
| 查看次数: |
18537 次 |
| 最近记录: |