2009-08-17 53 views
1

我有一个查询来获取具有一些额外条件的重复数据,但我觉得它不够快。任何解决方案使这个查询更快?查找重复SQL查询的更快方法

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 
+0

请问什么是视图定义?视图只是一个宏,它在查询中展开。 – gbn 2009-08-17 05:12:14

+0

v_listing是多个表的组合,但我想知道如果我们可以在不触及视图的情况下改进此sql。 – pang 2009-08-17 05:47:03

+0

您的查询速度有多慢?您运行的数据量是多少? – Jagannath 2009-08-17 05:59:17

回答

0

那么独此一家的变化应该有很大的帮助:

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 
+2

我建议不要采取第二种方式。 'min(code)'和'min(name)'最有可能并不总是在同一行上。 – Eric 2009-08-17 05:10:56

+0

我从来没有暗示过他们,原来的问题对它的要求有些不确定。 – RBarryYoung 2009-08-17 12:09:11

3

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 

还要确保对所有的连接列的索引。这也会极大地加快速度。