各位好,小弟有個疑問想請問大家,我有一張表內有數百萬筆的資料,number_key,A_year,A_month等欄位都是不常修改的必要篩選欄位,
在該情況下我使用方法一建立資料表,但我有個疑問,若我使用方法二讓seq建立唯一叢集 (PRIMARY KEY CLUSTERED),且不建立任何INDEX,
在我比較兩個方式的執行計畫與實際進行篩選,卻發現相差異不大,
方法一 使用篩選條件(number_key,A_year,A_month),執行計畫為叢集索引搜尋
方法二 使用篩選條件(number_key,A_year,A_month),執行計畫為叢集索引掃描,
數百萬筆的資料下,方法一的 I/O成本(0.00625)與運算子成本(0.0065) 方法二的I/O成本(0.0031)與運算子成本(0.0032),
搜尋全部欄位時間也差不多,為何如此? 另PRIMARY KEY 建立NONCLUSTERED與CLUSTERED有何差異?
方法一:
CREATE TABLE [dbo].[test](
[seq] [int] IDENTITY(1,1) NOT NULL,
[number_key] [char](11) COLLATE Chinese_Taiwan_Stroke_CI_AS NOT NULL,
[A_year] [nchar](3) COLLATE Chinese_Taiwan_Stroke_CI_AS NOT NULL,
[A_month] [char](2) COLLATE Chinese_Taiwan_Stroke_CI_AS NOT NULL,
[text] [varchar](20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
CONSTRAINT [PK_test] PRIMARY KEY NONCLUSTERED
(
[seq] ASC,
[number_key] ASC,
[A_year] ASC,
[A_month] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE UNIQUE CLUSTERED INDEX [IX_test_UNo] ON [dbo].[test]
(
[seq] ASC,
[number_key] ASC,
[A_year] ASC,
[A_month] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
GO
方法二:
CREATE TABLE [dbo].[test](
[seq] [int] IDENTITY(1,1) NOT NULL,
[number_key] [char](11) COLLATE Chinese_Taiwan_Stroke_CI_AS NOT NULL,
[A_year] [nchar](3) COLLATE Chinese_Taiwan_Stroke_CI_AS NOT NULL,
[A_month] [char](2) COLLATE Chinese_Taiwan_Stroke_CI_AS NOT NULL,
[text] [varchar](20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
CONSTRAINT [PK_test] PRIMARY KEY CLUSTERED
(
[seq] ASC,
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO