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

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

Необходимо сократить или оптимизировать запрос! [D7]


Страницы:   1 2 3 4

rayrom ©   (2005-07-26 15:44:00) 

Необходимо сократить или оптимизировать запрос:
SELECT s.desc, to_char(t.godto,'YYYY') yearto, count(gosnum) kolvo
FROM avto a, texosm t, amt_spr s
where a.NZA = t.NZA AND a.tip_avt = s.codename and t.keyuin = (SELECT MAX(keyuin)
          FROM TEXOSM
          WHERE a.NZA = texosm.NZA)
AND prin_avt = 1 and akt = 1 and cod = '10'
group by s.desc, godto

где amt_spr - справочник типов
texosm - таблица техосмотров (накопительная система запрос (SELECT MAX(keyuin) FROM TEXOSM WHERE a.NZA = texosm.NZA) определяет последнюю запись)
avto – таблица автотранспорта.
Через to_char(t.godto,'YYYY') я откусываю из дата год для вывода
count(gosnum) определяю количество транспорта
s.desc – название типа транспорта (их не много 16 штук)
prin_avt = 1 – определяю принадлежность (значения 0 или 1)
act = 1 – что он активный
cod = '10' – что нашего региона.
Так вот процесс идет очень долго, особенно по личному транспорту (~2 000 000 записей), и данные которые я получаю при группировке не получаются типа:
1 – 2005 – 250
2 – 2005 – 377
2 – 2004 – 400 …
а получаю типа такого
1 – 2005 – 120
1 – 2005 – 110
1 – 2005 – 20 …
Как это, во-первых, ускорить, а во-вторых, получить полную группировку!

З.Ы. В МуСКЛе я мог группировать по названию получаемого поля (select year(godto) as yearto …. group by yearto), а Ораклы не хотят, только по оригинальному названию поля! :(


rayrom   (2005-07-27 11:11:00) [61]

Вообщето я тут подумал, посмотрите такой вариант -
SELECT s.desc, to_char(t.godto,'YYYY') yearto, count(gosnum) kolvo
FROM avto a, texosm t, amt_spr s
where a.NZA = t.NZA AND a.tip_avt = s.codename and t.keyuin = (SELECT MAX(keyuin)
         FROM TEXOSM
         WHERE a.NZA = texosm.NZA AND а.prin_avt = 1 and а.akt = 1 and а.cod = '10' )
group by s.desc, godto

В принципе будет ли тоже самое?


evvcom   (2005-07-27 11:10:00) [62]


> (+)

Для INNER JOIN это лишнее. (+) нужен, если {LEFT|RIGHT|FULL} JOIN.

> версия ораклов 8,

Вообще-то на форуме принято СУБД указывать в заголовке. Для Оракла очень важна также и версия. Про Оракла где-то в тексте промелькнуло, а вот про версию по-моему нигде ни слова не было. Делайте выводы.


rayrom   (2005-07-27 11:06:00) [63]


> Sergey13

Ну дык это уже было, то же что и просто =


Sergey13   (2005-07-27 11:00:00) [64]

SELECT *
FROM avto a, texosm t
where a.NZA = t.NZA (+)

выдаст все авто (даже если они не проходили ТО) с данными о ТО (у непроходивших будут пустые ТО-шные поля).
Не то?


ANB   (2005-07-27 10:32:00) [65]


> Sergey13 ©   (27.07.05 10:24) [10]

И в 9 нету.


rayrom   (2005-07-27 10:31:00) [66]

2 Sergey13
Об єтом поподробнее плз, у меня нет нормальной доки, только по версии 7.


Sergey13   (2005-07-27 10:24:00) [67]

[9] rayrom ©   (27.07.05 10:17)
>Хорошо еслиб все так просто, только про INNER JOIN придется забыть, версия ораклов 8, там JOIN ни в каком виде нету!

(+)


rayrom   (2005-07-27 10:17:00) [68]

2 evvcom
Хорошо еслиб все так просто, только про INNER JOIN придется забыть, версия ораклов 8, там JOIN ни в каком виде нету!


evvcom   (2005-07-26 16:59:00) [69]

SELECT
 s.desc,
 to_char(t.godto,'YYYY') yearto,
 count(gosnum) kolvo
FROM avto a
 INNER JOIN texosm t
   ON t.NZA = a.NZA
 INNER JOIN amt_spr s
   ON s.codename = a.tip_avt
 INNER JOIN (
   SELECT
     to.NZA,
     MAX(to.keyuin) keyuin
   FROM TEXOSM to
   GROUP BY to.NZA
 ) q
   ON q.NZA = a.NZA AND
      q.keyuin = t.keyuin
where prin_avt = 1 and akt = 1 and cod = '10' -- здесь тоже используй синонимы, нагляднее
group by s.desc, t.godto

Примерно так, писал прямо здесь, должно работать.


Sergey13   (2005-07-26 16:18:00) [70]

2[6] rayrom ©   (26.07.05 16:09)
Нет ее у меня.
У тебя похоже подзапрос с МАХ-ом делается на каждую запись из авто. Я предложил сначала ограничить ее, а потом соединять. Можно попробовать выбрать предварительно все из TEXOSM. типа
SELECT NZA,MAX(keyuin) FROM TEXOSM group by 1
и заделать это вместо TEXOSM во From головного запроса.


rayrom   (2005-07-26 16:09:00) [71]

2 Sergey13 ©   (26.07.05 16:05)
Если есть Аська кинь на мыло все объясню!!!


Sergey13   (2005-07-26 16:05:00) [72]

2[4] rayrom ©   (26.07.05 16:03)
А кто тебя об этом просил?


rayrom   (2005-07-26 16:03:00) [73]

К сожелению база не моя, и менять или что либо создавать не имею никакого права, только выборки и все!


Sergey13   (2005-07-26 15:56:00) [74]

А индексы какие есть? А план что говорит?
Я бы в первую очередь вместо
FROM avto a
попробовал сделать
FROM (select * from avto where prin_avt = 1 and akt = 1 and cod = '10' ) a


Fay   (2005-07-26 15:56:00) [75]

2 rayrom ©   (26.07.05 15:44)
Дай скрипты для создания таблиц - будет проще ваять.


ANB   (2005-07-26 15:50:00) [76]

1. Индексы.
2.
> Ораклы не хотят, только по оригинальному названию поля!
> :(
- используй вложенный запрос. И будет тебе счастье.


Страницы:   1 2 3 4

Наверх

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