TSQL-任何分组依据
在我的150kk记录表上运行以下查询非常昂贵:TSQL-任何分组依据,sql,sql-server,tsql,Sql,Sql Server,Tsql,在我的150kk记录表上运行以下查询非常昂贵: SELECT MAX(myId) FROM Table1 GROUP BY C1,C2,C3 HAVING count(1) > 1 估计执行计划指出,排序将占操作的72%。我相信这是因为MAX 问题是:我真的不需要MAX。。。我需要任何。。。这应该是删除重复的记录,所以删除第一个或以后出现的记录对我来说没问题 有没有办法把这件事删掉 编辑1: 我想首先通过Id检索正在删除的记录,以仔细检查group by 2列是否足以进行此查询:
SELECT MAX(myId)
FROM Table1
GROUP BY C1,C2,C3
HAVING count(1) > 1
估计执行计划指出,排序将占操作的72%。我相信这是因为MAX
问题是:我真的不需要MAX。。。我需要任何。。。这应该是删除重复的记录,所以删除第一个或以后出现的记录对我来说没问题
有没有办法把这件事删掉
编辑1:
我想首先通过Id检索正在删除的记录,以仔细检查group by 2列是否足以进行此查询:
SELECT MAX(myId)
FROM Table1
GROUP BY C1, C2, C3
HAVING count(1) > 1;
在表1C1、C2、C3、myId上尝试索引
要删除记录,我建议:
with todelete as (
select t1.*,
row_number() over (partition by c1, c2, c3 order by myid desc) as seqnum
from table1 t1
)
delete todelete
where seqnum > 1;
由于我们没有进行聚合,因此此查询应该运行得更快一些
;WITH CTE AS(
SELECT myId,
ROW_NUMBER()OVER(PARTITION BY col1 ORDER BY col1) AS RowN
FROM dbo.Table1
)
DELETE FROM CTE
WHERE RowN > 1
相同的查询可以在不进行聚合的情况下通过以下方式表示:
SELECT t1.myId
FROM Table1 t1
where exists
(select 1 from table1 t2 t1.c1=t2.c1 and t1.c2=t2.c2 and t1.c3=t2.c3 and t1.myid<t2.myid)
实际上,我最终创建了一个临时表,选择了它的所有ID。 然后,在意识到重复大约为20%时,我禁用了主表上的所有其他索引,删除了重复的行并重建了索引。。。
整个操作刚刚完成:总共3小时。。。还不错……我相信排序与聚合有关,但。。。您可以尝试从表1中选择1。。。看看会发生什么。@KubaWyrostek Hummm仍然在那里!这是一个很好的捕获…72%的什么?请分享你的执行计划。