2012-01-10 84 views
0

我有一個Sql-Server-2008數據庫,我正在查詢超過3000萬條記錄(喜悅!)。不幸的是,這個數據庫不能徹底改變,因爲它仍然用於R/D。SQL查詢緩慢,按日期排序表?

當我從這個數據庫查詢時,它需要FOREVER。我的意思是,我沒有耐心等待結果(爲了避免鎖定R/D部門,2分鐘後我必須取消)。即使我使用短日期範圍(超過幾個月),基本上也不可能從中得到任何結果。我正在查詢4列的需求,不幸的是必須使用另一個表的內聯接(我已經被告知在查詢效率方面非常昂貴 - 但它是不可避免的)。這個內部連接的表格少於100k條目。

我想知道的是,是否可以組織表使其默認按日期排序以減少搜索結果的數量?

如果這是不可能的,有什麼我可以做的,以減少查詢時間?有沒有其他有用的信息可以幫助我提出解決方案?

我已經包括了查詢的樣本,我使用:

SELECT DISTINCT N.TestName 
FROM [DalsaTE].[dbo].[ResultsUut] U 
INNER JOIN [DalsaTE].[dbo].[ResultsNumeric] N 
ON N.ModeDescription = 'Mode 8: Low Gain - Green-Blue' 
AND N.ResultsUutId = U.ResultsUutId 
WHERE U.DeviceName = 'BO-32-3HK60-00-R' 
AND U.StartDateTime > '2011-11-25 01:10:10.001' 
ORDER BY N.TestName 

任何幫助或建議表示讚賞!

+0

您需要一個解釋計劃,或者至少讓我們知道索引了哪些字段。 – 2012-01-10 22:30:43

+0

您是否有索引或您正在訂購的字段上的任何內容,包括TestName? – msarchet 2012-01-10 22:38:38

回答

2

這聽起來像日期時間可能是一個基於文本的字段,隨後索引不被使用?

你能嘗試以下,看看是否有任何的速度提高:

select distinct N.TestName 
from   [DalsaTE].[dbo].[ResultsUut] U 
inner join  [DalsaTE].[dbo].[ResultsNumeric] N 
    on N.ModeDescription = 'Mode 8: Low Gain - Green-Blue' 
    and N.ResultsUutId = U.ResultsUutId 
where   U.DeviceName = 'BO-32-3HK60-00-R' 
       and U.StartDateTime > cast('2011-11-25 01:10:10.001' as datetime) 
order by  N.TestName 

這也將是值得嘗試改變你的內連接到左外連接那些偶爾進行更快沒有可能的原因(至少有一個我不知道)。

+0

投射日期似乎改善了命中和錯過 - 查詢的性質。這很好。謝謝! – ImGreg 2012-01-11 14:14:20

+0

@ImGreg很高興能幫到你! – Codingo 2012-01-11 21:50:37

2

您可以根據您的日期列添加索引,這會提高查詢時間。您可以使用alter table命令,也可以使用表格設計器。

連接提供排序的唯一目的是?如果是這樣,一個快速的嘗試將刪除這個,看看它有多大的差異 - 至少你會知道在哪裏集中注意力。

最後,SQL服務器管理工​​作室有一些有用的工具,如執行計劃,可以幫助診斷性能問題。祝你好運!

1

有一些問題可能導致查詢執行延遲。

索引(主鍵除外)不對數據重新排序,它們僅創建索引(認爲電話本),該索引對多個值進行排序並指向主鍵。

沒有看到數據或現有的索引類型,它是困難的,但最起碼​​,以下升序索引可以幫助:。

[DalsaTE] [DBO] [ResultsNumeric] ModeDescription和ResultsUutId和測試名

[DalsaTE] [DBO]。[ResultsUut]的startDateTime和設備名稱和ResultsUutId

沒有上面的指標,你給的示例查詢可以在不實際表中的數據進行單查詢完成。

+0

感謝您的幫助!我已經將索引添加到Uut表中,但不幸的是,由於超時,我似乎無法將任何索引添加到數字表中。任何想法如何調整? (索引3千萬條記錄需要一段時間我想象)在選項下執行超時似乎是無限的。 – ImGreg 2012-01-11 14:26:23