Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TSQL-任何分组依据_Sql_Sql Server_Tsql - Fatal编程技术网

TSQL-任何分组依据

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列是否足以进行此查询:

在我的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;
在表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%的什么?请分享你的执行计划。