2014-02-14 64 views
1

我很好奇某事。說我有一個日期的表上註明的紀錄「活動」狀態:活動的SQL日期標誌

tbl_test 
id field1 active_dt inactive_dt 
AAA asdf  2013-01-01 2013-02-12 
AAA sdf  2013-02-12 3000-01-01 
BBB dskjf  2012-01-01 3000-01-01 

每個ID可以有多個記錄。 「活躍」記錄是未來非常不活躍的記錄。當我查詢此數據以獲取僅有效記錄時,我使用:

SELECT 
    * 
FROM 
    tbl_test 
WHERE 
    inactive_dt >= '3000-01-01' 

但是,我的問題是這樣的。是否有也限制了這樣的active_dt領域的任何性能值:

SELECT 
    * 
FROM 
    tbl_test 
WHERE 
    inactive_dt >= '3000-01-01' 
    AND active_dt <= '3000-01-01' 

請問這種限制提高性能可言?我的數據倉庫團隊中有人向我建議,我很好奇它是否正確以及爲什麼。

回答

1

最好的辦法是用平等:

SELECT * 
FROM tbl_test 
WHERE inactive_dt = '3000-01-01'; 

你不提索引或正在使用的數據庫。對於所有數據庫,inactive_dt上的索引都不會導致全表掃描,並且所有各種方法都是等效的。

由於數據庫支持不同類型的索引,所以使用索引時,您最好平等。例如,Postgres散列索引不處理不平等和平等。儘管如此,在大多數數據庫中,缺省值是一個b-tree索引。有了這樣的指數,平等和不平等在表現上會非常相似。

但是,使用相等還有另一個好處。這可以讓您更好地使用組合索引。