2011-03-07 122 views
1

我的客戶有一個非常大的數據庫。兩張包含患者記錄的表格有超過10 million rows。當我爲特定患者選擇患者記錄時,我會在2-3秒內獲得記錄。但是如果我在where條件下通過between date條款,我不會在25-30分鐘之前獲得記錄。我查詢 -如何在查詢非常大的數據庫表時獲得快速結果?

select convert(varchar(12),[DateTime],101) as [DateTime] , min(cast(Response as int)) as  [MinFallTotal], max(cast(Response as int)) as [MaxFallTotal] 
from NurQueryResults 
where VisitID = 'W3074332666' and QueryID = 'NURFALLZ' 
Group by convert(varchar(12),[DateTime],101) 

我得到上查詢的結果,在2-3秒而不是公司招聘

select VisitID, min(cast(Response as int)) as [MinFallTotal], max(cast(Response as int)) as [MaxFallTotal] 
from NurQueryResults 
where QueryID = 'NURFALLZ' and convert(varchar(12),[DateTime],101)='12/23/2010' 
Group by convert(varchar(12),[DateTime],101), VisitID 

實際需求是 -

select TOP 10 AV.VisitID as [UNIT], AV.AccountNumber as [ACCOUNT], AV.Name as [PATIENT NAME], convert(varchar(11),AV.BirthDateTime,101) as [DoB] 
, convert(varchar(12),NQ.[DateTime],101) as [DateTime], 
(cast(min(cast(NQ.Response as int)) as varchar(5))+ ' - ' + cast(max(cast(NQ.Response  as int)) as varchar(5))) as [FALL] 
from AdmVisits AV join NurQueryResults NQ ON 
AV.VisitID = NQ.VisitID 
where NQ.QueryID = 'NURFALLZ' AND convert(varchar(12),NQ.[DateTime],101) = '12/24/2010' 
Group by convert(varchar(12),NQ.[DateTime],101), AV.VisitID, AV.AccountNumber, AV.Name, convert(varchar(11),AV.BirthDateTime,101) 

任何人都可以告訴我爲什麼要花這麼多時間來執行,解決方案是什麼?

+0

最重要的是什麼指標都在這張桌子?這聽起來像你需要一個列上持有日期,你試圖使用BETWEEN。 – 2011-03-07 05:43:53

回答

2

您確實需要檢查執行不佳的代碼的查詢計劃。將您的查詢粘貼到窗口中並按CTRL + L。這應該幾乎告訴你它不喜歡什麼。

如果您使用SSMS 2008 IDE連接到您的SQL2005數據庫並運行查詢計劃,那麼我還應該向您推薦任何可以幫助您查詢的缺失索引。

基礎上提供,沒有看到結構,索引,參與,查詢您之間應該運行的表等不到在大多數情況下,第二..有限的信息

相關問題