Sql-Server

按 datetime vs date vs int 性能分區

  • September 30, 2013

我正在嘗試確定哪種分區策略對我在 SQL Server 上的查詢最有效。

我們知道我們想要每日分區。數據中有一個自然DATETIME欄位,因此我的直覺是根據該值進行分區。但是,我們已經討論了添加一DATE列(僅去除時間資訊)或可能將日期編碼為整數(YYYYMMDD例如,20130930)並將其用作分區列的可能性。

對此數據的所有查詢都將在特定日期 ( WHERE ItemTime = '2013-09-30') 或日期範圍 ( WHERE ItemTime BETWEEN '2013-09-15' AND '2013-09-30') 上進行。目前,我們始終查詢日期,但未來的要求可能包括時間詳細資訊 ( WHERE ItemTime BETWEEN '2013-09-29 20:30:00' AND '2013-09-30 10:15:45')。

我在幾十萬行數據上測試了每種策略的性能,並沒有發現真正的區別。但是,生產部署將達到數億行,甚至可能達到數十億行。

這些策略之一是否會導致比其他策略更有效的查詢?為什麼或者為什麼不?

謝謝你的幫助。

$$ EDIT $$查詢將由應用程式碼格式化,所以我不關心如何在DATETIMEDATEINT. 我可以假設查詢將根據選擇的分區方案正確格式化。我只是想知道使用這些數據類型之一是否會更快地消除分區。

通過添加額外的列,您不應該獲得任何額外的性能提升。如果有的話,我懷疑它會超過額外列所需的額外儲存成本。

您可以從僅日期列中獲得一個好處,那就是您可以擁有一個日期維度。如果這是用於數據倉庫,我絕對建議包括在內。

如果您決定添加附加列(並假設您使用的是 SQL 2008 +),請使用 Date 數據類型。Int(格式為 YYYYMMDD)曾經是推薦的分區格式,因為它比 datetime(@8 字節/行)便宜(@ 4 字節/行)。日期為 3 個字節/行,採用自然日期格式。此外,INT 查詢起來很麻煩,因為您必須在搜尋參數中添加轉換:

WHERE DateID = (CONVERT([int],CONVERT([char](8),getdate(),(112)),(0)))

引用自:https://dba.stackexchange.com/questions/50774