Убрать DISTINCT из SELECT
От: dvd00  
Дата: 20.09.04 07:32
Оценка:
Коллеги! Мне нужно оптимизировать SELECT запрос, который использует keyword DISTINCT так, чтобы этого кейворда не было, но повторяющиеся записи не выбирались. Подозреваю, что это мона сделать с помощью хитрых join-ов, но не могу их придумать. Мот кто сталкивался с такой проблемой — подскажите пжлст.
Re: Убрать DISTINCT из SELECT
От: Softwarer http://softwarer.ru
Дата: 20.09.04 07:45
Оценка:
Здравствуйте, dvd00, Вы писали:

D>Коллеги! Мне нужно оптимизировать SELECT запрос, который использует keyword DISTINCT так, чтобы этого кейворда не было, но повторяющиеся записи не выбирались. Подозреваю, что это мона сделать с помощью хитрых join-ов, но не могу их придумать. Мот кто сталкивался с такой проблемой — подскажите пжлст.


Универсальный метод один — использовать вместо DISTINCT GROUP BY.

На деле же необходимость в DISTINCT как правило означает некорректный запрос либо плохо спроектированную базу. В первую очередь надо понять, откуда идет дублирование записей. Достаточно часто это результат некорректной структуры запроса, в который втягиваются лишние записи (которые потом и приходится подавлять).

Если же причина в данных — тут так или иначе надо давить дубли. Постановка задачи заставляет предположить, что этот запрос необходимо втиснуть в прокрустово ложе какого-то стандартного генератора, поэтому ключевой вопрос — а какие еще ограничения?
Re: Убрать DISTINCT из SELECT
От: PPA Россия http://flylinkdc.blogspot.com/
Дата: 20.09.04 08:55
Оценка:
Здравствуйте, dvd00, Вы писали:

D>Коллеги! Мне нужно оптимизировать SELECT запрос, который использует keyword DISTINCT так, чтобы этого кейворда не было, но повторяющиеся записи не выбирались. Подозреваю, что это мона сделать с помощью хитрых join-ов, но не могу их придумать. Мот кто сталкивался с такой проблемой — подскажите пжлст.


Не совсем очевидна твоя "проблема".
А какой смысл избавится от этого слова... ухо режет ?

Дубли убрать из набора данных без кей слова DISTINCT можно так:

1.
select a,b,c from t
group by a,b,c
2.
select a,b,c from t
union
select a,b,c from t where 1=2
3.
джойном(даже хитрым) имхо это сделать нельзя.
... << RSDN@Home 1.1.4 beta 3 rev. 188>>
Re[2]: Убрать DISTINCT из SELECT
От: dvd00  
Дата: 20.09.04 09:19
Оценка:
Здравствуйте, Softwarer, Вы писали:

S>Здравствуйте, dvd00, Вы писали:


D>>Коллеги! Мне нужно оптимизировать SELECT запрос, который использует keyword DISTINCT так, чтобы этого кейворда не было, но повторяющиеся записи не выбирались. Подозреваю, что это мона сделать с помощью хитрых join-ов, но не могу их придумать. Мот кто сталкивался с такой проблемой — подскажите пжлст.


S>Универсальный метод один — использовать вместо DISTINCT GROUP BY.


S>На деле же необходимость в DISTINCT как правило означает некорректный запрос либо плохо спроектированную базу. В первую очередь надо понять, откуда идет дублирование записей. Достаточно часто это результат некорректной структуры запроса, в который втягиваются лишние записи (которые потом и приходится подавлять).


S>Если же причина в данных — тут так или иначе надо давить дубли. Постановка задачи заставляет предположить, что этот запрос необходимо втиснуть в прокрустово ложе какого-то стандартного генератора, поэтому ключевой вопрос — а какие еще ограничения?


На самом деле моя задача состоит в рефакторинге сторед-процедуры с целью увеличения ее быстродействия. Править структуру БД низя никоим образом — она кривая и клиент будет против Поэтому вот главные ограничения: структуру таблиц не трогать, скорость работы процедуры увеличить (это скорее требование). Все что мона было в этой процедуре я поправил, стало немного быстрее, и вот осталось убрать энтот дистинкт, чтобы работало еще быстрее.
Re[3]: Убрать DISTINCT из SELECT
От: Softwarer http://softwarer.ru
Дата: 20.09.04 09:46
Оценка:
Здравствуйте, dvd00, Вы писали:

D>На самом деле моя задача состоит в рефакторинге сторед-процедуры с целью увеличения ее быстродействия. Править структуру БД низя никоим образом — она кривая и клиент будет против Поэтому вот главные ограничения: структуру таблиц не трогать, скорость работы процедуры увеличить (это скорее требование). Все что мона было в этой процедуре я поправил, стало немного быстрее, и вот осталось убрать энтот дистинкт, чтобы работало еще быстрее.


Оптимизация запроса — это вообще отдельная песня. Насколько я помню, кто-то здесь говорил, что в MS SQL distinct то ли заметно быстрее group by, то ли наоборот. В Oracle, например, они не то что одинаковы — физически одинаково выполняются.

Из общих соображений — надо все-таки посмотреть, из данных ли идет это дублирование, либо из плохо сконструированного запроса. Поскольку бывает, что в запросе оказывается что-нибудь типа select distinct master_id from details. На самом деле я не помню ни одного случая, когда мне приходилось в программе использовать distinct — каждый раз оказывалось, что вместо этого надо аккуратнее написать запрос.
Re: Убрать DISTINCT из SELECT
От: Strong  
Дата: 21.09.04 13:18
Оценка:
Здравствуйте, dvd00, Вы писали:

D>Коллеги! Мне нужно оптимизировать SELECT запрос, который использует keyword DISTINCT так, чтобы этого кейворда не было, но повторяющиеся записи не выбирались. Подозреваю, что это мона сделать с помощью хитрых join-ов, но не могу их придумать. Мот кто сталкивался с такой проблемой — подскажите пжлст.


Это можно сделать с помощью EXISTS.

Пример:

Select distinct t1.*
from t1, t2
where t1.id=t2.id


заменяется на:

Select t.* 
from t1 t
where exists (select * from t2 where t.id=t2.id)


Причем вариант 2 работает значительно быстрее, тк без Distinct нет необходимости в сортировке строк.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.