2009-10-06 55 views
2

示例表索引日期列:SQL服務器:在日誌表

CREATE TABLE Log (
    logID int identity 
    logDate datetime 
    logText varchar(42) 
) 

LOGID已在索引中,因爲它是一個主鍵,但如果你要查詢這個表,你可能會想使用LOGDATE作爲一個約束。但是,logID和logDate將按照相同的順序,因爲logDate將始終設置爲GETDATE()。

在logDate上添加一個額外的非聚集索引是否有意義,同時考慮到對於日誌表,重要的是要進行快速寫入。

回答

6

製作聚簇索引logDate,logID(按該順序)。由於日期時間是「增長」,這不應該花費任何額外的費用。 logID不會在同一時間插入兩個日誌條目(可能發生)

+0

你如何實現這樣的事情?你是否將這兩個列都聲明爲主鍵或跳過PK並通過對logID的唯一檢查來創建索引? – SurroundedByFish 2009-10-06 13:29:28

+1

1)將logID保留爲主鍵(這本身不是索引)。 2)在logID上刪除當前的聚集索引 3)在logDate上創建一個聚簇索引,logID 4)最終在logID上創建一個唯一的索引(如果你需要訪問logID) – Arthur 2009-10-06 13:58:28

+0

當PK有時,我無法創建聚簇索引已經自動創建一個,我也不能在PK存在的時候刪除索引。但是,我確實通過在爲ID添加PK約束之前爲兩個coluns創建索引來實現它。 – SurroundedByFish 2009-10-06 14:12:14

3

如果你會有很多的查詢與

WHILE LogDate > ......

(或類似的東西)條款 - 是的,通過各種手段!

如果您按日期進行選擇,LogID上的聚集索引將無濟於事 - 所以如果這是一種常見操作,那麼日期上的非聚集索引肯定會有很大幫助。

Marc

+0

或者的確,使LogDate上的索引爲聚簇索引(如果它將成爲查找行的主要方法) – 2009-10-06 12:37:21

+2

鑑於日期時間的準確性,聚簇索引如果僅在LogDate上時不可能是唯一的,則SQL將被迫添加一個4字節的uniquifier,這將浪費LogID,因爲LogId可能會以相同的成本添加。 – Andrew 2009-10-06 13:07:15

0

由於考慮了logdate上的聚集索引,logid,因爲您可能潛在地碰到日期時間精度窗口內的重複項(3.33 ms在SQL 2005上)。

我也會事先考慮表格是否會變大,並且應該使用表分區來允許日誌有一個滑動窗口和刪除舊數據,而不需要長時間運行刪除語句。這一切都取決於日誌記錄的數量以及您是否擁有企業版。