2010-10-15 92 views
0

我正在從SQL數據庫執行查詢。該表有超過一百萬條記錄。SQL語句需要超過8小時才能運行

這是我的SQL語句。它需要超過8小時才能運行。有人有主意嗎?提前致謝。

Select 
    Count (userID) as DIBWIZHits, Sum (ssnCount) as SSNs 
From 
    tbl_hits10 
Where 
(appName='DIBwiz QMT' or 
    appName like 'DIBwiz-Full%' or 
    appName like 'DIBwiz-Abb%' or 
    appName like 'DIBwiz-Qual%') 
    -- or appName like 'DIBwiz%Open%' or appName like 'DIBwiz%Q%') 
and 
    lu_date between 
    convert (datetime, '2010-09-01 00:00:00', 102) and 
    convert (datetime, '2010-09-30 23:59:59', 102) 
AND 
(userID<>'888888' and 
    userID<>'999999' and 
    userID<>'777777' and 
    userID<>'666666' and 
) 
+3

的數據庫引擎是什麼? – 2010-10-15 20:23:51

+1

從'convert(datetime,...,102)'位看起來像SQL Server?儘管如此,執行計劃或配置必定會有災難性的錯誤。一百萬條記錄上的全表掃描無法持續8個小時。 – 2010-10-15 20:31:10

+1

此查詢可能很難看,但沒有連接或GROUP BY子句,所以它不應該比表掃描慢得多。我無法理解,在這樣大小的桌子上進行掃描會花費8個小時的數量級。你的配置有什麼奇怪的地方嗎?你的桌子可怕地分裂了嗎?它是否存儲在軟盤的RAID陣列上? – zinglon 2010-10-15 21:17:36

回答

0

你有你的表的索引?如果沒有,你應該至少添加一個索引到用戶ID字段,不要添加一個索引到appName字段,因爲你使用'喜歡'它將沒有任何效果。

鑑於你有這麼多的記錄,如果你還沒有在userID上的索引,它也可能需要一些時間來添加索引,但應該提高性能很多。

+1

對於'LIKE'沒有從索引中受益的評論是錯誤的,至少在SQL Server 2005中是如此。安東尼如何使用'LIKE'(即最終的通配符),他將受益。以下文章說明了這一點 - 很容易在mgmt studio express(免費)中嘗試自己。 http://myitforum.com/cs2/blogs/jnelson/archive/2007/11/16/108354.aspx – Matt 2010-10-16 02:23:05

4

我對優化有幾條建議。

1)你絕對應該使用正則表達式來搜索appname。

2)你應該在用戶ID(用戶ID未在(1,2,3,4,5)進行比較的列表,如「AND)

3)你的數據庫表應該有索引。

每個那些應顯着提高性能。

+1

如果這是SQL Server(給出'convert'函數的合理假設),那麼: 1.絕對不是,那會比較慢。 2.這沒有什麼區別。 3.是的,這應該是第一件檢查。 – 2010-10-18 12:07:14

1

有在那裏CONVERT(日期時間,...)功能where子句就會執行解析每一行,你會好起來,宣佈一個日期變量設置爲CONVERT的結果並使用它。此外,使用「IN」和「NOT IN」比一個<>更好。最後,LIK使用通配符的E運營商通常比精確的運營商慢。

+3

構建查詢計劃時,CONVERT只會執行一次,因爲它使用的是常量值。 (NOT)IN生成與一系列AND子句相同的計劃。因爲LIKE必須做更多的工作,所以LIKE總是會慢得多,但真正的痛苦來自於在開始處有一個通配符,它​​阻止了索引的使用,這在這個查詢中並不是這樣。 (儘管我認爲appName可能是一個巨大的TEXT列,它會在某種程度上影響他的'stuff%morestuff%'條件的成本。) – zinglon 2010-10-15 21:24:29

0

你有沒有索引appName

也考慮@檢測的建議,使用userid not in (<coma_separated_values>)

1

嗯,這可能是特定高度的平臺,但我會嘗試手動打破它在嵌套查詢根據什麼指標都存在。例如。 (簡體),假設有上lu_date指數:

Select Count (userID) as DIBWIZHits, Sum (ssnCount) as SSNs 
From 
    (select * from tbl_hits10 
    where lu_date between 
     convert (datetime, '2010-09-01 00:00:00',  102) 
     and convert (datetime, '2010-09-30 23:59:59', 102) 
) z 
Where (appName like 'DIBwiz%') 
AND userID not in ('016266'....) 

IHTH

相關問題