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

标签 sql sql-server azure azure-sql-database

我有两个表,即 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 

我想通过使用 Between 条件连接小表来获取大表详细信息。

我的尝试:

  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分钟

enter image description here

DTU 百分比图:

enter image description here

最佳答案

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/

相关文章:

sql - 具有基于 GROUPING SETS 的数据集的展开-折叠报告

sql - SQL缓存依赖关系的性能问题

SQL Server 2008 R2 Performance Studio - 数据收集有效但查看报告抛出 'Failed to connect...' 18456 错误

Azure 数据工厂数据集动态文件夹路径

sql - PL/SQL 函数编译错误

php - mysql 查询 if 语句

sql-server - 更改表中的列顺序时出现问题 (SQL Server 2008)

sql-server - 如何在 SQL 循环中 INSERT INTO 表 300 次?

azure - Azure Synapse 中的 Openrowset 语法问题

python - Azure Rest API 用于 VM 还原的 resourcesRestoreRequest 语法