【问题标题】:Performance tuning on INNER JOIN with BETWEEN Condition使用 BETWEEN 条件对 INNER JOIN 进行性能调整
【发布时间】:2019-11-13 08:26:49
【问题描述】:

我有两张桌子,即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 分钟

DTU 百分比图:

【问题讨论】:

  • 执行计划怎么说?
  • @HoneyBadger,在帖子中添加了执行计划。
  • Azure SQL 数据库的层级是什么?能否请您先将小表放在联接而不是大表上?
  • @AlbertoMorillo、edition = Standardservice_objective = S1,我确实为 JOIN 交换了表,但没有用。
  • Tier S1 可能不够用。请在运行这些查询时查看 DTU 图,检查门户中的 DTU 图。如果 DTU 图达到 100%,则可能会发生节流

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


【解决方案1】:

您的 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)

【讨论】:

    猜你喜欢
    • 2019-05-17
    • 2017-05-07
    • 2015-07-23
    • 2015-02-03
    • 1970-01-01
    • 2019-02-19
    • 2014-03-13
    • 2019-09-17
    • 1970-01-01
    相关资源
    最近更新 更多