对于以下架构和示例数据
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) 我有一个包含 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 > … |
我有一个查询,其中以下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 列)。
如何重写它以便可以使用底层索引来使查询运行得更快?
抱歉,由于安全限制,我无法共享执行计划。
数据存储格式由第三方定义,不受我们控制。例如,不能选择将计算列添加到随后可以建立索引的表中。