使用BETWEEN条件对INNER JOIN进行性能调整

我有两个表,分别是tbl_Smalltbl_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 

我想通过在条件之间加入小表来获取大表的详细信息。

我的尝试

  1. 在tbl_Small(cola)上创建了NONCLUSTERED索引。
  2. 在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分钟

使用BETWEEN条件对INNER JOIN进行性能调整

DTU百分比图:

使用BETWEEN条件对INNER JOIN进行性能调整

xzsytc 回答:使用BETWEEN条件对INNER JOIN进行性能调整

您在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)
本文链接:https://www.f2er.com/3111790.html

大家都在问