![]() |
| ||
|
|
Новости |
Поиск |
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), а Ораклы не хотят, только по оригинальному названию поля! :(
Sergey13 (2005-07-28 11:49:00) [21]2[55] rayrom © (28.07.05 11:39)
Что такое Ембасадеро? Не надо мне ничего слать. 8-)
Просто посмотри индексы и приведи порядок условий в where в соответствие с ними если возможно.
Так что с производительностью то? Лучше, хуже, также?
rayrom (2005-07-28 11:39:00) [22]2 Sergey13
Счас на мыло вышлю структуры авто и техосм, из Ембасадеро!
Sergey13 (2005-07-28 11:21:00) [23]2[53] rayrom © (28.07.05 10:11)
А как c производительностью? Можно попробовать еще ограничить 2 подзапрос
(SELECT to.NZA,MAX(to.key_nid) FROM TEX_OSM to,avt_new av WHERE av.NZA = to.NZA and av.prin_amt = 1 and av.act = 1 and av.cod_mr = '18'
group by nza) t
И какие есть индексы на avt_new? Иногда перестановка местами условий в where (сделать порядок как в индексе) дает ощутимые результаты.
Попробуй вставить SELECT /*+ RULE */s.name, to_char
rayrom (2005-07-28 10:11:00) [24]Премного благодарен Ольга, ваше предложение убрало повторение годов по одному типу транспорта -
group by s.name, to_char(tt.god_to,'YYYY')
Ольга (2005-07-28 10:04:00) [25]1. select gos_num from avt_new where ...
2. group by s.name, to_char(tt.god_to,'YYYY')
rayrom (2005-07-28 09:54:00) [26]Пришол к такому варианту но чтото не соображу где ошибка:SELECT
s.name, to_char(tt.god_to,'YYYY') yearto, count(a.gos_num) kolvo
FROM
(select * from avt_new where prin_amt = 1 and act = 1 and cod_mr = '18') a,
(SELECT NZA,MAX(key_nid) FROM TEX_OSM group by nza) t, tex_osm tt
t_amt_spr s
where a.NZA = t.NZA AND tt.key_nid = t.key_nid and a.tip_amt = s.codename
group by s.name, tt.god_to
ANB (2005-07-27 17:33:00) [27]
> Sergey13 © (27.07.05 16:44) [45]
- кстати, клевое решение проблемы, ща в копилочку себе скопирую . . .
ANB (2005-07-27 17:31:00) [28]
> rayrom © (27.07.05 17:06) [48]
Наоборот !!! Плюс у ораклистов зарплата выше. Вот ты сколько получаешь ?
rayrom (2005-07-27 17:06:00) [29]Даа, такой бред получится, ладно потом поэкперементим (Все равно МуСКЛ рулез, а Оракл - Ракло)
Sergey13 (2005-07-27 17:04:00) [30]2[46] rayrom © (27.07.05 16:54)
Я ж тебе болванку дал как идею, а не рабочий запрос.
rayrom (2005-07-27 16:54:00) [31]Выдает Invalid field name., ведь откуда будет братся to_char(t.god_to,'YYYY') yearto, если в выборке его нет?
Sergey13 (2005-07-27 16:44:00) [32]2[43] rayrom © (27.07.05 15:55)
А если нечто такое изобразить?
SELECT s.name, to_char(t.god_to,'YYYY') yearto, count(gos_num) kolvo
FROM
(select * from avt_new where prin_amt = 1 and act = 1 and cod_mr = '18') a, (SELECT NZA,MAX(key_nid) FROM TEX_OSM group by 1) t,
t_amt_spr s
where a.NZA = t.NZA AND a.tip_amt = s.codename
group by s.name, god_to
Подзапрос к техосмотрам можно ограничить еще и по авто.
rayrom (2005-07-27 15:57:00) [33]2 ANB, каким макаром, у меня доступа к серверу та нету, что сбегать за 100 км к серверу и спросить у разработчика который за 300 км находится. Я ж говорил могу только SELECT исполнять и все мои привелегии!
rayrom (2005-07-27 15:55:00) [34]Вот последняя редакция, она не отличается от первоначального, только тем что справчник последний связывается, и ксати чуть быстрее работает:
SELECT s.name, to_char(t.god_to,'YYYY') yearto, count(gos_num) kolvo
FROM avt_new a, tex_osm t, t_amt_spr s
where a.NZA = t.NZA and t.key_nid = (SELECT MAX(key_nid)
FROM TEX_OSM
WHERE a.NZA = tex_osm.NZA) AND a.tip_amt = s.codename
AND prin_amt = 1 and act = 1 and cod_mr = '18'
group by s.name, god_to
ANB (2005-07-27 15:53:00) [35]
> Важно еще как этот гектар распахан.
> rayrom © (27.07.05 15:49) [41]
Да, кстати, настройки памяти тоже лучше выложи. На неправильных настройках можно до 50% времени потерять.
rayrom (2005-07-27 15:49:00) [36]Кстати EXPLAIN PLAN - используется для получения плана, которому которому следует сервер базы данных при выполнении утвеждения СКЛ. Эта команда вставляет строку, описывающую пошаговый план выполнения, в указанную таблицу. (SQL Справочник программиста).
Это не то, мне нужно чтоб сервер показал как он выполняет выборку, вот что!
Sergey13 (2005-07-27 15:45:00) [37]2 [35] rayrom © (27.07.05 15:15)
8.1.5 - не самый лучший релиз по отзывам.
Производительность запроса зависит не только от самого запроса, но и от того как настроен Оракл, какие индексы и т.д.
Ты так и не даешь последнюю редакцию твоего запроса.
2[39] rayrom © (27.07.05 15:38)
>> так что 1 гектар неплохо бы и расширить
>Хотелось бы тока денег не выделяютя!
Важно еще как этот гектар распахан.
rayrom (2005-07-27 15:38:00) [38]> 1. Мускуль много клиентов просто не вытянет
Ага держал аж 218 штук.
> 2. Оракла оперативку любит,
Ага после 100 клиентов затыкатся начинает!
> так что 1 гектар неплохо бы и расширить
Хотелось бы тока денег не выделяютя!
> 3. Запрос нужно оптимизнуть и прохинтовать.
Во я и спросил как это сделать (вопрос по поводу explain)!
> 4. А структура базы/индексы в оракле и мс скуле одинаковые?
Полный дубликат (тока без тригерров, процедур, и т.п. что в MySQLe не поддерживается)
ANB (2005-07-27 15:26:00) [39]
> rayrom © (27.07.05 15:15) [35]
1. Мускуль много клиентов просто не вытянет
2. Оракла оперативку любит, так что 1 гектар неплохо бы и расширить
3. Запрос нужно оптимизнуть и прохинтовать.
4. А структура базы/индексы в оракле и мс скуле одинаковые ?
evvcom (2005-07-27 15:26:00) [40]
> А чего в 8 не хватает? И в какой 8?
Я с 8 не работал, поэтому сужу только по "слухам". Например, нет ни в одной 8, насколько мне известно, конструкции with, нет конструкции JOIN, а (+) вроде как Оракл в нескольких строках не позволяет. Аналитических функций по одним утверждениям в 8 нет, по другим вроде есть, точно не знаю. Может я и ошибаюсь, не знаю, повторю, что с 8 я не работал.