【问题标题】:Faster way to find duplicate SQL query查找重复 SQL 查询的更快方法
【发布时间】:2010-11-20 03:35:45
【问题描述】:

我有一个查询来获取带有一些额外条件的重复数据,但我觉得它不够快。有什么解决方案可以让这个查询更快?

v_listing 包含大量信息

SELECT DISTINCT  code, name, comm, address, area 
FROM v_listing t1
WHERE EXISTS (SELECT NULL
                FROM v_listing t2
                WHERE t1.comm = t2.comm
                AND t1.address = t2.address
                AND t1.area = t2.area
                AND (t1.code > t2.code OR t1.code < t2.code))
ORDER BY comm, address, area

【问题讨论】:

  • 请问视图定义是什么?视图只是一个宏,它在查询中展开。
  • v_listing 是多个表的组合,但是我想知道我们是否可以在不接触视图的情况下改进这个sql。
  • 您的查询有多慢?你运行了多少数据?

标签: sql sql-server sql-server-2005 tsql optimization


【解决方案1】:

exists 子句执行半连接,这不是比较两个非常大的表的最佳方式。在这种情况下,它是一张桌子,但重点是存在的。你想做的是inner join:

SELECT DISTINCT  
    t1.code, 
    t1.name, 
    t1.comm, 
    t1.address, 
    t1.area 
FROM 
    v_listing t1
    inner join v_listing t2 on
        t1.comm = t2.comm
        AND t1.address = t2.address
        AND t1.area = t2.area
        AND t1.code <> t2.code
ORDER BY t1.comm, t1.address, t1.area

还要确保您在所有连接列上都有索引。这也将大大加快速度。

【讨论】:

    【解决方案2】:

    好吧,仅此一项更改就应该有很大帮助:

    SELECT DISTINCT code, name, comm, address, area
    FROM v_listing t1
    WHERE EXISTS ( SELECT NULL
            FROM v_listing t2
                WHERE t1.comm = t2.comm
                AND t1.address = t2.address
                AND t1.area = t2.area
                AND t1.code <> t2.code)
    ORDER BY comm, address, area
    

    或者,您可以这样做:

    SELECT comm, address, area, MIN(code), MAX(code), MIN(name), COUNT(*)
    FROM v_listing t1
    GROUP BY comm, address, area
    HAVING COUNT(*) > 2
    ORDER BY comm, address, area
    

    【讨论】:

    • 我建议不要使用第二种方式。 min(code)min(name) 很可能并不总是在同一行。
    • 我从来没有暗示他们是,最初的问题在它的要求上有些不具体。
    猜你喜欢
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 2010-09-23
    相关资源
    最近更新 更多