基于 WHERE 子句中的按位比较,索引列以进行有效查找的最佳方法是什么,例如
SELECT ID, FLAGS, NAME FROM TABLE WHERE FLAGS & 4 = 4
我在 SQL Server 2012 环境中。
我知道在这种类型的查询中不会使用 FLAGS 列上的索引。
我知道另一种选择是将 FLAGS 列分成单独的列,但我想避免这种情况,因为在某些情况下,这意味着 25+ 个新列,每个列都需要索引组合来支持常见查询。
有什么方法可以索引单个列,以便按位查询更有效?
我尝试使用下面 dudu 建议的带有索引的计算列,但是当我在具有聚集索引的表上使用时,并开始选择列(而不仅仅是 select count(*) 它不再使用该索引新的计算列。
SELECT
*
INTO
MYTABLE
FROM
(
SELECT 'A' COL_A, 'A' COL_B, CAST(129 AS INT) FLAGS UNION
SELECT 'B' COL_A, 'D' COL_B, CAST(129 AS INT) FLAGS UNION
SELECT 'C' COL_A, 'S' COL_B, CAST(129 AS INT) FLAGS UNION
SELECT 'D' COL_A, 'F' COL_B, CAST(129 AS INT) FLAGS UNION
SELECT 'E' COL_A, 'T' COL_B, CAST(128 AS INT) FLAGS UNION
SELECT 'F' COL_A, 'D' COL_B, CAST(128 AS INT) FLAGS UNION
SELECT 'G' COL_A, 'D' COL_B, CAST(128 AS INT) FLAGS UNION
SELECT 'H' COL_A, 'X' COL_B, CAST(128 AS INT) FLAGS
) SRC
CREATE CLUSTERED INDEX IX_CLU_A ON MYTABLE(COL_A)
ALTER TABLE MYTABLE ADD FLAG_BIT_1 AS (CAST ((FLAGS & 1) AS BIT))
CREATE INDEX MYTABLE_IX_FLAG_BIT_1 ON MYTABLE (FLAG_BIT_1)
SELECT * FROM MYTABLE WHERE FLAGS & 1 = 1
SELECT * FROM MYTABLE WHERE FLAG_BIT_1 = 1
SELECT COUNT(*) FROM MYTABLE WHERE FLAGS & 1 = 1
SELECT COUNT(*) FROM MYTABLE WHERE FLAG_BIT_1 = 1
计算(AKA 虚拟)列的索引
演示