2011-02-24 39 views
2

可以說,我有這樣一個表:多線程在SQL Server

a  b c  d e  f 
--------------------------------- 
1.2 2.3 4.4 5.1 6.7 11.9 
7.2 2.3 4.3 5.1 4.7 3.9 
1.9 5.3 3.3 5.1 3.7 8.9 
5.2 2.7 7.4 9.1 1.7 2.9 

如果非要計算一些東西作爲列的和的乘積的平方根

SQRT(sum(a*a)),SQRT(sum(a*b)),SQRT(sum(a*c)),SQRT(sum(a*d)),SQRT(sum(a*e)),SQRT(sum(a*f)),SQRT(sum(b*b)),SQRT(sum(b*c)),SQRT(sum(b*d))....SQRT(sum(f*f)) 
  • 我怎麼能使用threads(在這種情況下, 我猜6個線程)來解決這個 並在新表中插入?
  • 如果我不知道表中的 列的數量,有沒有辦法根據 列數創建線程,當然知道一個閾值(例如不超過10個線程)?

目前,我有這樣的:

SELECT SQRT(sum(a*a)),SQRT(sum(a*b)), .... ,SQRT(sum(f*f)) INTO TEMP FROM a_table 

回答

1

的問題是,你的方案不匹配您所要提取的信息的類型的,爲什麼得到自己想要的信息是這樣的痛苦。在這種情況下,這些值未被標準化。如果你規範化他們,查詢變得微不足道:

With Inputs As 
    (
    Select 1 As RowNum, 1.2 As a, 2.3 As b, 4.4 As c, 5.1 As d, 6.7 As e, 11.9 As f 
    Union All Select 2, 7.2, 2.3, 4.3, 5.1, 4.7, 3.9 
    Union All Select 3, 1.9, 5.3, 3.3, 5.1, 3.7, 8.9 
    Union All Select 4, 5.2, 2.7, 7.4, 9.1, 1.7, 2.9 
    ) 
    , NormalizedInputs As 
    (
    Select RowNum, 'a' As ColName, a As Value From Inputs 
    Union All Select RowNum, 'b', b From Inputs 
    Union All Select RowNum, 'c', c From Inputs 
    Union All Select RowNum, 'd', d From Inputs 
    Union All Select RowNum, 'e', e From Inputs 
    Union All Select RowNum, 'f', f From Inputs 
    ) 
Select N1.RowNum, Sqrt(Sum(N1.Value * N2.Value)) 
From NormalizedInputs As N1 
    Left Join NormalizedInputs As N2 
     On N2.RowNum = N1.RowNum 
      And N2.ColName >= N1.ColName 
Group By N1.RowNum 
1

在SQL服務器線程的沒有明確的控制(或者,我所知道的任何其他RDBMS),也不應該有。雖然在查詢中提供索引提示和排序規則是一回事,但比你更聰明的人或者我編寫查詢優化引擎並知道有多少線程可用於(或不用於)任何給定的操作。

所以,簡單的答案是你不能

如果你有一個需要認真做的數字運算,需要控制的這個水平,你必須將數據拉入你的應用程序並做處理那裏,你有更大的控制權。

+0

那麼你怎麼能優化該查詢? – cMinor 2011-02-24 22:41:17

+0

@darkcminor:該查詢已經很好地優化了,如果需要將結果選爲* columns *,那麼可以做的更簡單。你有問題嗎?如果是這樣,你應該發佈一個問題與你的具體問題。這會得到比詢問如何使用線程更好的響應。 – 2011-02-24 23:36:46