[也在 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/