2016-11-23 25 views
1

當我提取我的表,我得到這個。該表有一個ID列,它是一個標識列(autoinc)。使用標識列或搜索列上的索引加速SQL查詢?

然後仍然有可讀的客戶號碼,這在理論上是獨一無二的,但該表迄今沒有執行任何操作。

我的客戶正在搜索客戶號碼而不是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 
+1

是的索引將有所幫助。但是您不能將它聚集在一起,因爲您的主鍵已經是聚簇索引。你真的需要在這裏使用nvarchar嗎?您是否打算將ascii字符集之外的字符作爲客戶編號的一部分? –

+0

customernumber只是「345345453543534」沒有字母的字符。 – Elisabeth

回答

2

如果ID字段在其他表的外鍵引用然後離開,作爲肯定的聚集索引,並在CUSTOMERNUMBER創建一個非聚集索引。

不考慮只是創建索引CUSTOMERNUMBER但進一步創建一個Unique Constraint(它帶有索引)。這將防止違反要求唯一CUSTOMERNUMBER的業務規則,並且還向數據庫提供了可用於使操作更高效的附加信息。

與往常一樣,測試第一:

Alter Table Customer Add Constraint uCUSTOMERNUMBER Unique (CUSTOMERNUMBER); 

(唯一約束的一個缺點是,唯一索引它創建不能include額外的列。如果具有包括爲一個要求則一個獨特的,非。 )

+0

把客戶號碼強制爲唯一是件好事。我不需要額外的列與客戶編號一起唯一。 – Elisabeth

0

在客戶編號上創建唯一/非羣集索引是一個好主意。但我們應該小心,不要創建太多索引,特別是如果表格非常龐大並且存在大量DML時。