繁体   English   中英

如何在SQL Server 2008中加快联接和求和产品查询?

[英]How to speed up a join and sum product query in SQL Server 2008?

我有两个表A和B。A具有浮点变量X1,X2,X3,...,X9,sumprod和14,000行。 B具有浮点变量X1,X2,X3,...,X9,文本变量“ Model”,其值例如为“ Model 1”,“ Model 2”等,并有50行。
我正在尝试加入并使用以下代码执行sumproduct操作:

Update A set a.sumprod = a.X1*b.X1 + a.X2*b.X2 + ... + a.X9*b.X9
from a left join b
on b.Model = 'Model 2';

我有多个这样的查询,这些查询具有不同的表(如A),并且表B中的Model变量具有相应的不同连接条件。我已经确定这些查询在我的存储过程中花费了最长的时间,并且正在寻找一种使它们更快的方法。

我尝试了如下所示的此查询的变体,但在运行时没有任何实质性更改:

变体1:

Update A
set a.sumprod = a.X1*b.X1 + a.X2*b.X2 + ... + a.X9*b.X9
from a left join b
on 1 = 1
where b.Model = 'Model 2';

变体2:

merge A
using (select X1, X2, ..., X9 from B where Model = 'Model 2') C
on 1 = 1
when matched then update
set sumprod = a.X1*c.X1 + a.X2*c.X2 + ... + a.X9*c.X9;

编辑更清晰:

有多个表A:A1,A2,A3,...每个表A#包含模型(与表B中的型号对应)的解释变量(X1,X2等)。

因此表A1可能是:

X1 | X2 | X3 | X4 | 桑普罗德

6 | 7 | 3 | 5 |

5 | 3 | 4 | 4 |

...

表A2将具有不同数量的解释变量,并且解释变量本身也将不同。 此外,行数将与A1不同。

表B具有每个模型的模型系数,如下所示:

型号| X1 | X2 | X3 | X4 | X5 | X6 | X7 | X8 | X9

模型1 | 3 | 2 | 5 | 9 | 0 | 0 | 0 | 0 | 0

模型2 4 | 7 | 8 | 3 | 5 | 8 | 0 | 0 | 0

...

模型1有四个解释变量,因此表B中的模型1行的X5列以后的系数为零。

我要在每个表A的sumprod列中执行的操作是取解释性变量与表B中正确行的系数的和积。表A与系数表B之间没有通用的行标识符。正在取A1中每个行与B中单个行的总和。

连接之后,我希望表A1的sumprod列如下所示:

X1 | X2 | X3 | X4 | 桑普罗德

1 | 7 | 3 | 5 | 6 * 3 + 7 * 2 + 3 * 5 + 5 * 9 = 92

5 | 3 | 4 | 4 | 5 * 3 + 3 * 2 + 4 * 5 + 4 * 9 = 77

...

解释变量的值是固定的,但是模型系数的值是用户输入的,并且预计会经常更改。

从最初的评论看,这似乎不是我想要执行的操作的良好数据库结构。 有什么建议可以使我更快吗?

FROM a LEFT JOIN b ON b.Model = 'Model 2'吗? 我不知道您期望从此联接中获得什么行为,并且我怀疑查询引擎同样令人困惑。 您是否真的想要CROSS JOIN 您应该只说CROSS JOIN

这就是我要做的:

UPDATE a
SET a.sumprod = a.X1 * b1.X1 + a.X2 * b1.X2 +...+ a.X9 * b1.X9
FROM a
CROSS JOIN (
    SELECT Model, X1, X2, ..., X9 FROM b where Model = 'Model 2'
    ) b1
WHERE a.sumprod <> a.X1 * b1.X1 + a.X2 * b1.X2 +...+ a.X9 * b1.X9
    OR a.sumprod is NULL;

您是否有理由要CROSS JOIN ab之间确实没有关系吗? 这似乎是一个设计问题。 您想使a.sumprod中的所有 a.sumprod成为b一行中的内容的函数? 您是否打算反复更改? 您太抽象了,无法告诉您要完成的工作。

就个人而言,我会创建一个VIEW返回的必要的乘积,而不是在更新领域a作为存储聚集是一个普遍较差的想法,但如果你已经有性能问题,可能并不明智。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM