2015-11-10 60 views
0

讀過很多博客後,我決定創建具有guid/UNIQUEIDENTIFIER作爲主鍵的表,但是使用非聚簇索引和bigint作爲聚簇鍵。使用bigint作爲非羣集鍵和guid/UNIQUEIDENTIFIER作爲主鍵非羣集

首先,在這種情況下,正確的DDL語法是什麼。另外,我認爲使用bigint作爲外鍵是正確的選擇。它是否正確?

下面是十個首發:

IF OBJECT_ID('dbo.Table1', 'U') IS NOT NULL 
    DROP TABLE dbo.Table1; 

CREATE TABLE dbo.Table1 
(
    [Table1Id] [BIGINT] IDENTITY(1,1) NOT NULL, 
    [Table1Guid] [UNIQUEIDENTIFIER] NOT NULL, 
    [PayLoad] NVARCHAR(200) NULL 
PRIMARY KEY CLUSTERED 
(
    [Table1Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) 
) 

CREATE NONCLUSTERED INDEX IX_Table1_Table1Guid 
    ON dbo.Table1 (Table1Guid); 
GO 
+0

你爲什麼得出兩個鍵的結論? – Paparazzi

+0

你還會怎麼做?使用guid作爲集羣密鑰是不好的做法。 – cs0815

+0

使用guid作爲非集羣密鑰是一種很好的做法?碎片化索引是一個分段索引。冗餘的非零碎索引無法彌補這一點。冗餘索引增加了什麼值?它肯定有一些開銷。 – Paparazzi

回答

1

其實當你默認的主鍵創建表的創建爲聚集索引。但是您可以創建非聚集主鍵並在另一列上添加聚簇索引。其語法如下:

CREATE TABLE [dbo].[Table1](
    [Table1Id] [BIGINT] IDENTITY(1,1) NOT NULL, 
    [Guid] [UNIQUEIDENTIFIER] NOT NULL, 
    [PayLoad] NVARCHAR(200) NULL 
) 
GO 

ALTER TABLE [dbo].[Table1] ADD CONSTRAINT [PK_Table1] PRIMARY KEY NONCLUSTERED ([Guid]) 
GO 

CREATE UNIQUE CLUSTERED INDEX IX_Table1_Table1Id ON dbo.Table1 (Table1Id) 
GO 

現在關於​​列的主鍵。由於需要空間,因此擁有guid primary key通常不是個好主意。

Exam 70-461: Querying Microsoft SQL Server 2012摘自:

爲您代理鍵的存儲需求可以級聯 效果,如果您的聚集索引是在同一個鍵列 (默認爲一個主鍵約束)定義。聚簇索引鍵 列在內部被所有非聚簇索引用作手段 來查找表中的行。因此,如果您在 列x上定義聚簇索引,並且非聚簇索引(在列a,b上一個和一個 )上的非聚簇索引,則在列(a, x),(b, x)和(c,x)。

,除非你真的需要這樣的PK(例如,在分佈式系統中,當你需要uniqueneess跨多個系統),我不會推薦使用guidsPK,至少在工作表中。

+0

謝謝。是的,我需要一個GUID主鍵,因爲系統將被分配。數據庫不可操作/ OLTP。我會認爲該GUID也需要一個非聚簇密鑰。它是否正確?只是好奇,我會使用BIGINT作爲GUID的外鍵嗎? – cs0815

+0

順便說一句,你的DDL語法不起作用。 – cs0815

+0

@csetzkorn,而不是'CREATE CLUSTERED INDEX IX_Table1_Table1Id ON dbo.Table1(Table1Id)'use' CREATE UNIQUE CLUSTERED INDEX IX_Table1_Table1Id ON dbo.Table1(Table1Id)''你可以使用這兩列中的任何一個作爲外鍵。 –