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

Вниз

Необходимо сократить или оптимизировать запрос!   Найти похожие ветки 

 
rayrom ©   (2005-07-26 15:44) [0]

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


 
ANB ©   (2005-07-26 15:50) [1]

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


 
Fay ©   (2005-07-26 15:56) [2]

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


 
Sergey13 ©   (2005-07-26 15:56) [3]

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


 
rayrom ©   (2005-07-26 16:03) [4]

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


 
Sergey13 ©   (2005-07-26 16:05) [5]

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


 
rayrom ©   (2005-07-26 16:09) [6]

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


 
Sergey13 ©   (2005-07-26 16:18) [7]

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


 
evvcom ©   (2005-07-26 16:59) [8]

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

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


 
rayrom ©   (2005-07-27 10:17) [9]

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


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

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

(+)


 
rayrom ©   (2005-07-27 10:31) [11]

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


 
ANB ©   (2005-07-27 10:32) [12]


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

И в 9 нету.


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

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

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


 
rayrom ©   (2005-07-27 11:06) [14]


> Sergey13

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


 
evvcom ©   (2005-07-27 11:10) [15]


> (+)

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

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

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


 
rayrom ©   (2005-07-27 11:11) [16]

Вообщето я тут подумал, посмотрите такой вариант -
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:24) [17]

Блин, ну вынеси ты этот подзапрос из where, посмотри как в [8]. То же это или не то же зависит от того, как оптимизатор твой запрос разрулит. Не знаю, но, возможно, твой код оптимизатор не может оптимизировать так, чтобы выполнить за 2 скана, поэтому приходится для каждого t.keyuin выполнять отдельно подзапрос. Я не настаиваю, но возможно это так.


 
rayrom ©   (2005-07-27 11:27) [18]


> evvcom

Пробывал в таком варианте, орет что мол много значений!


 
evvcom ©   (2005-07-27 11:37) [19]

Что значит "орет"? Код варианта и текст ошибки в студию. Я постоянно так делаю, и у меня не орет.


 
rayrom ©   (2005-07-27 12:02) [20]

Чесно говоря не нравится мне этот запрос, если логически рассуждать то нужно сделать в таком варианте-
Выбрать все НЗА для автомобилей по необходимым условиям, потом выбрать все последние записи для техосмотров в связки отобранных автомобильных НЗА, и то что получилосьсвязать со справочником и сгруппировать, аот только как энто реализовать чтото ума не приложу (ИМХО долбанутый Оракл!)


 
Sergey13 ©   (2005-07-27 12:05) [21]

2 [20] rayrom ©   (27.07.05 12:02)
Я тебе об этом и писАл в [3] и [7].

>(ИМХО долбанутый Оракл!)
Плохому танцору знаешь что мешает?


 
rayrom ©   (2005-07-27 12:14) [22]


> Sergey13

В том то и дело что не проходит такой вариан, возмущается Оракл, что слишком много значений!
Смотря что он танцует, в МуСКЛе я очень неплохо танцую, а ограниченность Ораклов меня уже достало (к примеру чтоб из даты вытащить год в числовом параметре нужно 2 преобразования делать в МуСКЛе 1 преобразование и т.п. и т.д.)!!! То что в МуСКЛ я могу за 2-3 минуты реализовать в Ораклах днями приходится сидеть и обсасывать варианты Ж(


 
rayrom ©   (2005-07-27 12:16) [23]

Тем более что я в Ораклах только 3 месяца!


 
Sergey13 ©   (2005-07-27 12:18) [24]

2[22] rayrom ©   (27.07.05 12:14)
>В том то и дело что не проходит такой вариан
Какой "такой"?

>Смотря что он танцует, в МуСКЛе я очень неплохо танцую,
Напомнает критику классического балета исполнителем народных танцев. 8-)


 
rayrom ©   (2005-07-27 12:24) [25]


> Sergey13 ©   (27.07.05 12:18) [24]
> Какой "такой"?

[3] + [7]!!!
Извини Модератор может чтото из офтопа скажу!

Дело в том что я с многими людьми пообщался по поводу Ораклов (которые давно работают с ним) и они согласились с моим мнением что разрекламированная марка которая не стоит того чтобы его так превозносить по 5 бальной шкале он занимает 3+ максимум!


 
Sergey13 ©   (2005-07-27 12:35) [26]

2[25] rayrom ©   (27.07.05 12:24)
Если ты хочешь холиваров, то я не хочу. Сходи на sql.ru в форум "Сравнение СУБД" если хочешь. Там этого добра - выше крыши.

А по сабжу - раз ты свой запрос тихаришь, как ты думешь тебе помогут?


 
rayrom ©   (2005-07-27 12:39) [27]

Нет Сергей просто небольшое отступление, просто пока я в Инете я не могу подрубится к базе и проверить запрос (чето ВПН подглюкивает), может мне просто поподробней описать что собственно я хочу?


 
Sergey13 ©   (2005-07-27 12:44) [28]

2[27] rayrom ©   (27.07.05 12:39)
>просто пока я в Инете я не могу подрубится к базе и проверить запрос
Но ты же говоришь про ошибку. Тебя и просили показать запрос и ошибку которую он выдал (я подозреваю это недопеределаный подзапрос с МАХом ругнулся).
Не хочешь - не надо. Я не настаиваю.


 
ANB ©   (2005-07-27 12:46) [29]


