有问题的sql server查询
我有以下运行缓慢的查询:有问题的sql server查询,sql,sql-server,greatest-n-per-group,Sql,Sql Server,Greatest N Per Group,我有以下运行缓慢的查询: WITH AcdTran AS (select SequenceNo, ReqID, PolNumber, transaction_id, application_data, trans_type, retries, status,
WITH AcdTran
AS (select SequenceNo,
ReqID,
PolNumber,
transaction_id,
application_data,
trans_type,
retries,
status,
direction
from dbo.acord_transaction_benchmark with (nolock)
where direction = 'OUT')
select top 1 *
from AcdTran a
where a.transaction_id = (select top 1 transaction_id
from AcdTran b
where b.PolNumber = a.PolNumber
order by ReqID,
SequenceNo,
transaction_id)
and ( status = 'New'
or status = 'Resubmit' )
and retries > 0
我如何优化它?跑得更快
谢谢使用窗口功能行数应该会更快:
WITH AcdTran AS (
SELECT SequenceNo,
ReqID,
PolNumber,
transaction_id,
application_data,
trans_type,
retries,
status,
direction,
ROW_NUMBER() OVER(PARTITION BY transaction_id ORDER BY ReqID, SequenceNo, transaction_id) N
FROM dbo.acord_transaction_benchmark with (nolock)
WHERE direction = 'OUT')
SELECT *
FROM AcdTran
WHERE (status = 'New'
OR status = 'Resubmit')
AND retries > 0
AND N = 1;
由于我没有您的表结构或任何数据,我显然没有对其进行测试,因此您可能需要稍微修改查询,但您有这个想法。如果您将子查询拖出到联接中会怎么样:
WITH AcdTran
AS (select SequenceNo,
ReqID,
PolNumber,
transaction_id,
application_data,
trans_type,
retries,
status,
direction
from dbo.acord_transaction_benchmark with (nolock)
where direction = 'OUT')
select top 1 *
from AcdTran a
inner join AcdTran b on a.SequenceNo = b.SequenceNo --or whatever the PK is
where a.transaction_id = b.transaction_id and
a.PolNumber = b.PolNumber and
(a.status = 'New' or a.status = 'Resubmit' ) and
a.retries > 0
order by b.ReqID,
b.SequenceNo,
b.transaction_id
它应该做什么?您的
select top 1*
缺少一条order by
它应该选择一条状态为New的记录,或者按顺序从表中重新提交。因此,如果我有2条记录,其中一条记录有序列1,另一条记录有序列2,那么应该选择序列为1OK的记录,我认为这只是一个标准的最大n-每组
查询。有3种方法。最好的方法取决于你的索引和数据分布。你可能已经有了,但要确保你把索引放在了正确的列上。它对这类问题有很大的影响queries@JustMe你能提供一些示例数据和期望的结果吗?JustMe:我的错误,应该是按事务划分\u id
,我编辑了我的帖子。