![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Выборка уникальных записей без 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'