SQL Server 中的多线程

问题描述 投票:0回答:3

假设我有一张像这样的桌子:

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

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
multithreading sql-server-2008
3个回答
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 Server(或我所知道的任何其他 RDBMS)中没有对线程的显式控制,也不应该有。虽然在查询中提供索引提示和排序规则规范是一回事,但比您或我更聪明的人编写查询优化引擎,并且知道对于任何给定操作要使用(或不使用)多少个线程。

所以,简短的答案是你不能

如果您需要进行严格的数字运算并需要这种级别的控制,则必须将数据提取到应用程序中并在那里进行处理,这样您就有更大的控制权。


0
投票

我知道这是一个非常古老的问题,但这仍然是我在寻找类似问题时出现的问题。它还出现了这个稍微不太旧的链接:

https://www.mssqltips.com/sqlservertip/4939/how-to-force-a-parallel-execution-plan-in-sql-server-2016/

建议将此添加到查询末尾:

选项(查询跟踪 8649)

有了它,我的测试查询从最大化单个核心:

 SQL Server Execution Times:
   CPU time = 23172 ms,  elapsed time = 23265 ms.

大约 8 个核心在大部分时间几乎已满:

 SQL Server Execution Times:
   CPU time = 26492 ms,  elapsed time = 5612 ms.

CPU 总时间更多,但运行时间更少。

© www.soinside.com 2019 - 2024. All rights reserved.