Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];

Вниз

Выборка уникальных записей без 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.032 c
7-1078411581
Vlad25
2004-03-04 17:46
2004.05.02
WinIO


4-1074747407
GrayFace
2004-01-22 07:56
2004.05.02
Есть ProcessId Как получить hProcess, его ветки, юзера, %CPU?


14-1081538326
pirat
2004-04-09 23:18
2004.05.02
наблюдение любопытного


9-1069828528
Eagle Owl
2003-11-26 09:35
2004.05.02
Конвертирование 3ds-файлов в x-файлы...


4-1078152750
v][x
2004-03-01 17:52
2004.05.02
Job Object или CreateProcess





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский