相关疑难解决方法(0)

在可为空的复合索引上重新加入范围搜索?

对于以下架构和示例数据

CREATE TABLE T
  (
     A INT NULL,
     B INT NOT NULL IDENTITY,
     C CHAR(8000) NULL,
     UNIQUE CLUSTERED (A, B)
  )

INSERT INTO T
            (A)
SELECT NULLIF(( ( ROW_NUMBER() OVER (ORDER BY @@SPID) - 1 ) / 1003 ), 0)
FROM   master..spt_values 
Run Code Online (Sandbox Code Playgroud)

应用程序正在以 1,000 个行块的聚集索引顺序处理该表中的行。

从以下查询中检索前 1,000 行。

SELECT TOP 1000 *
FROM   T
ORDER  BY A, B 
Run Code Online (Sandbox Code Playgroud)

该组的最后一行在下面

+------+------+
|  A   |  B   |
+------+------+
| NULL | 1000 |
+------+------+
Run Code Online (Sandbox Code Playgroud)

有什么方法可以编写一个查询,该查询只查找该复合索引键,然后跟随它来检索下一个 1000 行块?

/*Pseudo Syntax*/
SELECT TOP 1000 …
Run Code Online (Sandbox Code Playgroud)

index sql-server

14
推荐指数
1
解决办法
1658
查看次数

如何构造谓词以触发具有组合键的特定记录搜索的聚集索引?

我有一个包含 4 部分复合聚集主键(A、B、C、D)的表,按 A、B、C、D 排序。

我必须通过获取 N 条记录来批量遍历整个表,然后检查的最后一个键(K1、K2、K3、K4)之后的任何值开始获取接下来的 N 条记录。键值不连续。

我正在尝试构造谓词来寻找下一批记录,给定带有复合键(K1,K2,K3,K4)的最后读取记录。

如果 ID 不是复合的,我只需运行一个 select 语句,例如“从表中选择前 N 个,其中 ID > K1”。然而,因为它是一个由 4 部分组成的复合键,所以我必须构造一个特殊的谓词来处理 D 可以小于 K4 的事实,只要 A、B 和 C 中的任何一个或全部大于 K1、K2和K3。

在某些数据库引擎中,我知道可以使用如下设置语法进行此类复合键比较:

where (A,B,C,D) > (K1,K2,K3,K4)

问题1: SQL Server支持上述集合比较语法吗?

如果没有,那么我怀疑我必须像这样构造谓词:

一把钥匙 两把钥匙 三把钥匙 四把钥匙
其中 (A > K1)
按 A 排序
其中 (A = K1 且 B > K2)
OR (A > K1)
按 A、B 排序
其中 (A = K1 且 B = K2 且 C > …

sql-server

10
推荐指数
2
解决办法
626
查看次数

重写T-SQL where子句导致性能问题

我有一个查询,其中以下where子句需要花费大量时间来执行,因为基础表中有大量数据:

环境:SQL Server 2022

WHERE条款:

DATEFROMPARTS(dyear, dmonth, dday) 
    BETWEEN DATEADD(m, -2, DATEADD(mm, DATEDIFF(m, 0, GETDATE()), 0))  
        AND CAST(CAST(DATEADD(d, -2, GETDATE()) AS DATE) AS DATETIME)
Run Code Online (Sandbox Code Playgroud)

dyear, dmonth, dday由于使用了函数,它当前不使用索引(所有三个 int 列)。

如何重写它以便可以使用底层索引来使查询运行得更快?

抱歉,由于安全限制,我无法共享执行计划。

数据存储格式由第三方定义,不受我们控制。例如,不能选择将计算列添加到随后可以建立索引的表中。

sql-server query-performance sql-server-2022

5
推荐指数
2
解决办法
2509
查看次数