2010-06-18 100 views
4

我在SQL服務器中有一個表,它有一個名爲Date_Printed的DATETIME字段。我正在試圖獲取表中位於指定日期範圍之間的所有記錄。目前我使用下面的SQL在SQL Server日期之間獲取日期的正確方法

DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME

SET @StartDate = '2010-01-01'
SET @EndDate = '2010-06-18 12:59:59 PM'

SELECT * FROM table WHERE Date_Printed BETWEEN @StartDate AND @EndDate

我對Date_Printed列的索引。我想知道這是否是獲取表格中位於這些日期之間或者有更快捷方式的行的最佳方式。該表現在其中約有750,000條記錄,並將繼續增長。查詢速度非常快,但如果可能的話,我想盡快讓它更快。

+0

BETWEEN在某些數據庫中不可移植,它在其他數據庫中不具有兼容性。 – 2010-06-18 16:09:45

+0

您是否意味着在下午的最後時間是1?您需要使用Brett的建議或將其更改爲23:59:59.997 – 2010-06-18 20:29:09

回答

3

我建議你使用:

DECLARE @StartDate DATETIME 
DECLARE @EndDate DATETIME 

SET @StartDate = '2010-01-01' 
SET @EndDate = '2010-06-19' 

SELECT [someColumn],... FROM table WHERE Date_Printed >= @StartDate AND Date_Printed < @EndDate 

不知道有什麼可以在白天的那個最後一秒命中

+0

此外,當你進入毫秒時,MS有一些「舍入」問題,所以我通常也使用這種方法。 – 2010-06-18 16:08:19

+0

+1不是_optimization_,而是對正確性的改進。 – 2010-06-18 16:08:24

0

除了擁有正確的索引之外,您無法在此處進行任何操作。那麼,在選擇中擺脫「*」 - 輸入字段,並且不要求所有字段(限制數據傳輸)。

基本上就是這樣。如你所說,如果你在Date_Printed上有一個索引,那就是那個查詢。更多的性能=更好的機器,主要是更快的光盤,更多的RAM用於緩存。

+0

*僅用於此處發佈的示例。我在寫查詢時從不使用*,但它是顯示我正在嘗試執行的最簡單的方法。 – 2010-06-18 17:24:06

1

思路,以優化這個查詢:

  1. 做一個聚集索引上Date_Printed索引。但是這可能會減慢其他查詢和DML的速度。
  2. 如果不需要表中的所有列,請顯式列出所需的列。 (即使你這樣做,列出列也是最好的形式。)這將減少返回查詢調用者的通信量。
  3. 如果您不將'Date_Printed'上的索引創建爲聚簇索引,並且您可以限制所需的列,請爲此查詢創建一個覆蓋索引。覆蓋索引是查詢所需的所有列都包含在索引中的索引。 SQL Server 2008的另一種選擇是使用include選項在索引中包含列,而不索引這些列。換句話說,只是在date_printed上索引,但包含正在返回的其他列。

上述某些想法可能涉及其他DML速度和增加的存儲空間的權衡。

0

如果您使用Microsoft SQL Server,這是測試查詢運行SQL Server Profiler(從工具)的效率的好方法。然後,當您運行查詢時,您應該看到您的查詢被調用,並提供有關它的效率的信息。 您也可以將您的日誌從profiler作爲xml文件導出到數據庫引擎優化顧問中,這可能會幫助您創建在表上創建索引的想法。

另一種技術是包括SET STATISTICS IO ON在您的查詢,然後在消息你會得到(1你的情況)表的列表,並通過查詢

另一種是進行讀取等的數通過單擊SQL Server Management Studio中的'包括實際執行計劃'按鈕在執行計劃中包含執行計劃 這可能有點複雜,但應告訴您是否正在使用您的索引。

0

在MS SQL Server中,你可以嘗試使用DATEDIFF

SELECT * FROM table 
WHERE DATEDIFF(dd, @StartDate, Date_Printed) > 0 
AND DATEDIFF(dd, Date_Printed, @EndDate) > 0 

不知道如何有效的將被比較BETWEEN。只是扔在那裏。

相關問題