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