【问题标题】:Will SELECT become slower if I include a second non-indexed column in the query?如果我在查询中包含第二个非索引列,SELECT 会变慢吗?
【发布时间】:2017-09-18 02:45:41
【问题描述】:

假设我有下表:

测试:

ID | Name | Ver | Col3| Col4 | ... 
01 | ABC  |   2 | xxx | yyy  | ...
02 | DEF  |   8 | xxx | yyy  | ...
03 | DEF  |   8 | xxx | yyy  | ...
...

ID 列是主键唯一键聚集索引 Ver 列没什么特别的。

到目前为止,我通过以下方式进行了 SELECT 查询:

SELECT (NAME, Col1, Col2) WHERE ID = '01'

下一个版本将包含 SELECT 查询,方式如下:

SELECT (NAME, Col1, Col2) WHERE ID = '01' AND Ver = '8'

为什么?因为我打算在系统的UPDATEDELETE查询中包含这个查询,这样可以确保不会有并发的编辑冲突,因为它只能更新其中IDVer 匹配,如果实体在此期间发生更改,则 SELECT 部分将保护实体免于更新,因为它不会返回任何内容。 (无需更新或删除)


问题

此更改是否会影响我的数据库性能,或者它不会影响查询中的Ver 列,因为选择中的列之一是唯一主键 .

如果它会影响记录检索的性能,我应该将VerID 一起包含在聚集索引 中吗? Ver 应该是第二个索引吗?

欢迎提供事实和意见。

【问题讨论】:

    标签: sql-server database database-performance


    【解决方案1】:

    您需要尝试一下并查看查询计划以确保,但我的感觉是:

    Ver 不需要在索引中。当 SQL Server 生成计划时,它足够聪明地看到 ID 是唯一的。因此,它将使用ID = '1' 获取记录,然后通过Ver = '8' 过滤该单个记录。由于这部分只作用于零或一条记录,因此不需要索引。

    【讨论】:

    • 请注意,Ver = '8' 过滤不会影响性能,因为 ID 列上的索引是聚集的,因此会存储所有列的值。如果 ID 上的索引是非聚集的,它可能会产生额外的键查找
    • 听起来不错。有任何可靠和/或官方消息来源说明这一点吗?谢谢!
    • @DDan,您可以查看docs.microsoft.com/en-us/sql/relational-databases/indexes/… 以确认聚集索引存储了数据行。要了解为什么这意味着不需要额外查找,您需要了解覆盖索引,但我找不到它们的官方来源。
    猜你喜欢
    • 2013-04-03
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 2022-06-13
    • 1970-01-01
    • 2015-02-06
    相关资源
    最近更新 更多