SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 23.06.2011 10:42:51

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2420

Курсоры vs пользовательские переменные

Доброго времени суток!

Прошу гуру поделиться соображениями по следующему моменту.

Один и тот же функционал (допустим поиск максимальной разницы между двумя соседними значениями) можно реализовать sql-запросом с использованием пользовательских переменных (ПП), можно же создать хранимую процедуру (ХП), и реализовать этот функционал через курсор.

Померил длительности выполнения что того, что другого варианта. Разница впечатляет:

4 миллиона записей:
запрос с ПП -     2.55 сек
ХП с курсором - 49 сек

8 миллионов записей:
запрос с ПП -     5.2 сек
ХП с курсором - 128 сек

16 миллионов записей:
запрос с ПП -     10 сек
ХП с курсором - 244 сек

Почему такая большая разница? Ведь делается фактически одно и то же.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#2 23.06.2011 10:58:42

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Курсоры vs пользовательские переменные

Это совершенно разные планы исполнения. Представьте, что 1000 человек хочет добраться из города в город. План А - они сели в 25 автобусов. План Б - они сели в 1000 легковых машин. Второе - аналог курсоров.

Сравните планы:
А.
Запрос с ПП
Синтаксический анализ запроса
Создание плана исполнения
Определение хранилища базы (engine)
Цикл foreach {
  Обращение к engine
}

Б.
Цикл внутри ХП {
  Ситаксический анализ запроса (курсор)
  Определение хранилища базы (engine)
  Обращение к engine
  Переход к следующему шагу цикла (интерпретатор языка SQL)
}


Попробуйте реализовать на SokectHandler - какая будет потеря по сравнению с ПП?

Неактивен

 

#3 26.06.2011 06:28:16

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 847

Re: Курсоры vs пользовательские переменные

Ситаксический анализ запроса (курсор)

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

Неактивен

 

#4 26.06.2011 22:37:03

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Курсоры vs пользовательские переменные

LazY написал:

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

Я имел в виду, что SQL - интерпретируемый язык. Так или иначе сначала нужно понять, что указанное выражение - обращение по курсору. Поэтому и рекомендовал посмотреть выйгрыш от SocketHandler, избавившись таким образом от SQL.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson