我正在重寫一箇舊的遺留系統。它有一個叫做checkExisting()
的功能。舊的系統使用查詢從MSSQL數據庫,這樣提取的對象(與ADO DB):SQL Union一切都太慢
SELECT ObjectId, Name.....
FROM tblRegisteredIncludes
WHERE UPPER("Name") IN ('PROGA.H', 'PROGB.H'............... list)
有喜歡tblRegisteredIncludes
很多表,但SQLS由表名進行分組,並使用與列表中的IN子句對象名稱。
由於SQL Server在一次掃描中收集所有對象,並且表中有Name
列的索引,因此執行速度適當。
但是,在新系統中,我不能使用相同的SQL,因爲WHERE
條件更復雜。它也使用一個Source字段,有時還會使用其他字段。我有一個較大的數目單個SQL查詢:
SELECT ObjectId, Name..... FROM tblRegisteredIncludes
WHERE UPPER("Name") = 'PROGA.H' AND UPPER("Source") = "..."
SELECT ObjectId, Name..... FROM tblRegisteredIncludes
WHERE UPPER("Name") = ('PROGB.H') AND UPPER("Source") = "..."
我已經有超過(Name,Source)
一個綜合指數更換名稱指數在tblRegisteredIncludes
表。
我已經預料到即使如此,總SQL執行速度稍慢,但不超過15-20%。相反,它要慢得多,有時高達100%。我試着使用UNION ALL在一個大的SQL查詢SQL後結合:
SELECT ObjectId, Name..... FROM tblRegisteredIncludes
WHERE UPPER("Name") = 'PROGA.H' AND UPPER("Source") = "..."
UNION ALL
SELECT ObjectId, Name..... FROM tblRegisteredIncludes
WHERE UPPER("Name") = ('PROGB.H') AND UPPER("Source") = "..."
再後來pocessing所產生的ADO記錄數據庫,但它更慢!
我需要知道是否有一些有效的方法來更快地執行這些查詢?使用IN子句和名稱列表時,我需要達到與舊案例類似的性能。我可以提供執行計劃。
我希望看到執行計劃。你爲什麼要用'upper'?您是否檢查過排序規則是否區分大小寫? – 2013-03-21 12:17:00
您可以詳細說明「我不能使用相同的SQL,因爲WHERE條件更復雜」。在您給出的示例中,沒有理由需要將查詢分開。 – GarethD 2013-03-21 12:25:49
你真的需要UPPER嗎?這種情況很少使用區分大小寫的排序規則。使用UPPER會破壞你的查詢計劃,因爲這個函數對於SQL Server來說是不透明的 - 它不知道該函數做了什麼,所以它不會使用索引並執行表掃描。 – TToni 2013-03-21 12:32:12