在庞大的数据库中索引简单查询

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)

我该如何索引此表以获得最快的结果?

非常感谢

dat*_*uck 0

如果您的算法是确定性的(即 A = f(d1, d2, d3...d9)),那么您的 D 列与 Hb 组合构成一个密钥。尝试在所有 D 列和 Hb 上创建聚集复合索引,在 Hb 上进行分区以提高速度。您也可以考虑删除 ID 字段。

编辑:刚刚意识到我错过了 <> 条件。正如其他人提到的,这使事情变得更加困难。这里你真正想要使用的是位图索引,但据我所知 SQL Server 没有它们。您可能需要依赖各个列索引的良好配合。