cur*_*Boy 4 sql-server indexing sql-server-2008
假设我有2个存储过程和1个表.
Table_Aproc1和proc2当我运行proc1with执行计划时,它建议我为Table_Afor tblID(这不是主键)列创建索引并建议包含column_A和column_B.
而proc2建议创建一个索引Table_A再次,对于tblID列,但这次它意味着包括column_B和column_C(它暗示column_C,而不是column_A在此过程中)
所以我的问题是,如果我创建了一个包含所有建议列的索引,例如:
CREATE NONCLUSTERED INDEX indexTest
ON [dbo].[Table_A] ([tblID])
INCLUDE ([column_A],[column_B],[column_C])
Run Code Online (Sandbox Code Playgroud)
这会导致任何性能问题吗?
收集INCLUDE列有什么不利之处吗?
或者我应该创建2个不同的索引:
CREATE NONCLUSTERED INDEX indexTest_1
ON [dbo].[Table_A] ([tblID])
INCLUDE ([column_A],[column_B])
CREATE NONCLUSTERED INDEX indexTest_2
ON [dbo].[Table_A] ([tblID])
INCLUDE ([column_B],[column_C])
Run Code Online (Sandbox Code Playgroud)
更新:我想在这个问题上再补充一点.
如果我对主要字段做同样的事情:
我的意思是,
proc-1建议在tblID字段上创建索引.并且proc-2建议在tblID和上创建一个索引column_A.
如果我把它们收集起来:
CREATE NONCLUSTERED INDEX indexTest_3
ON [dbo].[Table_A] ([tblID],[column_A])
INCLUDE ([[column_B])
Run Code Online (Sandbox Code Playgroud)
这会导致性能问题吗?或者我应该为建议的主要字段创建2个单独的索引?
绝对创建一个包含所有三列的索引!
您拥有的索引越少越好 - 索引维护是成本因素 - 更多索引需要更多维护.
并且包含的列仅包含在索引的叶级中 - 对性能的影响非常小.
更新:如果您有一个索引(tblID, column_A),则可以将此用于仅 tblID在其WHERE子句中使用的查询,或者您可以将其用于在其WHERE子句中同时使用这两列的查询.
但是:对于仅在其子句中使用的查询,此索引无效.如果给定查询使用索引中指定的n个最左列,则复合索引(由多列组成的索引)才有用. column_AWHERE
所以你的情况,一个查询似乎预示着tblID,而其他的需求(tblID, column_A)-所以是的,在这种情况下,我认为一个单一的指标上(tblID, column_A)会为这两个查询工作.