> rayrom ©   (27.07.05 12:24) [25]
Оракле рулит !!! Все проблемы в том, что ты на Оракле УЖЕ целых 3 месяца и его еще не выучил.


 
rayrom ©   (2005-07-27 14:21) [30]

Ладно есть еще один вопрос есть ли в Ораклах инструкция еxplain (эта инструкция пере оператором select в МуСКЛе показывает что где и как будет выбиратся, сколько, и какие индексы при этом используются)? Если есть, то вопрос мой мона закрывать, сам разберусь!


 
evvcom ©   (2005-07-27 14:51) [31]


> rayrom ©

Зря ты на Оракл наезжаешь. Ты его просто не знаешь. В конструкцию языка многие такие вещи добавили, о которых тебе и не снилось. Только для этого 8 версию в топку надо. Имхо. Уже 10 юзают, а ты все на 8 сидишь. Отсюда и ограничения. Уже даже 9 над 8 на порядок выше стоит, а что там в 10 даже не знаю.
А с MSSQL каким сравниваешь? А ты сравни сверстников.


 
Sergey13 ©   (2005-07-27 15:07) [32]

2[30] rayrom ©   (27.07.05 14:21)

EXPLAIN PLAN

2[31] evvcom ©   (27.07.05 14:51)
А чего в 8 не хватает? И в какой 8? Даже 8 и 8i разные.


 
Sergey13 ©   (2005-07-27 15:12) [33]

2[30] rayrom ©   (27.07.05 14:21)
А какой тулзой ты пользуешься для SQLя? В PLSQLDeveloper например такая возможность есть по кнопке. В ТОАДе тоже.


 
ANB ©   (2005-07-27 15:12) [34]


> Sergey13 ©   (27.07.05 15:07) [32]
- хе, в 8i столько наворотов, что я до сих еще не все фичи знаю, а уж про 9-10 я вообще молчу.


 
rayrom ©   (2005-07-27 15:15) [35]

На сервере в 100 км от меня база стоит Оракл версии 8.1.5.17 под Фрюхой, на двух Ксеонах, 1 ГБ озу, 60ГБх4 СКАЗИ винта в рейде, но при этом в том запросе что я сначала написал безбожно тормозит, он выполняется гдето от 3-15 минут в зависимости от загрузки сервера (клиентов много), а в мускуле такой же запрос выполняется от 20сек-2 мин (тоже от загрузки зависит) дык при етом комп на котором МуСКЛ стоит сел2.5, 512 МБ озу, винт 80 АТА 133!


 
rayrom ©   (2005-07-27 15:16) [36]

Да забыл добавить операционка Фря 5.1.


 
evvcom ©   (2005-07-27 15:26) [37]


> А чего в 8 не хватает? И в какой 8?

Я с 8 не работал, поэтому сужу только по "слухам". Например, нет ни в одной 8, насколько мне известно, конструкции with, нет конструкции JOIN, а (+) вроде как Оракл в нескольких строках не позволяет. Аналитических функций по одним утверждениям в 8 нет, по другим вроде есть, точно не знаю. Может я и ошибаюсь, не знаю, повторю, что с 8 я не работал.


 
ANB ©   (2005-07-27 15:26) [38]


> rayrom ©   (27.07.05 15:15) [35]

1. Мускуль много клиентов просто не вытянет
2. Оракла оперативку любит, так что 1 гектар неплохо бы и расширить
3. Запрос нужно оптимизнуть и прохинтовать.
4. А структура базы/индексы в оракле и мс скуле одинаковые ?


 
rayrom ©   (2005-07-27 15:38) [39]

> 1. Мускуль много клиентов просто не вытянет
Ага держал аж 218 штук.
> 2. Оракла оперативку любит,
Ага после 100 клиентов затыкатся начинает!
> так что 1 гектар неплохо бы и расширить
Хотелось бы тока денег не выделяютя!
> 3. Запрос нужно оптимизнуть и прохинтовать.
Во я и спросил как это сделать (вопрос по поводу explain)!
> 4. А структура базы/индексы в оракле и мс скуле одинаковые?
Полный дубликат (тока без тригерров, процедур, и т.п. что в MySQLe не поддерживается)


 
Sergey13 ©   (2005-07-27 15:45) [40]

2 [35] rayrom ©   (27.07.05 15:15)
8.1.5 - не самый лучший релиз по отзывам.

Производительность запроса зависит не только от самого запроса, но и от того как настроен Оракл, какие индексы и т.д.

Ты так и не даешь последнюю редакцию твоего запроса.

2[39] rayrom ©   (27.07.05 15:38)
>> так что 1 гектар неплохо бы и расширить
>Хотелось бы тока денег не выделяютя!
Важно еще как этот гектар распахан.



Страницы: 1 2 вся ветка

Форум: "Базы";
Текущий архив: 2005.09.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.021 c
1-1123622205
ronyn
2005-08-10 01:16
2005.09.11
Как синхронизировать страницу в моем Интернет ехплоуроре?


4-1121792397
NikotiN
2005-07-19 20:59
2005.09.11
как узнать имя открытого файла по его Handle?


9-1116409473
Buzzz
2005-05-18 13:44
2005.09.11
Земля в ГЛС


9-1116200825
Mortis
2005-05-16 03:47
2005.09.11
3ds in Delphi


3-1122525099
Ольга
2005-07-28 08:31
2005.09.11
Перевод пользовательской функции с T-SQL на PL/SQL





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский