[英]Speeding up a SQL query with generic data information
由於各種設計決策,我們有一個表'CustomerVariable'。 CustomerVariable有三位信息 - 它自己的id,變量的id(客戶可以擁有的可能設置列表),以及該變量的值。 另一方面,Variable表具有默認信息 - 如果未設置CustomerVariable。
這在大多數情況下都很有效,這使我們不必創建一個非常長的信息列表 - 特別是在需要為客戶處理16個類似變量的情況下。
問題在於嘗試將此信息輸入選擇。 到目前為止,我們的“最佳”解決方案涉及太多有效的連接 - 我們得到了一個我們需要信息的16個VariableId的列表,首先將它們設置為變量。 然而,稍后,我們必須這樣做:
CROSS JOIN dbo.Variable v01
LEFT JOIN dbo.CustomerVariable cv01 ON cv01.customerId = c.id
AND cv01.variableId = v01.id
CROSS JOIN dbo.Variable v02
LEFT JOIN dbo.CustomerVariable cv02 ON cv02.customerId = c.id
AND cv02.variableId = v02.id
-- snip --
CROSS JOIN dbo.Variable v16
LEFT JOIN dbo.CustomerVariable cv16 ON cv16.customerId = c.id
AND cv16.variableId = v16.id
WHERE
v01.id = @cv01VariableId
v02.id = @cv02VariableId
-- snip --
v16.id = @cv16VariableId
我知道必須有更好的方法,但我們似乎無法在關鍵時刻找到它。 任何幫助將不勝感激。
如果您的數據集相對較小且不太易變,您可能希望使用物化視圖(假設您的數據庫支持它們)來優化查找。
如果物化視圖不是一個選項,請考慮編寫一個存儲過程,該過程在兩次傳遞中檢索該數據:
從本質上講,這相當於:
SELECT variableId,
CASE WHEN CV.variableId = NULL THEN VR.defaultValue ELSE CV.value END
FROM Variable VR
LEFT JOIN CUstomerVariable CV on CV.variableId = VR.variableId
WHERE CV.customerId = c.id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.