![]()  | 
		
Задавайте вопросы, мы ответим
Вы не зашли.
Доброго времени суток!
Прошу гуру поделиться соображениями по следующему моменту.
Один и тот же функционал (допустим поиск максимальной разницы между двумя соседними значениями) можно реализовать sql-запросом с использованием пользовательских переменных (ПП), можно же создать хранимую процедуру (ХП), и реализовать этот функционал через курсор.
Померил длительности выполнения что того, что другого варианта. Разница впечатляет:
4 миллиона записей: 
запрос с ПП -     2.55 сек
ХП с курсором - 49 сек
8 миллионов записей: 
запрос с ПП -     5.2 сек
ХП с курсором - 128 сек
16 миллионов записей: 
запрос с ПП -     10 сек
ХП с курсором - 244 сек
Почему такая большая разница? Ведь делается фактически одно и то же.
Неактивен

Это совершенно разные планы исполнения. Представьте, что 1000 человек хочет добраться из города в город. План А - они сели в 25 автобусов. План Б - они сели в 1000 легковых машин. Второе - аналог курсоров.
Сравните планы:
А.
Запрос с ПП
Синтаксический анализ запроса
Создание плана исполнения
Определение хранилища базы (engine)
Цикл foreach {
  Обращение к engine 
}
Б.
Цикл внутри ХП {
  Ситаксический анализ запроса (курсор)
  Определение хранилища базы (engine)
  Обращение к engine 
  Переход к следующему шагу цикла (интерпретатор языка SQL)
}
Попробуйте реализовать на SokectHandler - какая будет потеря по сравнению с ПП?
Неактивен

Ситаксический анализ запроса (курсор)
А зачем курсору каждый раз синтаксический анализ запроса делать? Это реально при каждой итерации происходит? (не только при открытии?)
Неактивен

LazY написал:
А зачем курсору каждый раз синтаксический анализ запроса делать? Это реально при каждой итерации происходит? (не только при открытии?)
Я имел в виду, что SQL - интерпретируемый язык. Так или иначе сначала нужно понять, что указанное выражение - обращение по курсору. Поэтому и рекомендовал посмотреть выйгрыш от SocketHandler, избавившись таким образом от SQL.
Неактивен