簡體   English   中英

使用通用數據信息加速SQL查詢

[英]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

我知道必須有更好的方法,但我們似乎無法在關鍵時刻找到它。 任何幫助將不勝感激。

如果您的數據集相對較小且不太易變,您可能希望使用物化視圖(假設您的數據庫支持它們)來優化查找。

如果物化視圖不是一個選項,請考慮編寫一個存儲過程,該過程在兩次傳遞中檢索該數據:

  1. 首先檢索特定客戶(或客戶組)可用的所有CustomerVariables
  2. 接下來,從Variables表中檢索所有默認值
  3. 在缺少CustomerVariable記錄的任何地方合並默認值的結果上執行非獨特的並集。

從本質上講,這相當於:

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

您想要的查詢類型稱為數據透視表交叉表查詢。

到目前為止,處理此問題的最簡單方法是基於交叉表查詢創建視圖。 這會將列從垂直翻轉為水平,就像常規的sql表一樣。 完成后,只需查詢視圖即可。 簡單。 ;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM