如何在sql server 2008中优化以下查询。 特别是我需要优化的选择查询。(例如,DB = 10000中的totoal记录,如果在9999行中的consume_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
答案 0 :(得分:0)
如果我正确理解您的代码,您基本上是从TOP 1
的表中选择CONSUMED_FLAG = 'false'
行,然后将此行更新为CONSUMED_FLAG = 'true'
和{{1 - 你做了10'000次 - 对吧?
(顺便说一下:在没有CONSUMED_BY = 'MIGBATCH'
的情况下进行TOP 1
非常毫无意义 - 你得到ORDER BY
?你没有定义订单 - 所以您期望TOP 1
以什么顺序为您提供“最顶层”行?)
那你为什么不这样做呢?
TOP 1
基本上,只需在CTE中选择要更新的内容(哪些行),然后运行一个-- 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
语句来更新所有选定的行。完成。没有凌乱的循环,没有 - 就像一个魅力!