【问题标题】:Speeding up SQL query with index on identity column or the searched column?使用标识列或搜索列上的索引加速 SQL 查询?
【发布时间】:2016-11-23 22:40:39
【问题描述】:

当我提取我的表时,我得到了这个。该表有一个 ID 列,它是一个标识列 (autoinc)。

然后还有可读的客户编号,理论上是唯一的,但该表到目前为止没有强制执行任何操作。

我的客户正在搜索客户编号而不是 ID。

我现在的问题是:我是否仍应在CUSTERMERNUMBER 列中添加索引(如果是集群/非集群?)以提高搜索速度?

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE Customer
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [CUSTOMERNUMBER] [nvarchar](50) NULL,
    -- other columns  

    CONSTRAINT [PK_Customer] 
       PRIMARY KEY CLUSTERED ([ID] ASC)
                   WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                         IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
                         ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

【问题讨论】:

  • 是的,索引会有所帮助。但是你不能让它聚集,因为你的主键已经是聚集索引。你真的需要在这里使用 nvarchar 吗?您是否打算将 ascii 字符集之外的字符作为客户编号的一部分?
  • 客户编号只是“345345453543534”,没有字母字符。

标签: sql-server indexing


【解决方案1】:

如果ID 字段在其他表中作为外键被引用,那么肯定将其保留为聚集索引,并在CUSTOMERNUMBER 上创建一个非聚集索引。

考虑不要只是CUSTOMERNUMBER 上创建索引,而是更进一步并在其上创建Unique Constraint(带有索引)。这将防止违反要求唯一 CUSTOMERNUMBER 的业务规则,并且还为数据库提供额外信息,可用于提高操作效率。

一如既往,先测试:

Alter Table Customer Add Constraint uCUSTOMERNUMBER Unique (CUSTOMERNUMBER);

(唯一约束的一个缺点是它创建的唯一索引不能include 附加列。如果需要包含,则可以选择唯一的非聚集索引。)

【讨论】:

  • 强制客户编号唯一是一件好事。我不需要额外的列与客户编号一起唯一。
【解决方案2】:

如果您的表格上的大部分搜索都是针对客户编号进行的,那么这可能是个好主意。您还可以在创建索引之前创建多个测试查询,并在创建索引后再次对索引运行查询,以查看索引是否确实提高了您的性能。

在决定是否应该将索引设置为聚簇或非聚簇时,您应该确定是否已经有一个聚簇索引(因为它们是在主键上自动创建的)以及这个新索引是否可以更好地用作主索引钥匙。如果是这样,您可能必须创建一些约束条件,以便客户编号必须是唯一的以保证搜索的正确性。

如果您有兴趣了解有关索引的更多信息,请随时查看我写的这篇文章: https://dataschool.com/learn/how-indexing-works

【讨论】:

    【解决方案3】:

    为客户编号创建唯一/非聚集索引是个好主意。但我们应该小心不要创建太多索引,尤其是在表很大且发生大量 DML 的情况下。

    【讨论】:

      猜你喜欢
      • 2012-08-08
      • 2015-08-31
      • 2014-02-13
      • 1970-01-01
      • 2013-07-27
      • 1970-01-01
      • 1970-01-01
      • 2011-04-24
      • 1970-01-01
      相关资源
      最近更新 更多