当前位置: 首页 > 面试题库 >

检查重复项时的最佳自连接技术

农飞星
2023-03-14
问题内容

我正在尝试优化正在生产中的查询,这需要很长时间。目标是根据匹配的字段值条件查找重复的记录,然后将其删除。当前查询通过t1.col1 =
t2.col1上的内部联接使用自联接,然后使用where子句检查值。

select * from table t1 
inner join table t2 on t1.col1 = t2.col1
where t1.col2 = t2.col2 ...

有什么更好的方法可以做到这一点?还是基于索引都一样?可能是

select * from table t1, table t2
where t1.col1 = t2.col1, t2.col2 = t2.col2 ...

该表有100m +行。

MS SQL,SQL Server 2008企业版

select distinct t2.id
    from table1 t1 with (nolock)
    inner join table1 t2 with (nolock) on  t1.ckid=t2.ckid
    left join table2 t3 on t1.cid = t3.cid and t1.typeid = t3.typeid
    where 
    t2.id > @Max_id and
    t2.timestamp > t1.timestamp and
    t2.rid = 2 and
    isnull(t1.col1,'') = isnull(t2.col1,'') and 
    isnull(t1.cid,-1) = isnull(t2.cid,-1) and
    isnull(t1.rid,-1) = isnull(t2.rid,-1)and 
    isnull(t1.typeid,-1) = isnull(t2.typeid,-1) and
    isnull(t1.cktypeid,-1) = isnull(t2.cktypeid,-1) and
    isnull(t1.oid,'') = isnull(t2.oid,'') and
    isnull(t1.stypeid,-1) = isnull(t2.stypeid,-1)

    and (
            (
                t3.uniqueoid = 1
            )
            or
            (
                t3.uniqueoid is null and 
                isnull(t1.col1,'') = isnull(t2.col1,'') and 
                isnull(t1.col2,'') = isnull(t2.col2,'') and
                isnull(t1.rdid,-1) = isnull(t2.rdid,-1) and 
                isnull(t1.stid,-1) = isnull(t2.stid,-1) and
                isnull(t1.huaid,-1) = isnull(t2.huaid,-1) and
                isnull(t1.lpid,-1) = isnull(t2.lpid,-1) and
                isnull(t1.col3,-1) = isnull(t2.col3,-1) 
            )
    )

问题答案:

为什么要自我加入:这是一个综合性问题。

希望您在col1,col2,…上有一个索引

--DELETE table
--WHERE KeyCol NOT IN (
select
    MIN(KeyCol) AS RowToKeep,
    col1, col2, 
from
    table
GROUP BY
    col12, col2
HAVING
   COUNT(*) > 1
--)

但是,这将需要一些时间。有一个看看批量删除技术



 类似资料:
  • 问题内容: 我们有一个应用程序,需要在创建时检测某些字段中的重复项。我们使用Hibernate作为持久层,并使用Spring的HibernateTemplate。我的问题是,最好是在创建之前对项目进行先期查找,还是尝试捕获DataIntegrityViolation异常,然后检查是否由重复的条目引起,是否更好。 问题答案: 这取决于重复是例外情况还是业务逻辑案例。 例如,在注册过程中检查唯一的电子

  • 我读过一些关于如何将Mongo与Node一起使用的指南,它们似乎都以不同的方式连接到数据库。对我来说很有效的一种特殊方式是: 然而,这对我来说似乎是低效/奇怪的,每次有时,我都必须重新连接到数据库,例如创建新用户或检索信息。 另一种似乎更适合我的方式是 我见过几个网站按照这些思路做了一些事情,但我个人无法让上面的工作。我一直收到错误服务器端。所以,我的问题是为什么上面的代码不起作用,如果第一个代码

  • 问题内容: 目前,我们正在使用带有8gb RAM的4个cpu窗口框,并在同一框上安装了MySQL5.x。我们正在为应用程序使用Weblogic应用程序服务器。我们的应用程序目标是200个并发用户(显然不是同一模块/屏幕)。那么,我们应该在连接池中配置的最佳连接数是多少(最小和最大数)(我们正在使用weblogic AS的连接池机制)? 问题答案: 这个问题有一个非常简单的答案: 连接池中的连接数应

  • 问题内容: 我有一个数组,其中填充了6个随机生成的数字。首先,它生成一个介于1和49之间的随机数,然后将其与数组中的数字进行比较。如果发现重复,则应再次生成一个随机数,然后再次执行检查。如果没有重复项,则将数字添加到数组中。 这是代码: 但是,由于某种原因,它仍然允许重复,尽管很少(大约50个数组中的1个),例如。但是,当我尝试通过取出随机数元素并使用30这样的数字来重复此操作时,我无法重现结果。

  • 我使用设置用户名的唯一约束,在将数据插入数据库之前检查重复值的最佳做法是什么? 通过捕获当您尝试插入具有相同用户名的数据时程序将引发的异常

  • 问题内容: 在插入数据库之前,我正在使用以下代码检查重复项。对我来说,重复的只考虑重复时,,,,和比赛。 每个值都是在执行此检查之前定义的,由于项目已经存在,所以我的结果总是返回。我转储了“ dupesql”并将命令复制/粘贴到phpmyadmin中,该计数返回0。 问题答案: 您要执行以下操作: 有关更多信息,请参见此处。