Вниз
Скачать: CL | DM;

Выборка уникальных записей без 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 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.021 c
1-1082200454
Alek_1
2004-04-17 15:14
2004.05.02
StringReplace


14-1081619144
VID
2004-04-10 21:45
2004.05.02
Сегодня здесь было скучно...


14-1081242454
serge35
2004-04-06 13:07
2004.05.02
Наконец-то азиаты решили написать операционку


3-1081333615
Kein
2004-04-07 14:26
2004.05.02
разрушение структуры таблицы


4-1078857378
Tofig Gasanov
2004-03-09 21:36
2004.05.02
Нестандартные окна..




   Наверх