我有两个表,即 tbl_Small
和 tbl_Large
。
我将表存储在 Microsoft Azure 中,并从 Microsoft SQL Server 进行查询。
--表1:Tbl_Small
CREATE TABLE tbl_Small
(
cola int
);
INSERT INTO tbl_Small VALUES(1234),(123),(34);
--1000 rows
--表 2:tbl_Large
CREATE TABLE tbl_Large
(
ID bigint identity(1,1),
cola int,
colb int,
colc varchar(100)
);
INSERT INTO tbl_Large(cola,colb,colc) VALUES(0,140,'A'),(150,200,'C'),(1000,15000,'D');
--30 million rows
我想通过使用 Between 条件连接小表来获取大表详细信息。
我的尝试:
- 已在 tbl_Small(cola) 上创建
NONCLUSTERED
索引。 - 已在 tbl_Large(cola) 和 tbl_Large(colb) 上创建
NONCLUSTERED
索引。
查询:
SELECT s.cola as [Input],l.cola,l.colb,l.colc
FROM tbl_Large AS l
INNER JOIN tbl_Small s ON s.cola BETWEEN l.cola and l.colb
注意:上述查询的执行时间超过 10 分钟。
编辑:按照答案中所述在所有列上添加非聚集索引后,我得到了以下执行计划。
执行时间:5分钟
DTU 百分比图:
最佳答案
tbl_Large 上的索引需要覆盖,即它包含查询所需的所有数据。如果您只是在一列上创建索引,那么要获取所有数据,服务器将需要使用该索引和另一个源来获取另一列数据。它很可能不会发现额外的工作值得,并且会忽略索引。
对于 tbl_Large,在 col a 和 col b 上创建索引,并包含 col c 的值,因此代码如下所示:
CREATE NONCLUSTERED INDEX IX_tbl_Large_cola_colb on tbl_Large (cola, colb)
INCLUDE (colc)
关于sql - 使用 BETWEEN 条件对 INNER JOIN 进行性能调整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58832990/