Форум: "Базы";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
ВнизВыборка уникальных записей без DISTINCT... Найти похожие ветки
← →
Sirus © (2004-04-07 07:32) [0]Привет Мастера...
Есть проблема: Есть запросselect distinct s.SUBS_CODE, t.CODE from HST_SUBS s, HST_ETRF t
where s.SUBS_CODE=t.SUBS_CODE
Можно ли организовать этот же запрос без DISTINCT,
а то выборка длится ужасно долго...
Записи в HST_SUBS уникальны, каждой записи HST_SUBS в таблице HST_ETRF соответствуют несколько записей с одинаковым значением поля CODE
← →
Sirus © (2004-04-07 08:10) [1]Забыл дописать.
select distinct s.SUBS_CODE, t.CODE from HST_SUBS s, HST_ETRF t
where s.SUBS_CODE=t.SUBS_CODE and t.CODE="0001"
← →
Sergey13 © (2004-04-07 08:15) [2]Если я правильно понял, то запрос и так вернет все по одному разу, без distinct. А самому поверить сложно?
← →
Жук © (2004-04-07 08:15) [3]Группировкой.
Только не уверен, что это быстрее будет.
← →
Жук © (2004-04-07 08:17) [4]
> Sergey13 © (07.04.04 08:15) [2]
Не факт
← →
Sirus © (2004-04-07 08:52) [5]> Sergey13 ©
Нет, так как для каждой записи из HST_SUBS соответствуют 5-6 записей из HST_ETRF с одинаковы значением поля CODE (там только даты разные).
В принципе мне нужно только поле SUBS_CODE
Вполне бы сошел вариантselect s.SUBS_CODE from HST_SUBS s
where exists (select t.CODE from HST_ETRF
where t.SUBS_CODE=s.SUBS_CODE)
но это работает еще медленнее чем DISTINCT,
а группировка дает те же результаты по времени что и DISTINCT
← →
Sirus © (2004-04-07 08:54) [6]Опять забыл
select s.SUBS_CODE from HST_SUBS s
where exists (select t.CODE from HST_ETRF
where t.SUBS_CODE=s.SUBS_CODE and t.CODE="0001")
← →
Жук © (2004-04-07 09:06) [7]Здесь надо в сторону индексов смотреть.
← →
Sergey13 © (2004-04-07 09:09) [8]2Sirus © (07.04.04 08:54) [6]
1.Сколько записей в таблицах?
2.Какие индексы есть?
3.Ужасно долго - это сколько?
4.План смотрел?
2Жук © (07.04.04 08:17) [4]
2Sirus © (07.04.04 08:52) [5]
Да я не прав был, не внимательно прочитал вопрос. 8-(
← →
Sirus © (2004-04-07 12:51) [9]1. Записей в первой таблице 25000, во второй 145000
2. Индексы есть по полям HST_SUBS.SUBS_CODE, HST_ETRF.SUBS_CODE, HST_ETRF.CODE, HST_ETRF.BDATE
3. Ужасно долго это 3 минуты на 838 записей из первой таблицы
полный SQL самого быстрого варианта:select p.TTL_SUMM, p.ENR_SUMM, p.PWR_SUMM, p.NDS_SUMM, p.MN_SUMM, p.OTH_SUMM
from HST_SUBS s left join P_HST_BLNC(s.SUBS_CODE, :IN_DATE) p on 0=0
where s.FDR_CODE=:IN_FDR_CODE and s.CH_CODE<>"AD01"
and (select count(CODE) from HST_ETRF t
where t.SUBS_CODE=s.SUBS_CODE and t.CH_CODE<>"UD07" and t.CODE=:IN_TRF_CODE and
(t.BDATE<=:IN_DATE and t.EDATE>=:IN_DATE))>0
4. Планы я не смотрел, (не знаю я с чем их едят :( )
← →
Sirus © (2004-04-07 12:55) [10]Если убрать
and (select count(CODE) from HST_ETRF t
where t.SUBS_CODE=s.SUBS_CODE and t.CH_CODE<>"UD07" and t.CODE=:IN_TRF_CODE and
(t.BDATE<=:IN_DATE and t.EDATE>=:IN_DATE))>0
то все идет нормально
← →
roottim (2004-04-07 13:23) [11]2Sirus © (07.04.04 12:55) [10]
смотри планы последнего запроса... он должен использовать индекс..
а вот этоt.BDATE<=:IN_DATE and t.EDATE>=:IN_DATE
я не понялл.. наверно тоже самое что:IN_DATE between t.BDATE and t.EDATE
← →
Anatoly Podgoretsky © (2004-04-07 13:25) [12]Нет это противоположное, это включает диапазон, а у него исключая диапазон
← →
Sirus © (2004-04-07 14:10) [13]Да это то же самое что и between
← →
Deniz © (2004-04-07 14:44) [14]from HST_SUBS s left join P_HST_BLNC(s.SUBS_CODE, :IN_DATE) p on 0=0
Left join с процедурой?
... where s.FDR_CODE=:IN_FDR_CODE and s.CH_CODE<>"AD01" ...
Индексы есть?
and (select count(CODE) from HST_ETRF t
where t.SUBS_CODE=s.SUBS_CODE and t.CH_CODE<>"UD07" and
t.CODE=:IN_TRF_CODE and
(t.BDATE<=:IN_DATE and t.EDATE>=:IN_DATE))>0
Можно заменить на
and (exist(select 1 from HST_ETRF t ...))
← →
Sirus © (2004-04-07 14:58) [15]1. Можно было сделать for select SUBS_CODE from HST_SUBS, а потом уже для каждого SUBS_CODE выполнять P_HST_BLNC(:SUBS_CODE, :IN_DATE), только вот медленно тоже получалось...
2. Индекс на FDR_CODE есть, а поле CH_CODE может принимать всего лишь 3 значения.
3. В начале было exists, только потом я его убрал и заменил на select count... Так оказалось на 20-30 секунд быстрее...
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.028 c