sql-server - 我可以将长时间运行的存储过程分布在多个 CPU 上吗?

标签 sql-server multithreading sql-server-2008 stored-procedures performance

[也在 super 用户 - https://superuser.com/questions/116600/can-i-spead-out-a-long-running-stored-proc-accross-multiple-cpus ]

我在 SQL Server 中有一个存储过程,可以获取和解密数据块。 (在这种情况下是信用卡。)

大多数情况下,性能是可以接受的,但有几个客户的过程非常缓慢,需要 1 分钟才能完成。 (好吧,准确地说是从 SQL Server 返回 59377 毫秒,但它可能会根据负载变化数百毫秒)

当我观察这个过程时,我看到 SQL 只使用一个 proc 来执行整个过程,并且通常只使用 proc 0。

有没有办法可以更改我的存储过程,以便 SQL 可以对进程进行多线程处理?作弊并将通话分成两半(前 50%,后 50%)并分散负载,作为粗暴的攻击,是否可行? (只是在这里吐痰)

我的存储过程:

USE [Commerce]
GO
/****** Object:  StoredProcedure [dbo].[GetAllCreditCardsByCustomerId]    Script Date: 03/05/2010 11:50:14 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[GetAllCreditCardsByCustomerId]
@companyId UNIQUEIDENTIFIER, @DecryptionKey NVARCHAR (MAX)
AS
SET NoCount ON

DECLARE @cardId uniqueidentifier
DECLARE @tmpdecryptedCardData VarChar(MAX);
DECLARE @decryptedCardData VarChar(MAX);

    DECLARE @tmpTable as Table 
    (
        CardId uniqueidentifier,
        DecryptedCard NVarChar(Max)
    )

DECLARE creditCards CURSOR FAST_FORWARD READ_ONLY
  FOR  Select cardId from CreditCards where companyId = @companyId and Active=1 order by addedBy desc



--2 
OPEN creditCards
--3 
FETCH creditCards INTO @cardId   -- prime the cursor

WHILE @@Fetch_Status = 0 
  BEGIN

        --OPEN creditCards
        DECLARE creditCardData CURSOR FAST_FORWARD READ_ONLY
                        FOR select convert(nvarchar(max), DecryptByCert(Cert_Id('Oh-Nay-Nay'), EncryptedCard, @DecryptionKey)) FROM CreditCardData where cardid = @cardId order by valueOrder

                OPEN creditCardData

                FETCH creditCardData INTO @tmpdecryptedCardData   -- prime the cursor

                WHILE @@Fetch_Status = 0 
                    BEGIN               

                        print 'CreditCardData'
                        print @tmpdecryptedCardData                     

                        set @decryptedCardData = ISNULL(@decryptedCardData, '') + @tmpdecryptedCardData
                        print '@decryptedCardData'
                        print @decryptedCardData;

                        FETCH NEXT FROM creditCardData INTO @tmpdecryptedCardData   -- fetch next
                    END 
                    CLOSE creditCardData
                    DEALLOCATE creditCardData       

                    insert into @tmpTable (CardId, DecryptedCard) values (  @cardId, @decryptedCardData )
                    set @decryptedCardData = ''


    FETCH NEXT FROM creditCards INTO @cardId   -- fetch next
  END

select CardId, DecryptedCard FROM @tmpTable


CLOSE creditCards
DEALLOCATE creditCards

最佳答案

如何使用 FOR XML 在单个相关子查询中进行串联:

DECLARE @cards TABLE
    (
     cardid INT NOT NULL
    ,addedBy INT NOT NULL
    )
DECLARE @data TABLE
    (
     cardid INT NOT NULL
    ,valueOrder INT NOT NULL
    ,encrypted VARCHAR(MAX) NOT NULL
    )

INSERT  INTO @cards
VALUES  ( 0, 1 )
INSERT  INTO @cards
VALUES  ( 1, 0 )

INSERT  INTO @data
VALUES  ( 0, 0, '0encrypted0' )
INSERT  INTO @data
VALUES  ( 0, 1, '0encrypted1' )
INSERT  INTO @data
VALUES  ( 0, 2, '0encrypted2' )
INSERT  INTO @data
VALUES  ( 1, 0, '1encrypted0' )
INSERT  INTO @data
VALUES  ( 1, 1, '1encrypted1' )

-- INSERT INTO output_table ()
SELECT  cardid, decrypted
FROM    @cards AS cards
        OUTER APPLY ( SELECT    REPLACE(encrypted, 'encrypted', 'decrypted') + '' -- Put your UDF here
                      FROM      @data AS data
                      WHERE     data.cardid = cards.cardid
                      ORDER BY  data.valueOrder
                    FOR
                      XML PATH('')
                    ) AS data ( decrypted )
ORDER BY cards.addedBy DESC

关于sql-server - 我可以将长时间运行的存储过程分布在多个 CPU 上吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2388513/

相关文章:

sql - 将数据库名称与表列表相关联

sql-server - 链接服务器插入选择性能

java - 使用java将图像存储在sql server数据库中

sql-server - 将查询结果导出到 Excel Microsoft SQL Server 2012 时找不到源数据类型 "200"错误

java - Java同步等待和通知方法

sql-server - 无法看到我在 SQL Server Management Studio 2008 中创建的触发器

sql-server - SQL Server 将一个月添加到表示为 8 位小数的日期

php - 从 php codeigniter 调用存储过程

Java 多线程示例在不同线程上打印消息 100 次?

c - 图书馆设计方法