如何在sql server 2008中优化以下查询。我需要优化的特殊select查询。DB=10000中的总记录,如果在9999行中使用_flag=‘flase’,则检索单个记录需要很长时间)
DECLARE @proxyAcctToken nvarchar(50)
DECLARE @pmtAcctToken varchar(50)
DECLARE @ErrorCode varchar(50)
DECLARE @returnMessage varchar(1000)
DECLARE @ErrorStep varchar(100)
DECLARE @tokenSeqNo int
DECLARE @count int
SELECT @count=100000
WHILE(@count>0)
BEGIN
SELECT @ErrorCode = @@ERROR
BEGIN TRY
SELECT top 1 @tokenSeqNo=S_NO,@pmtAcctToken = PMT_ACCT_TOKEN, @proxyAcctToken=PROXY_PMT_TOKEN
FROM PCTransDB.dbo.MIG_TOKEN_DUMP WHERE CONSUMED_FLAG = 'false'
UPDATE PCTransDB.dbo.MIG_TOKEN_DUMP SET CONSUMED_FLAG = 'TRUE', CONSUMED_BY = 'MIGBATCH' WHERE S_NO = @tokenSeqNo
PRINT @count
SELECT @ErrorCode = 0
/*************************************
* Return from the Stored Procedure
*************************************/
END TRY
BEGIN CATCH
PRINT 'IN CATCH BLOCK'
END CATCH
SELECT @count = @count-1
SELECT @proxyAcctToken = null
SELECT @pmtAcctToken =null
END注:表详情
Column Nmae DataType IsNullable
S_NO int NO
PROXY_PMT_TOKEN nvarchar NO
PMT_ACCT_TOKEN nvarchar NO
CONSUMED_FLAG bit NO
CONSUMED_BY nvarchar YES发布于 2013-03-01 16:14:35
如果我没理解错你的代码,你基本上是从你的表中选择一个TOP 1行,其中CONSUMED_FLAG = 'false',然后你更新这一行,让它有CONSUMED_FLAG = 'true'和CONSUMED_BY = 'MIGBATCH' --你做了10'000次,对吗?
(顺便说一下:在没有ORDER BY的情况下做TOP 1是没有意义的--你得到的是哪种TOP 1?您没有定义顺序-那么您希望TOP 1为您提供“最顶端”行的顺序是什么??)
所以你为什么不这样做:
-- use a CTE (Common Table Expression) to select the TOP 10000 rows
-- you need to SPECIFY AN ORDER BY for this to make sense!
;WITH CTE AS
(
SELECT TOP 10000
S_NO
FROM
PCTransDB.dbo.MIG_TOKEN_DUMP
WHERE
CONSUMED_FLAG = 'false'
ORDER BY
??????
)
UPDATE
PCTransDB.dbo.MIG_TOKEN_DUMP
SET
CONSUMED_FLAG = 'TRUE', CONSUMED_BY = 'MIGBATCH'
FROM
CTE
WHERE
CTE.S_NO = PCTransDB.dbo.MIG_TOKEN_DUMP.S_NO基本上,只需通过在CTE中选择要更新的行来定义要更新的内容(行),然后运行one single 语句来更新所有选定的行。好了。没有乱七八糟的循环,什么都没有--就像一个护身符!
https://stackoverflow.com/questions/15151668
复制相似问题