Коллеги! Мне нужно оптимизировать SELECT запрос, который использует keyword DISTINCT так, чтобы этого кейворда не было, но повторяющиеся записи не выбирались. Подозреваю, что это мона сделать с помощью хитрых join-ов, но не могу их придумать. Мот кто сталкивался с такой проблемой — подскажите пжлст.
Здравствуйте, dvd00, Вы писали:
D>Коллеги! Мне нужно оптимизировать SELECT запрос, который использует keyword DISTINCT так, чтобы этого кейворда не было, но повторяющиеся записи не выбирались. Подозреваю, что это мона сделать с помощью хитрых join-ов, но не могу их придумать. Мот кто сталкивался с такой проблемой — подскажите пжлст.
Универсальный метод один — использовать вместо DISTINCT GROUP BY.
На деле же необходимость в DISTINCT как правило означает некорректный запрос либо плохо спроектированную базу. В первую очередь надо понять, откуда идет дублирование записей. Достаточно часто это результат некорректной структуры запроса, в который втягиваются лишние записи (которые потом и приходится подавлять).
Если же причина в данных — тут так или иначе надо давить дубли. Постановка задачи заставляет предположить, что этот запрос необходимо втиснуть в прокрустово ложе какого-то стандартного генератора, поэтому ключевой вопрос — а какие еще ограничения?
Здравствуйте, 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.
джойном(даже хитрым) имхо это сделать нельзя.
Здравствуйте, Softwarer, Вы писали:
S>Здравствуйте, dvd00, Вы писали:
D>>Коллеги! Мне нужно оптимизировать SELECT запрос, который использует keyword DISTINCT так, чтобы этого кейворда не было, но повторяющиеся записи не выбирались. Подозреваю, что это мона сделать с помощью хитрых join-ов, но не могу их придумать. Мот кто сталкивался с такой проблемой — подскажите пжлст.
S>Универсальный метод один — использовать вместо DISTINCT GROUP BY.
S>На деле же необходимость в DISTINCT как правило означает некорректный запрос либо плохо спроектированную базу. В первую очередь надо понять, откуда идет дублирование записей. Достаточно часто это результат некорректной структуры запроса, в который втягиваются лишние записи (которые потом и приходится подавлять).
S>Если же причина в данных — тут так или иначе надо давить дубли. Постановка задачи заставляет предположить, что этот запрос необходимо втиснуть в прокрустово ложе какого-то стандартного генератора, поэтому ключевой вопрос — а какие еще ограничения?
На самом деле моя задача состоит в рефакторинге сторед-процедуры с целью увеличения ее быстродействия. Править структуру БД низя никоим образом — она кривая и клиент будет против Поэтому вот главные ограничения: структуру таблиц не трогать, скорость работы процедуры увеличить (это скорее требование). Все что мона было в этой процедуре я поправил, стало немного быстрее, и вот осталось убрать энтот дистинкт, чтобы работало еще быстрее.
Здравствуйте, dvd00, Вы писали:
D>На самом деле моя задача состоит в рефакторинге сторед-процедуры с целью увеличения ее быстродействия. Править структуру БД низя никоим образом — она кривая и клиент будет против Поэтому вот главные ограничения: структуру таблиц не трогать, скорость работы процедуры увеличить (это скорее требование). Все что мона было в этой процедуре я поправил, стало немного быстрее, и вот осталось убрать энтот дистинкт, чтобы работало еще быстрее.
Оптимизация запроса — это вообще отдельная песня. Насколько я помню, кто-то здесь говорил, что в MS SQL distinct то ли заметно быстрее group by, то ли наоборот. В Oracle, например, они не то что одинаковы — физически одинаково выполняются.
Из общих соображений — надо все-таки посмотреть, из данных ли идет это дублирование, либо из плохо сконструированного запроса. Поскольку бывает, что в запросе оказывается что-нибудь типа select distinct master_id from details. На самом деле я не помню ни одного случая, когда мне приходилось в программе использовать distinct — каждый раз оказывалось, что вместо этого надо аккуратнее написать запрос.
Здравствуйте, 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 нет необходимости в сортировке строк.