Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Выборка уникальных записей без DISTINCT... [D5, D6, IB6.x, Firebird]


Sirus ©   (2004-04-07 07:32:00) 

Привет Мастера...
Есть проблема: Есть запрос
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 14:58:00) [1]

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 секунд быстрее...


Deniz   (2004-04-07 14:44:00) [2]

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:10:00) [3]

Да это то же самое что и between


Anatoly Podgoretsky   (2004-04-07 13:25:00) [4]

Нет это противоположное, это включает диапазон, а у него исключая диапазон


roottim   (2004-04-07 13:23:00) [5]

2Sirus ©   (07.04.04 12:55) [10]
смотри планы последнего запроса... он должен использовать индекс..
а вот это t.BDATE<=:IN_DATE and t.EDATE>=:IN_DATE
я не понялл.. наверно тоже самое что
:IN_DATE between t.BDATE and t.EDATE


Sirus   (2004-04-07 12:55:00) [6]

Если убрать
    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

то все идет нормально


Sirus   (2004-04-07 12:51:00) [7]

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. Планы я не смотрел, (не знаю я с чем их едят :( )


Sergey13   (2004-04-07 09:09:00) [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-(


Жук   (2004-04-07 09:06:00) [9]

Здесь надо в сторону индексов смотреть.


Sirus   (2004-04-07 08:54:00) [10]

Опять забыл
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')


Sirus   (2004-04-07 08:52:00) [11]

> 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


Жук   (2004-04-07 08:17:00) [12]


> Sergey13 ©   (07.04.04 08:15) [2]

Не факт


Sergey13   (2004-04-07 08:15:00) [13]

Если я правильно понял, то запрос и так вернет все по одному разу, без distinct. А самому поверить сложно?


Жук   (2004-04-07 08:15:00) [14]

Группировкой.
Только не уверен, что это быстрее будет.


Sirus   (2004-04-07 08:10:00) [15]

Забыл дописать.
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'


Наверх

Титульная страница Поиск, карта сайта Написать письмо