Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.02;
Скачать: 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 вся ветка

Текущий архив: 2004.05.02;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.025 c
3-1080953066
olhovik
2004-04-03 04:44
2004.05.02
База данных


9-1068757966
DDS
2003-11-14 00:12
2004.05.02
Проблемма с полигонами, корявые получаются


1-1082180972
oleg_v
2004-04-17 09:49
2004.05.02
Фокус


1-1082094458
Solik
2004-04-16 09:47
2004.05.02
GUI+Console


1-1082030354
Паша5
2004-04-15 15:59
2004.05.02
Компонент на формах