2011-05-16 55 views
3

我在SQL Server中有2400萬條記錄的數據庫2000SQL性能問題

當我運行此查詢

select * from cdr 
where starttime between '2011-05-15 00:00:00.000' and '2011-05-16 00:00:00.000' 

即使這樣

declare @MinDate char(30) ,@MaxDate char(30) 
set @MinDate=substring(convert(char,(getdate()-1), 120),1,10)+' 00:00:00.000' 
set @MaxDate=substring(convert(char,(getdate()), 120),1,10)+' 00:00:00.000' 
select * from cdr 
where starttime between '2011-05-15 00:00:00.000' and @MaxDate 

它運行速度非常快和回報3500個記錄的冷杉10秒,注意starttime是數據庫​​

但是,當我運行此查詢,它只是在10秒〜60秒

declare @MinDate char(30), @MaxDate char(30) 

set @MinDate = substring(convert(varchar, (getdate()-1), 120),1,10)+' 00:00:00.000' 
set @MaxDate = substring(convert(varchar, (getdate()), 120),1,10)+' 00:00:00.000' 

select * from cdr 

where starttime between @MinDate and @MaxDate 

返回32條記錄:: @MinDate值爲2011-05-15 00:00:00.000

注意starttime在索引我的數據庫

我想知道什麼是我的問題嗎?

+2

好吧,一個很明顯的問題是,你說你的'StartTime'列是'VARCHAR(30)' - 然而,你的標準,你用'@ MinDate'和'@ MaxDate'被定義爲'CHAR(30) '這意味着它們將被填充到具有空格的限定長度。這既浪費空間,也需要'CHAR'和'VARCHAR'之間的轉換 - 如果你的列的類型是'VARCHAR(30)',我也會使搜索條件的數據類型爲'VARCHAR(30)' – 2011-05-16 09:06:09

+0

第二個明顯的問題:你真的**需要你的'cdr'表中的所有列?如果沒有 - **明確指定您需要的列 - 並且只列出您真正需要的列。這會減少查詢和數據傳輸時間 – 2011-05-16 09:06:55

+0

您是否嘗試過在顯示中明確將MinDate/MaxDate轉換回DateTime? – Runonthespot 2011-05-16 09:07:28

回答

0

的SQL Server可能有2個參數,是不是最適合你的參數值的查詢的查詢計劃緩存。在sqlserver 2008中,你可以使用Optimize for unknown hint。 http://blogs.msdn.com/b/sqlprogrammability/archive/2008/11/26/optimize-for-unknown-a-little-known-sql-server-2008-feature.aspx 在SQL Server 2000中,你可以嘗試的文章中提到的其他選項之一。

+0

select * from cdr存在同樣的問題,其中@MinDate和'2011-05-16 00:00:00.000'之間的starttime存在! – 2011-05-16 09:49:28

+0

在執行查詢之前嘗試使用DBCC FREEPROCCACHE – Wim 2011-05-16 12:11:59

0

相同的問題herehere。使用OPTION (RECOMPILE)