在 where 子句中重写谓词

SQL*_*DBA 2 sql-server t-sql sql-server-2012

如何where col % 5 = 4在 SQL Server 中重写。重写这个的原因是因为我根据这个条件从表中选择了一些列。因为 % 用于导致索引扫描而不是搜索的地方。这个你能帮我吗。

Cod*_*ior 6

最简单的方法是使用 mod 计算将计算列添加到表中,然后创建索引或将其添加到现有索引中。

例如:

-- Test table and values
CREATE TABLE #Test (col integer PRIMARY KEY);

INSERT #Test (col)
VALUES (1), (2), (3), (4), (5);

-- Original query (scan)
SELECT T.col 
FROM #Test AS T
WHERE col % 5 = 4;

-- Add computed column (no need for persisted)
ALTER TABLE #Test
ADD col_mod5 AS col % 5;

-- Index computed column
CREATE INDEX i
ON #Test (col_mod5)
INCLUDE (col);

-- Index seek
SELECT T.col 
FROM #Test AS T
WHERE col % 5 = 4;

-- Tidy up
DROP TABLE #Test;
Run Code Online (Sandbox Code Playgroud)

计划

另一种选择是创建一个索引视图,从表中选择您需要的内容,加上一个带有 mod 计算的列,并在您的查询中引用它。为此,您可以将视图声明为模式绑定,然后在其上创建一个聚集索引,就好像它是一个表一样。

如果您使用的是企业版,则可能无需更改查询即可使用该视图。否则,您将需要显式引用视图并使用NOEXPAND提示。索引计算列是重量较轻的解决方案。