2013-07-24 183 views
-5
Table1 
column1 || column1Name 
======================= 
udf1 || Name1 
udf2 || Name2 


Table2 
column1 || udf1 || udf2 
================ 
key1 || value1 || value2 

要求是編寫查詢以基於與value1一起傳遞的Name1來查找key1。 我能夠使用動態sql編寫它,但是在大型記錄集的情況下其性能太低。請建議以樂觀的方式編寫sql查詢。需要優化SQL查詢

+3

我們應該優化哪個查詢?你使用的是什麼RDBMS? –

+0

這不是關於查詢優化...它是關於爲規範化表編寫查詢的最佳方式是什麼......數據庫是sql server 2008 – user2324497

+0

是否僅限於將其作爲動態SQL編寫? –

回答

0

雖然這是一個糟糕的例子,但您會在發佈更多問題時及時趕到那裏。擁有一些更現實的數據(良好的開端)並顯示期望輸出也是好事,而不是基於評論。

無論如何,我不知道有多少「udf」(推斷是用戶定義的字段),我會在每一列上有一個索引。我正在運行從Table1開始的查詢(別名t1),並基於每個相應的「udf」列基於來自table1的值多次連接到table2 ... IN ADDITION中,每個左連接也應用'value1'作爲這就是你正在尋找的東西。 'value1'可能存在於任何可能的table2別名連接中。

WHERE子句是特定於您正在查找的'名稱',而UDF1的以下AND NOT(爲空/爲空)2表意味着我只想要一個記錄,如果其中一個別名返回實例有匹配...如果沒有,則忽略記錄。

最後,COALESCE()的字段選擇,我知道這兩個viaUDF別名之一將有比賽,所以搶列1第一viaUDF1 ......如果可以爲空,從viaUDF2

搶列1
SELECT 
     coalesce(viaUDF1.Column1, viaUDF2.Column1) as ReturnedKey 
    from 
     Table1 T1 
     left join Table2 viaUDF1 
     ON T1.Column1 = viaUDF1.udf1 
     AND viaUDF1.udf1 = 'value1' 
     left join Table2 viaUDF2 
     ON T1.Column1 = viaUDF2.udf2 
     AND viaUDF2.udf2 = 'value1' 
    where 
      T1.Column1Name = 'Name1' 
     AND NOT ( viaUDF1.udf1 IS NULL 
       OR viaUDF2.udf2 IS NULL) 

現在,如果您有10個以上的UDF列,則所有投注均爲關閉性能,您必須以類似的方式左向加入每個實例,因爲您無法基於查詢內聯聯接至表(我見過),而不通過Dynamic-SQL進行。