Ключевое слово SQL Distinct снижает производительность? - PullRequest
6 голосов
/ 17 марта 2011

Я получил запрос SQL, в котором используется отдельное ключевое слово. Когда я попытался выполнить запрос, потребовалось не менее минуты, чтобы объединить две таблицы с сотнями тысяч записей и фактически что-то вернуть.

Затем я вынул отчетливое, и оно вернулось через 0,2 секунды. Действительно ли отличное ключевое слово делает вещи такими плохими?

РЕДАКТИРОВАТЬ: вот запрос


SELECT Distinct
c.username, o.orderno, o.totalcredits, o.totalrefunds,
o.recstatus, o.reason 

from management.contacts c 
join management.orders o
on (c.custID = o.custID)
where o.recDate > to_date('2010-01-01', 'YYYY/MM/DD')

Ответы [ 4 ]

6 голосов
/ 17 марта 2011

Да, поскольку использование DISTINCT приведет (иногда в соответствии с комментарием) к упорядочению результатов. Сортировка сотен записей занимает время.

Попробуйте GROUP BY все свои столбцы, иногда оптимизатор запросов может выбрать более эффективный алгоритм (по крайней мере, с Oracle я заметил значительный прирост производительности).

3 голосов
/ 17 марта 2011

Distinct всегда вызывает у меня тревогу - это обычно означает плохой дизайн стола или разработчика, который не уверен в себе. Он используется для удаления дублирующихся строк, но если соединения правильные, это редко требуется. И да, его использование обходится дорого.

Какой первичный ключ таблицы заказов? Предполагая, что это orderno, этого должно быть достаточно, чтобы гарантировать отсутствие дубликатов. Если это что-то еще, то вам, возможно, придется сделать немного больше с запросом, но вы должны поставить перед собой цель устранить эти различия! ; -)

Кроме того, вы упомянули, что при проверке количества строк запрос выполнялся не сразу - часто можно быстрее заключить весь запрос в «select count (*) from ()», особенно если вы получаете большое количество строк возвращается. Просто пока вы тестируете, очевидно. ; -)

Наконец, убедитесь, что вы проиндексировали custID в таблице заказов (и, возможно, тоже recDate).

2 голосов
/ 17 марта 2011

Цель DISTINCT - удалить дубликаты записей из набора результатов для всех выбранных столбцов.

  • Если какой-либо из выбранных столбцов является уникальным после объединения, вы можете удалить DISTINCT.
  • Если вы этого не знаете, но знаете, что комбинация значений выбранного столбца уникальна, вы можете удалить DISTINCT.

На самом деле, обычно, с правильно спроектированными базами данных вам редко требуется DISTINCT, и в тех случаях, когда вы это делаете, очевидно (?), Что вам это нужно.Однако СУБД не может оставить это на волю случая, и для ее создания необходимо создать структуру индексации.

Обычно вы обнаруживаете DISTINCT повсюду, когда люди не уверены в соединениях и взаимосвязях между таблицами.

Кроме того, в классах, когда речь идет о чистых реляционных базах данных, где результат должен быть правильным набором (без повторяющихся элементов = записей), вы можете обнаружить, что люди часто вставляют DISTINCT, чтобы гарантировать это свойство для целей.теоретической правильности.Иногда это проникает в производственные системы.

0 голосов
/ 17 марта 2011

Вы можете попытаться создать группу следующим образом:

  SELECT c.username, 
         o.orderno, 
         o.totalcredits, 
         o.totalrefunds,
         o.recstatus, 
         o.reason
    FROM management.contacts c,
         management.orders o
   WHERE c.custID = o.custID
     AND o.recDate > to_date('2010-01-01', 'YYYY-MM-DD')
GROUP BY c.username, 
         o.orderno, 
         o.totalcredits, 
         o.totalrefunds,
         o.recstatus, 
         o.reason 

Также проверьте, есть ли у вас индекс o.recDate

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...