[英]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
? a
和b
之間確實沒有關系嗎? 這似乎是一個設計問題。 您想使a.sumprod
中的所有 a.sumprod
成為b
一行中的內容的函數? 您是否打算反復更改? 您太抽象了,無法告訴您要完成的工作。
就個人而言,我會創建一個VIEW
返回的必要的乘積,而不是在更新領域a
作為存儲聚集是一個普遍較差的想法,但如果你已經有性能問題,可能並不明智。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.