Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 关于综合指数的建议_Sql Server_Tsql_Indexing_Sql Server 2012_Composite Index - Fatal编程技术网

Sql server 关于综合指数的建议

Sql server 关于综合指数的建议,sql-server,tsql,indexing,sql-server-2012,composite-index,Sql Server,Tsql,Indexing,Sql Server 2012,Composite Index,我有一个巨大的(数百万行)表,其中包含以下列: [When] datetime2(0), [What] tinyint, [Who] bigint 它基本上是一个事件表(“什么”)在某个时间(“什么时候”)发生在各个实体(“谁”)身上。“What”大约有10个不同的值,它是一个枚举。“谁”目前大约有10000个值 我希望能够查询这个表,询问一个或多个实体在特定时间内是否发生了某些事情。例如,在[When='2012-10-01'到'2012-11-01'之间,[What=0,1,2,3]是否发

我有一个巨大的(数百万行)表,其中包含以下列:

[When] datetime2(0),
[What] tinyint,
[Who] bigint
它基本上是一个事件表(“什么”)在某个时间(“什么时候”)发生在各个实体(“谁”)身上。“What”大约有10个不同的值,它是一个枚举。“谁”目前大约有10000个值

我希望能够查询这个表,询问一个或多个实体在特定时间内是否发生了某些事情。例如,在[When='2012-10-01'到'2012-11-01'之间,[What=0,1,2,3]是否发生在[Who=0,1,2,3]身上

我正在寻找关于如何最好地索引此表的建议。我相当肯定一个综合指数是一条路要走,但我不确定确切的配置。例如,列的顺序应该是什么?我读到“最有选择性”的列应该放在左边,我认为在这种情况下应该是[何时],[谁],[什么]。这是正确的吗

很抱歉,如果这个问题似乎含糊不清,但如果您有任何意见,我将不胜感激。我正在使用SQL Server 2012。

关于将最有选择性的列放在左侧的神话是废话-对不起

只有在使用n个最左边的参数时,复合索引才有用,例如,如果索引处于打开状态

(when, who, what)
然后,该索引可以回答关于

(when)
或大约

(when, who)
甚至大约

(when, who, what)
但是它不能回答有关的问题

(who, what)
(因为这里没有使用最左边的列)


<强>应该是是你要考虑的问题-以这样的方式排列列,这样你可以用这样一个复合索引回答你的大多数问题。

告诉我们你有哪些索引。然后运行一些查询并查看执行计划。这还取决于在典型日期范围内有多少事件。谢谢,这很有意义。从查询的角度来看,在我的场景中,列顺序似乎没有多大区别。那碎片呢?通常,新行的[When]值总是较高,但显然[Who]和[What]值不可预测。将[何时]作为第一列会减少碎片,还是——再次——没有真正的区别?再次感谢。在本例中,您按所有三列进行搜索,我不同意将最有选择性的列放在左侧是废话。@Barguast:有一个(希望/可能)稳定增长的第一列可能是有益的,因为它需要更少的“无序”插入,从而减少页面拆分。@Eduardo:这是一个有文献记载的(而且是非常持久的)神话,但事实并非如此。@marc_s:你是对的,我学到了一些非常有用的东西;谢谢你。