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