Sha*_*hay 5 sql sql-server indexing database-design data-structures
我有一个包含近850,000,000行的表.
该表包含以下字段:
[ID] [bigint] IDENTITY(1,1) NOT NULL,
[D1] [int] NOT NULL,
[D2] [int] NOT NULL,
[D3] [int] NOT NULL,
[D4] [int] NOT NULL,
[D5] [int] NOT NULL,
[D6] [int] NOT NULL,
[D7] [int] NOT NULL,
[D8] [int] NOT NULL,
[D9] [int] NOT NULL,
[A] [int] NOT NULL,
[Hb] [bit] NOT NULL,
Run Code Online (Sandbox Code Playgroud)
我对这个表的所有查询都是一样的 -
Select [D1-D9], [A] Where [Hb] = 0 AND [D1] <> x AND [D2] <> y AND [D3] = z,
等等....
每个查询将始终查询所有[D1-D9]字段并始终要求[Hb] = 0
查询示例:
SELECT [D1], [D2], [D3], [D4], [D5], [D6],[D7], [D8],[D9], [A]
from [myTable]
WHERE [D1] <> 8 AND [D2] <> 2 AND [D3] <> 5 AND [D4] = 8 AND [D5] = 2
AND [D6] = 5 AND [D7] = 5 AND [D8] = 3 AND [D9] = 4 AND [A] = 0 AND [Hb] = 0
Run Code Online (Sandbox Code Playgroud)
我该如何索引此表以获得最快的结果?
非常感谢
如果您的算法是确定性的(即 A = f(d1, d2, d3...d9)),那么您的 D 列与 Hb 组合构成一个密钥。尝试在所有 D 列和 Hb 上创建聚集复合索引,在 Hb 上进行分区以提高速度。您也可以考虑删除 ID 字段。
编辑:刚刚意识到我错过了 <> 条件。正如其他人提到的,这使事情变得更加困难。这里你真正想要使用的是位图索引,但据我所知 SQL Server 没有它们。您可能需要依赖各个列索引的良好配合。