Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с вызовом внутренней процедуры в MySQL 
:(
    Опции темы
batigoal
Дата 2.10.2006, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 16
Всего: 151



Не понял я твою мысль, ну да ладно. Не существенно.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Sun
Дата 2.10.2006, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Account removed
***


Профиль
Группа: Экс. модератор
Сообщений: 1611
Регистрация: 14.8.2002

Репутация: 2
Всего: 48



Цитата(3x3 @  1.10.2006,  20:35 Найти цитируемый пост)
Никогда в жизни не поверю, что вызов процедуры может ускорить запрос.

А у меня гораздо больше сомнений вызывает что переданный извне запрос будет выполняться быстрей чем в теле процедуры. Допускаю что в лучшем случае скорость будет одинаковой. У вас есть какие-нибудь материалы доказывающие вашу теорию? Интересно было бы почитать.


--------------------
Account removed
PM MAIL   Вверх
3x3
  Дата 2.10.2006, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 261
Регистрация: 17.9.2006

Репутация: 5
Всего: 8



Цитата(Sun @ 2.10.2006,  14:42)
Цитата(3x3 @  1.10.2006,  20:35 Найти цитируемый пост)
Никогда в жизни не поверю, что вызов процедуры может ускорить запрос.

А у меня гораздо больше сомнений вызывает что переданный извне запрос будет выполняться быстрей чем в теле процедуры. Допускаю что в лучшем случае скорость будет одинаковой. У вас есть какие-нибудь материалы доказывающие вашу теорию? Интересно было бы почитать.

А вы не обратили внимания, что в посте, из которого вы процитировали одну фразу, присутствует ещё некая совокупность букв, посвященная раскрытию темы - почему именно я не поверю?  smile 

Это сообщение отредактировал(а) 3x3 - 2.10.2006, 15:10


--------------------
Зачем платить больше,
когда можно заплатить дважды?
PM   Вверх
Sun
Дата 2.10.2006, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Account removed
***


Профиль
Группа: Экс. модератор
Сообщений: 1611
Регистрация: 14.8.2002

Репутация: 2
Всего: 48



Цитата(3x3 @  2.10.2006,  12:08 Найти цитируемый пост)
А вы не обратили внимания, что в посте, из которого вы процитировали одну фразу, присутствует ещё некая совокупность букв, посвященная раскрытию темы - почему именно я не поверю? 

Я внимательнейшим образом изучил данный метериал, но так и не понял почему если оптимизатор запускается при простом выполнении запроса, он точно также не запускается при выполнении этого же запроса в теле процедуры? Это сделано специально чтобы понизить эффективность хранимых процедур?


--------------------
Account removed
PM MAIL   Вверх
3x3
Дата 2.10.2006, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 261
Регистрация: 17.9.2006

Репутация: 5
Всего: 8



Цитата(Sun @ 2.10.2006,  15:28)
Цитата(3x3 @  2.10.2006,  12:08 Найти цитируемый пост)
А вы не обратили внимания, что в посте, из которого вы процитировали одну фразу, присутствует ещё некая совокупность букв, посвященная раскрытию темы - почему именно я не поверю? 

Я внимательнейшим образом изучил данный метериал, но так и не понял почему если оптимизатор запускается при простом выполнении запроса, он точно также не запускается при выполнении этого же запроса в теле процедуры? Это сделано специально чтобы понизить эффективность хранимых процедур?

Хм.. Я в свою очередь не понимаю, как вы себе представляете работу оптимизатора в случае, если запрос, приведенный мною в качестве примера, будет подбирать ID стран и континентов посредством вызова функций:
Код

SELECT person.id, person.name FROM person WHERE country.id=get_country_id(get_continent_id('Australia')) AND person.sex='M';


Как вы ему предложите ЭТО оптимизировать? Он просто станет вызывать эти функции для всех семи миллиардов землян и шерстить в них страны и континенты. 


--------------------
Зачем платить больше,
когда можно заплатить дважды?
PM   Вверх
Sun
Дата 2.10.2006, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Account removed
***


Профиль
Группа: Экс. модератор
Сообщений: 1611
Регистрация: 14.8.2002

Репутация: 2
Всего: 48



Цитата(3x3 @  2.10.2006,  13:35 Найти цитируемый пост)
Как вы ему предложите ЭТО оптимизировать? Он просто станет вызывать эти функции для всех семи миллиардов землян и шерстить в них страны и континенты.  

Ну в процедурах есть параметры, которые я укажу в данном селекте. Соотвественно когда будет выполняться селект с указанными параметрами, будет вызываться и оптимизатор, точно также как и при вызове запроса извне. Разве не так? Или я что-то недопонял?


--------------------
Account removed
PM MAIL   Вверх
3x3
Дата 2.10.2006, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 261
Регистрация: 17.9.2006

Репутация: 5
Всего: 8



Цитата(Sun @ 2.10.2006,  17:02)
Цитата(3x3 @  2.10.2006,  13:35 Найти цитируемый пост)
Как вы ему предложите ЭТО оптимизировать? Он просто станет вызывать эти функции для всех семи миллиардов землян и шерстить в них страны и континенты.  

Ну в процедурах есть параметры, которые я укажу в данном селекте. Соотвественно когда будет выполняться селект с указанными параметрами, будет вызываться и оптимизатор, точно также как и при вызове запроса извне. Разве не так? Или я что-то недопонял?

Продолжая наш пример:
В мире живёт примерно 7 миллиардов человек (ну, миллиард туда, миллиард сюда - не принципиально).
Население Австралии - что-то около 20 миллионов, что составляет 0.3% от общего количества людей.

В среднем же селективность индекса по странам, которых 200 = 0.5%, очень хорошая избирательность, проиндексируем персон по стране.

Соответственно оптимизатор знает какие существуют индексы (в жизни он ещё оценивает и сколько стоит по ним ходить, ведь данные разреживаются с годами: кто-то мрёт, кто-то наоборот).

И когда мы просим SQL-engine: "дай нам всех мужиков с австралийского континента" она в состоянии решить что правильнее: перебирать семь миллиардов записей персон или 6 континентов, 34 страны (в среднем на континент) и двадцать миллионов персон.

Но стоит вам сказать SQL-engine: "дай нам всех мужиков, у которых ID страны, совпадёт с ID, которой вернет фукция вызванная для этой записи" - и всё. БД пойдёт перебирать миллиарды землян и для каждого вызывать функцию и проверять - совпадает ли возвращенный ID с тем, что забито в записи этого пользователя. 

ЗЫ
Не без исключений, конечно. В частности при выборке по Азии будет скорее всего выгоднее ходить по персонам: одних китайцев - каждый пятый, какой блок с диска ни считаешь - не ошибёшься, в нём уже китаец сидеть будет smile



--------------------
Зачем платить больше,
когда можно заплатить дважды?
PM   Вверх
Sun
Дата 2.10.2006, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Account removed
***


Профиль
Группа: Экс. модератор
Сообщений: 1611
Регистрация: 14.8.2002

Репутация: 2
Всего: 48



Цитата(3x3 @  2.10.2006,  15:00 Найти цитируемый пост)
И когда мы просим SQL-engine: "дай нам всех мужиков с австралийского континента" она в состоянии решить что правильнее: перебирать семь миллиардов записей персон или 6 континентов, 34 страны (в среднем на континент) и двадцать миллионов персон.

Можно все-таки пример на SQL, а то с такими яыком запросов который приводите вы я не знаком  smile  А еще лучше Java код с вызовом SQL и код хранимой процедуры которая по вашему мнению отработает медленней. Пока что в вашем примере я не вижу конкретики. Его можно эффективно реализовать и через хранимые процедуры и через JDBC вызовы.


--------------------
Account removed
PM MAIL   Вверх
3x3
  Дата 2.10.2006, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 261
Регистрация: 17.9.2006

Репутация: 5
Всего: 8



Цитата(Sun @ 2.10.2006,  19:42)
Цитата(3x3 @  2.10.2006,  15:00 Найти цитируемый пост)
И когда мы просим SQL-engine: "дай нам всех мужиков с австралийского континента" она в состоянии решить что правильнее: перебирать семь миллиардов записей персон или 6 континентов, 34 страны (в среднем на континент) и двадцать миллионов персон.

Можно все-таки пример на SQL, а то с такими яыком запросов который приводите вы я не знаком  smile  А еще лучше Java код с вызовом SQL и код хранимой процедуры которая по вашему мнению отработает медленней. Пока что в вашем примере я не вижу конкретики. Его можно эффективно реализовать и через хранимые процедуры и через JDBC вызовы.

На SQL было в предшествующих постах, а это перевод выражения на русский язык smile

А про джаву - забудьте. Совершенно непринципиально через какой API вы будете дергать лисэнер БД. Это базу не волнует и на её скорость не влияет.


--------------------
Зачем платить больше,
когда можно заплатить дважды?
PM   Вверх
Sun
Дата 2.10.2006, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Account removed
***


Профиль
Группа: Экс. модератор
Сообщений: 1611
Регистрация: 14.8.2002

Репутация: 2
Всего: 48



Цитата(3x3 @  2.10.2006,  16:59 Найти цитируемый пост)
А про джаву - забудьте. Совершенно непринципиально через какой API вы будете дергать лисэнер БД. Это базу не волнует и на её скорость не влияет. 

Ладно, будем абстрагироваться. У нас есть один и тотже SQL запрос со следующими параметрами
Код

SELECT person.id, person.name FROM person, country, continent WHERE country.id=person.country_id AND person.sex='M' AND country.continent_id=continent.id AND continent.name='Australia';

В одном случае мы вызываем его в теле хранимой процедуры, во втором извне, через API предоставляемое сервером баз данных, либо через поставляемую вместе с ним утилиту. Теперь можно узнать - почему при запуске SQL запроса из хранимой процедуры оптимизатор запускаться не будет, а во втором случае будет? 


--------------------
Account removed
PM MAIL   Вверх
3x3
Дата 2.10.2006, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 261
Регистрация: 17.9.2006

Репутация: 5
Всего: 8



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


--------------------
Зачем платить больше,
когда можно заплатить дважды?
PM   Вверх
Sun
Дата 2.10.2006, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Account removed
***


Профиль
Группа: Экс. модератор
Сообщений: 1611
Регистрация: 14.8.2002

Репутация: 2
Всего: 48



3x3, ну если разницы нет, почему же вы утверждаете что хранимые процедуры менее эффективны по производительности, чем внешние вызовы? Только потому что требуется проверка прав доступа? Время на инициализацию?


--------------------
Account removed
PM MAIL   Вверх
3x3
Дата 2.10.2006, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 261
Регистрация: 17.9.2006

Репутация: 5
Всего: 8



Цитата(Sun @ 2.10.2006,  20:45)
3x3, ну если разницы нет, почему же вы утверждаете что хранимые процедуры менее эффективны по производительности, чем внешние вызовы? Только потому что требуется проверка прав доступа? Время на инициализацию?

Это вы так интерпретировали моё высказывание: "Никогда в жизни не поверю, что вызов процедуры может ускорить запрос" или можете привести ссылку на высказывание о том, "что хранимые процедуры менее эффективны по производительности, чем внешние вызовы"? smile





--------------------
Зачем платить больше,
когда можно заплатить дважды?
PM   Вверх
Sun
Дата 2.10.2006, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Account removed
***


Профиль
Группа: Экс. модератор
Сообщений: 1611
Регистрация: 14.8.2002

Репутация: 2
Всего: 48



Цитата(3x3 @  2.10.2006,  17:54 Найти цитируемый пост)
Это вы так интерпретировали моё высказывание: "Никогда в жизни не поверю, что вызов процедуры может ускорить запрос" или можете привести ссылку на высказывание о том, "что хранимые процедуры менее эффективны по производительности, чем внешние вызовы"? smile

Запросто
Цитата(3x3 @  29.9.2006,  13:15 Найти цитируемый пост)
Я бы вам посоветовал рассмотреть вопрос о переходе с вызовов хранимых процедур на запросы вида:
Код

insert into testTable(name, idCoutry)  select 'lalala' /* it is your aName parameter */ ,idCountry from country where name='Russia' /* it is your aCountry */;

Мало того, что это будет переносимое решение, но оно так же обычно оказывается лучше по производительности..


Цитата(3x3 @  29.9.2006,  14:08 Найти цитируемый пост)
Но главное, при использовании обращения к справочнику по странам в качестве подзапроса, оптимизатор запросов, работая с запросом ( в д.с. INSERT, но сложный SELECT был бы лучшим примером), будет его как нетрудно догадаться, оптимизировать - исходя из статистики таблиц к которым обращается запрос, наличия индексов, способа связывания и т.п. Он будет выбирать по каким индексам каких участвующих таблиц осуществлять внешние циклы, а по каким внутренние, да и по индексам ли вообще это делать. Заменяя подзапросы вызовами хранимых процедур вы лишите оптимизатор возможности выбора стратегии.  




--------------------
Account removed
PM MAIL   Вверх
3x3
Дата 2.10.2006, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 261
Регистрация: 17.9.2006

Репутация: 5
Всего: 8



Цитата(Sun @ 2.10.2006,  21:05)
Цитата(3x3 @  2.10.2006,  17:54 Найти цитируемый пост)
Это вы так интерпретировали моё высказывание: "Никогда в жизни не поверю, что вызов процедуры может ускорить запрос" или можете привести ссылку на высказывание о том, "что хранимые процедуры менее эффективны по производительности, чем внешние вызовы"? smile

Запросто
Цитата(3x3 @  29.9.2006,  13:15 Найти цитируемый пост)
Я бы вам посоветовал рассмотреть вопрос о переходе с вызовов хранимых процедур на запросы вида:
Код

insert into testTable(name, idCoutry)  select 'lalala' /* it is your aName parameter */ ,idCountry from country where name='Russia' /* it is your aCountry */;

Мало того, что это будет переносимое решение, но оно так же обычно оказывается лучше по производительности..


Цитата(3x3 @  29.9.2006,  14:08 Найти цитируемый пост)
Но главное, при использовании обращения к справочнику по странам в качестве подзапроса, оптимизатор запросов, работая с запросом ( в д.с. INSERT, но сложный SELECT был бы лучшим примером), будет его как нетрудно догадаться, оптимизировать - исходя из статистики таблиц к которым обращается запрос, наличия индексов, способа связывания и т.п. Он будет выбирать по каким индексам каких участвующих таблиц осуществлять внешние циклы, а по каким внутренние, да и по индексам ли вообще это делать. Заменяя подзапросы вызовами хранимых процедур вы лишите оптимизатор возможности выбора стратегии.  

Хорошо. Я по-прежнему не вижу ссылку на высказывание о том, "что хранимые процедуры менее эффективны по производительности, чем внешние вызовы" (и уверен, что такого не говорил, поскольку не понимаю смысл текста взятого в кавычки), а вот отквоченное вами можно обсудить. 

Начнём.

С чем из отквоченного вами вы лично не согласны и почему?


--------------------
Зачем платить больше,
когда можно заплатить дважды?
PM   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0560 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.