gpt4 book ai didi

sql-server - 当 "include"列不同时为同一列创建索引的正确方法

转载 作者:行者123 更新时间:2023-12-03 01:53:52 24 4
gpt4 key购买 nike

假设我有 2 个存储过程和 1 个表。

  • 表名称:Table_A
  • 过程名称:proc1proc2

当我使用执行计划运行 proc1 时,它建议我为 tblIDTable_A 创建索引(这不是主索引) Key) 列,并建议包含 column_Acolumn_B

并且proc2建议再次为Table_AtblID列创建索引,但这次建议包含column_B column_C(在此过程中建议使用 column_C 而不是 column_A)

所以我的问题是,如果我创建了一个包含所有建议列的索引,例如:

CREATE NONCLUSTERED INDEX indexTest
ON [dbo].[Table_A] ([tblID])
INCLUDE ([column_A],[column_B],[column_C])

这会导致任何性能问题吗?

收集 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])

更新:我想在此问题中再添加一件事。

如果我对主要字段也做同样的事情:

我的意思是,

proc-1 建议在 tblID 字段上创建索引。 proc-2 建议在 tblIDcolumn_A 上创建索引。

如果我将它们收集为:

 CREATE NONCLUSTERED INDEX indexTest_3
ON [dbo].[Table_A] ([tblID],[column_A])
INCLUDE ([[column_B])

这会导致性能问题吗?或者我应该为建议的主要字段创建 2 个单独的索引吗?

最佳答案

一定要创建一个包含所有三列的索引!

索引越少越好 - 索引维护是一个成本因素 - 更多索引需要更多维护。

并且包含的​​列仅包含在索引的叶级中 - 对性能的影响非常小。

更新:如果您在 (tblID, column_A) 上有一个索引,那么您可以将其用于使用only tblID 的查询在他们的 WHERE子句,或者您可以将其用于使用 WHERE 中的两列的查询条款。

但是:对于使用 column_A 的查询来说,此索引无用在他们的 WHERE条款。仅当给定查询使用索引中指定的最左边的 n 列时,复合索引(由多个列组成的索引)才有用。

因此,在您的情况下,一个查询似乎表明 tblID ,而其他需要(tblID, column_A) - 所以是的,在这种情况下,我认为 (tblID, column_A) 上有一个单一索引对于这两个查询都适用。

关于sql-server - 当 "include"列不同时为同一列创建索引的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23501707/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com