Задавайте вопросы, мы ответим
Вы не зашли.
Доброго времени суток!
Прошу гуру поделиться соображениями по следующему моменту.
Один и тот же функционал (допустим поиск максимальной разницы между двумя соседними значениями) можно реализовать 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.
Неактивен