2009-08-17 2 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

+0

v_listing - это комбинация нескольких таблиц, но я хочу знать, можем ли мы улучшить этот sql, не касаясь представления. – pang

+0

Как медленно ваш запрос? На каком количестве данных вы его запустили? – Jagannath

ответ

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

+0

Я никогда не предполагал, что они были, исходный вопрос был несколько неспецифичным по его требованиям. – RBarryYoung

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 

Кроме того, убедитесь, что у вас есть индексы по всем столбцам. Это также ускорит ситуацию.

Смежные вопросы