Главная страница
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.026 c
1-1082122683
ширинашрифта
2004-04-16 17:38
2004.05.02
каким образом подобрать ширину шрифта memo


1-1081935426
Аноним
2004-04-14 13:37
2004.05.02
Время с миллисекундами


1-1081858010
ЕвгенийК
2004-04-13 16:06
2004.05.02
Обладатели Delphi 5 или BCB 5 дайте DsgnIntf.dcu PLS!


14-1081838585
REA
2004-04-13 10:43
2004.05.02
Наследование


14-1081249300
Rule
2004-04-06 15:01
2004.05.02
Как вы относитесь к ценам на буржуйские компоненты