Многопоточность в SQL Server - PullRequest
       0

Многопоточность в SQL Server

2 голосов
/ 25 февраля 2011

Допустим, у меня есть таблица типа:

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

Ответы [ 2 ]

1 голос
/ 25 февраля 2011

Проблема в том, что ваша схема не соответствует типу информации, которую вы хотите извлечь, поэтому получение нужной информации является такой болью. В этом случае значения не нормализуются. Если вы их нормализуете, запрос становится тривиальным:

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 голос
/ 25 февраля 2011

Нет явного контроля потоков в SQL Server (или любой другой СУБД, о которой я знаю), и не должно быть . Хотя давать подсказки по индексу и определять параметры сортировки в запросе - это одно, люди намного умнее вас или меня пишут механизмы оптимизации запросов и знают, сколько потоков использовать (или не использовать) для любой данной операции.

Итак, краткий ответ: Вы не можете .

Если вам нужно серьезно обработать число и вам нужен этот уровень контроля, вам нужно будет перенести данные в ваше приложение и выполнить обработку там, где у вас гораздо больший контроль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...