Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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 左子集重复索引_Sql_Sql Server_Database_Sql Server 2008_Indexing - Fatal编程技术网

Sql 左子集重复索引

Sql 左子集重复索引,sql,sql-server,database,sql-server-2008,indexing,Sql,Sql Server,Database,Sql Server 2008,Indexing,我正在读一份关于重复索引的文件。在这个例子中,它显示了左子集重复索引,它的建议是,如果我有如下索引,我应该考虑从索引中删除TreReFID字段,因为SQLServer将始终使用第一个索引。p> 有人能给我解释一下背后的逻辑吗 Index1[DATAAREAID]、[ITEMID]、[DATESTATUS] Index2[DATAAREAID]、[ITEMID]、[DATESTATUS]、[TRANSREFID]*我会说相反的话。也就是说,给定您定义的两个索引,第一个可以满足的所有查询都可以由第二

我正在读一份关于重复索引的文件。在这个例子中,它显示了左子集重复索引,它的建议是,如果我有如下索引,我应该考虑从索引中删除TreReFID字段,因为SQLServer将始终使用第一个索引。p> 有人能给我解释一下背后的逻辑吗

Index1[DATAAREAID]、[ITEMID]、[DATESTATUS]


Index2[DATAAREAID]、[ITEMID]、[DATESTATUS]、[TRANSREFID]*

我会说相反的话。也就是说,给定您定义的两个索引,第一个可以满足的所有查询都可以由第二个满足,但相反的情况并非如此。也就是说,如果您有一个where子句,该子句在所有[DATAAREAID]、[ITEMID]、[DATESTATUS]和[TRANSREFID]上都有谓词,那么第一个索引将把[TRANSFERID]作为剩余谓词(即无法查找的谓词),并且必须计算前三个上匹配的所有行,以查看第四个是否匹配


现在,也就是说,在某些情况下,两个索引都有意义!考虑一下,通过第二个索引,正常的OLTP工作负载得到了很好的服务,但是它是一个很宽的索引。您还有一个不经常运行但对时间要求很高的进程,该进程将能够使用第一个索引,因为第四列中没有索引,所以索引很窄。索引是一门艺术。

Sql server将始终使用第一个索引
。。。呃,我不相信这句话是真的。但无论如何,应该使用什么索引取决于在表上运行的查询。因此,我首先定义了索引2,然后SQL server将使用索引2。这是正确的理解。我在这方面的知识不是很丰富,但我相信如果SQL有两个执行相同操作的索引选项,那么它选择哪一个就没有真正的道理了。可以找到一些关于这方面的讨论。