2010-07-18 59 views
3

我正在設計一個可能有200K行的新表。 我想確保這張表格的querys是有效的。我應該如何確保mytable有效

過去我一直在假設,這將導致指數給出行的唯一ID

CREATE TABLE [dbo].[Equipment](
    [EquipID] [nchar](20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, 
    [EquipDescription] [nchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, 
    [Category] [nchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, 
    [id] [int] IDENTITY(1,1) NOT NULL 
) ON [PRIMARY] 

是否足夠呢? ,我應該設置一個主鍵。

如果有人有任何建議,請讓他們飛。

T-SQL,SQL2000,

回答

3

您只有在可以創建一個主鍵或明確創建一個得到一個指數。您需要的索引取決於您的查詢,只有在列上有索引時,纔會使查詢更快,除非查詢或加入該列。

指數也不是沒有成本,他們使數據庫更大,並增加了修改表的成本。

article,雖然老似乎給了指數很好的概述。

如果你打算用數據庫獲得數據庫教科書如Database Systems並閱讀它,將證明是非常寶貴的。尋找索引和查詢的最有效安排是困難的,嘗試和錯誤不是試圖優化查詢的好方法。

0

你應該問自己的第一件事是「'設備'的屬性是什麼?」沒有EquipID,描述或類別的設備是否可以存在?如果不是,那麼這些列不應該被允許爲空。

其次是「什麼唯一定義了一件'設備'?」它是EquipID嗎?那麼這應該是你的主鍵。它是EquipID和Category的組合嗎?然後你有一個由兩個列組成的複合主鍵。然而,有時候,數據本身並不適用於一個可以在完全關係模型中輕鬆加入的主鍵。因此,您可以考慮顯示的Identity ID列 - 這被稱爲代理鍵。要知道,默認情況下創建主鍵會在這些鍵列上創建聚簇索引。如果你使用代理鍵方法,恕我直言,那麼在你的對象的唯一性(即EquipID)上創建另一個唯一索引是個好主意。

就其他指標而言,你應該進一步問自己:「我會經常查詢哪些專欄?」也許你會有很多問題,比如「SELECT EquipID FROM Equipment WHERE Category = 3」。這表明類別是索引的一個很好的候選列。

最後,另一個很好的經驗法則是索引任何外鍵列 - 它看起來類別可能是。這會優化您可能執行的任何連接查詢。

一個好方法,這將是類似下面(快扔在一起,未測試):

CREATE TABLE [dbo].[Equipment]( 
    [EquipID] [nchar](20) NOT NULL 
    ,[EquipDescription] [nchar](100) NOT NULL 
    ,[CategoryID] [bigint] NOT NULL 
    ,CONSTRAINT [PK_Equipment] PRIMARY KEY CLUSTERED (
    [EquipID] ASC 
) 
) ON [PRIMARY] 
GO 

CREATE TABLE [dbo].[Categories]( 
    [CategoryID] [bigint] IDENTITY(1,1) NOT NULL 
    ,[CategoryName] [nchar](100) NOT NULL 
    ,CONSTRAINT [PK_Categories] PRIMARY KEY CLUSTERED (
    [CategoryID] ASC 
) 
) ON [PRIMARY] 
GO 

CREATE NONCLUSTERED INDEX [IDX_Equipment_Category] ON [dbo].[Equipment] (
    [CategoryID] ASC 
) ON [PRIMARY] 

CREATE UNIQUE NONCLUSTERED INDEX [IDX_Categories_CategoryName] ON [dbo].[Categories] (
    [CategoryName] ASC 
) ON [PRIMARY] 

ALTER TABLE [dbo].[Equipment] WITH CHECK ADD CONSTRAINT [FK_Equipment_Categories] 
FOREIGN KEY([CategoryID]) REFERENCES [dbo].[Categories] ([CategoryID]) 
GO 
1

這是在表上創建一個主鍵的最佳實踐。如@deinst所示,除非明確創建它們,否則不會獲取索引。創建主鍵是創建索引的一種方法。

[id]列可能是主鍵的一個很好的候選者。而且,將它作爲聚簇索引(每個表得到一個聚簇索引)可能是可以的,這是創建主鍵時的默認值。

您可能希望根據查詢表的方式(如@deinst所示)在其他列上創建索引。

Is [EquipID]是表的自然鍵。自然鍵是業務領域中的一個獨特屬性。業務人員如何參考每個項目。如果[EquipID]是自然鍵,則可能需要爲此列添加唯一約束或唯一索引,並且您可能希望將其可空性更改爲NOT NULL。

1

數據庫優化本身就是一門藝術/科學,但數據建模也是如此。首先確保你的模式是堅實的,並支持你的應用程序。然後,您可以添加索引以提高查詢性能。但是,不要根據某種觀點選擇數據建模選項,以某種方式使表更快地查詢。

1)除了性能以外,所有表都應該有一個主鍵。您需要能夠唯一標識一條記錄。

2)查詢的性能和哪些索引將提高效率取決於查詢。如果您在JOIN,WHERE子句或ORDER BY子句中使用列,那麼它應該有一個索引。您的主鍵會自動獲取索引,因此可以考慮以這種方式使用哪些其他列。在某些情況下,多列索引是最佳選擇。

0

這個問題是不可能的也沒有張貼查詢關係,你將不得不回答。

  • 你打算總是用id來指代設備嗎?還是通過EquipID
  • 其他表是否通過存儲id值或EquipID來將參考(外鍵)存儲到設備?
  • 你打算由Category聚合嗎?
  • 是否有Category暗示的層次?
  • 設備上的EquipID是否有變化?
相關問題