【发布时间】:2010-03-05 17:05:53
【问题描述】:
我在 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
【问题讨论】:
-
那里的光标中有一个光标。 @@FETCH_STATUS 会相当混乱,您的程序可能会提前结束。 msdn.microsoft.com/en-us/library/ms187308.aspx
标签: sql-server multithreading sql-server-2008 stored-procedures performance