2013-03-01 129 views
0

我有一個永遠不會更新並很少插入的表。我需要優化這個表來快速查詢日期列和nvachar(32)。日期列上的SQL查詢優化

我正在給表格添加索引,我不確定是否最好將性能分割成不同的列,例如:年,月,日的單獨列或者按照原樣離開日期列。

查詢基本上在nvarchar列和年份列中,或者可能包括年份,月份和日期。

我實際上做的是運行在一個姓列SOUNDEX條款和日期列

例如例如:

SELECT DISTINCT [Surname] 
FROM [dbo].[sometable] 
WHERE YEAR(Datecolumn) = 2011 AND SOUNDEX(Surname) = SOUNDEX('smith') 

什麼是最好的表現?

回答

2

如果這是你要做你的過濾器的方式,那麼索引是沒用的,因爲你正在對這些列應用函數。對於DateColumn你可以做

DateColumn >= '20110101' AND DateColumn < 20120101 

你也可以創建一個年份和月份如果真的有必要一個計算列和創建者列的索引。對於Surname列,我認爲不需要做太多的工作,SOUNDEX搜索速度會很慢,並且不會像您使用索引那樣使用索引。您仍然可以考慮創建持續計算列,並將SOUNDEX函數的結果應用於Surname,在該列上創建索引並使用計算列進行篩選。這應該加快你的查詢速度。

+0

我輸入完全相同的答案。你可以使用「之間」,因爲我認爲它更好。你應該檢查執行計劃,以確保你有適當的索引,並且它會實際使用它。 – 2013-03-01 12:27:59

+0

感謝您的建議,我現在正在測試。你確定應用了一個函數,例如YEAR(DateColumn)= 2011意味着索引無用。這是依賴於數據庫技術,因爲我正在使用SQL Server 2008,並且在執行計劃中似乎使用日期列上的索引,即使我正在將年份功能應用到它上面? – 2013-03-01 14:04:16

0

對於datetime列,您可以使用where子句爲:

WHERE DateColumn BETWEEN '01/01/2011' AND '01/01/2012' 

但如果your're要做到在where子句指數也沒用列的任何操作。我可以提供的是在單獨的列中存儲姓氏的預先計算的SOUNDEX值

+0

如果日期列具有時間分量,則在之間使用可能會導致數據丟失。 – 2013-03-01 12:37:35