[英]How can a stored proc retrieve the name of the database it's running in?
[英]Can I spread out a long running stored proc accross multiple CPU's?
[也在SuperUser上 - https://superuser.com/questions/116600/can-i-spead-out-a-long-running-stored-proc-accross-multiple-cpus ]
我在SQL Server中有一個存儲過程獲取,並解密一個數據塊。 (在這種情況下是信用卡。)
大多數情況下,性能是可以容忍的,但有幾個客戶的過程非常緩慢,需要花費1分鍾才能完成。 (確切地說,從SQL Server返回59377ms,但根據負載可能會有幾百毫秒的變化)
當我觀察進程時,我發現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
對於SuperUser小組(DBA)來說,這可能是一個更好的問題
考慮到信用卡號碼很好地散列 - Visa / MasterCard 16位CC的最后一位是校驗和值。 您是否考慮過自己的並行性,例如,通過讓每個線程獲取模數(4)= thread_id的CC數字? 假設n個CPU /核心/今天它們正在調用它們,你不需要超過4個(2 *核心)並行處理線程。
是 - 將游標重寫為基於集合的查詢,SQL Server優化程序應根據基礎數據的大小自動並行化(或不同步)。 除了一些基本的最佳實踐(如避免游標)之外,不需要“特殊”開發工作來使SQL Server使用並行性。 它將自動決定是否可以在多個proc上使用並行線程,如果這樣做有用,那么它可以在運行時為您分割工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.