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), а Ораклы не хотят, только по оригинальному названию поля! :(


Sergey13   (2005-07-29 10:45:00) [1]

2[75] rayrom ©   (29.07.05 10:42)
>Да нету у меня его
Что это за оракловый клиент без Плюса?


rayrom   (2005-07-29 10:42:00) [2]

Да нету у меня его, я через ОДБСишный драйвер работаю, я хотел Ораклы 9 купить (3 диска), дык пиратка тоже дорогая 15 у.е. для меня это накладно при зряплате в 110 у.е.
И скорее всего остановлюсь на последнем запросе [61]!


Sergey13   (2005-07-29 10:31:00) [3]

Попробуй через SQLPlus
и попробуй
group by s.name,  to_char(tt.god_to,'YYYY')


rayrom   (2005-07-29 10:11:00) [4]

2 k2, Sergey13
Не знаю, я через SQL Explorer работаю, другого нет, говорит что неверное имя и все а какое х.е.з.


k2   (2005-07-29 10:08:00) [5]

to [69] rayrom ©   (29.07.05 10:03)
ээ и што пишет?


Sergey13   (2005-07-29 10:08:00) [6]

2[70] rayrom ©   (29.07.05 10:05)
Какое? Исправить что ли нельзя?


rayrom   (2005-07-29 10:05:00) [7]

2 Sergey13 По поводу запроса [51], не работает пишет что неверное имя поля!


rayrom   (2005-07-29 10:03:00) [8]

2 k2 Да есть, уже проходили, не работает ошибку выдает!


Sergey13   (2005-07-29 09:59:00) [9]

2[66] rayrom ©   (29.07.05 09:44)
А что с запросом из [51]? Там как было с шустростью? Просто интересно.

ЗЫ: Для просмотра статистики, кстати, в СКЛПлюсе можно набрать
set autotrace on
Будет и план и статистика.


k2   (2005-07-29 09:59:00) [10]

rayrom ©   (29.07.05 09:44)
А преобразование to_number(to_char(t.god_to,'YYYY')) для правильной сортировки...I>
если только для сортировки то есть ещё trunc(in_date,'RRRR') возвращает дату
вроде в восьмерке уже был?


rayrom   (2005-07-29 09:44:00) [11]

2 Sergey13
Как я понял скорее всего это зависит от последовательности условий в WHERE, думаю что, условия обрабатываются с лева на право, т.е. соответственно изначально пошло ограничение на колличесво отобранных записей для дальнейших условий и связываний! А то что стоит в SELECT уже выполняется после условий хотя х.з.


Sergey13   (2005-07-29 09:38:00) [12]

2[61] rayrom ©   (29.07.05 09:17)
>Итог, последний вариант запроса который я оставляю -
>В таком варианте запрос выполняется на 10-20% быстрее!

Неужели to_number(to_char дало прирост в 10-20%? Это интересно. Других отличий от первого варианта я не нашел.


rayrom   (2005-07-29 09:30:00) [13]

2 evvcom Ты наверно не понял сам смысл запроса!
Запрос для начальства, ему нужно видеть (в DesicionCube), состояние прохождения техосмотров по типу транспорта и в каком году в группе типа - скока автобусов прошло в этом году и сколько еще не прошло осталось т.е. предыдущие года!
А так как таблица техосмотров накопительная то и идет выборка (SELECT MAX(key_nid)
         FROM TEX_OSM
         WHERE a.NZA = tex_osm.NZA)

для получения последнего техосмотра по данному транспорту, а как выглядит запрос ему и нафиг не надо (начальству), главное результат!!!


evvcom   (2005-07-29 09:23:00) [14]


> для правильной сортировки

А где она? И почему не оставить просто t.god_to? Клиент сам сможет отобразить только год. Дополнительная потеря времени, имхо.

> where prin_amt = 1 and act = 1 and cod_mr = '18'

Почему не используешь алиасы? Ведь кто потом будет разбираться, будет искать эти поля по всем таблицам и материть тебя по чем свет!


rayrom   (2005-07-29 09:21:00) [15]

Хотя конечно преобразование to_number(to_char(t.god_to,'YYYY')) yeartoвыглядит как через ж..у, в МуСкуле проще Year(t.god_to) as yearto.
В принципе у любой РБД есть свои плюсы и мынусы, толького у кого чего больше и их значимость решает использование а не маркетинговая политика, и если это будет так то реляционки будут впереди планеты всей ;)


rayrom   (2005-07-29 09:17:00) [16]

Итог, последний вариант запроса который я оставляю -
SELECT s.name, to_number(to_char(t.god_to,'YYYY')) yearto, count(gos_num) kolvo
FROM avt_new a, tex_osm t, t_amt_spr s
where prin_amt = 1 and act = 1 and cod_mr = '18' AND 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

group by s.name, to_number(to_char(t.god_to,'YYYY'))

В таком варианте запрос выполняется на 10-20% быстрее!
А преобразование to_number(to_char(t.god_to,'YYYY'))для правильной сортировки.


Sergey13   (2005-07-28 12:24:00) [17]

[48] rayrom ©   (27.07.05 17:06)
>(Все равно МуСКЛ рулез, а Оракл - Ракло)

2[59] rayrom ©   (28.07.05 12:17)
По тому, что ты уже раз 5 не ответил на вопрос о производительности я заключаю, что МуСкул занял таки подобающую позицию по отношению к Ораклу. 8-)


rayrom   (2005-07-28 12:17:00) [18]

Запрос не частый примерно 1-3 раза вдень, ну и фиг сним, потом еще посмотрю, может чето переделаю! Спасибо всем за помощь!!!


Sergey13   (2005-07-28 12:10:00) [19]

Блин. Не шибко информативная штука.
Насколько я понял, индекс у avt_new есть только по cod_mr. Вот и попробуй его поставить первым в условии. А желателен (для этого запроса) индекс по cod_mr+prin_amt+act+NZA.
Если этот запрос частый, то может и стОит подумать о создании такого индекса.
Так что с производительностью то запроса все таки?


rayrom   (2005-07-28 11:51:00) [20]

Embarcadero ER/Studio, the award-winning data modeling application for logical and physical database design and construction. ER/Studio's powerful, multi-level design environment addresses the everyday needs of database administrators, developers and data architects who build and maintain large, complex database applications. Its progressive interface and processes have been logically organized to effectively address the 'ease-of-use' issues that have plagued data modeling tools for the past decade. The application facilitates your ability to create, understand and manage the mission-critical database designs within an enterprise. It offers strong logical design capabilities, bi-directional synchronization of logical and physical designs, automatic database construction and Java application generation, accurate reverse-engineering of databases, and powerful HTML-based documentation and reporting facilities.


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

Наверх

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