View vs. Stored Procedure in SQL Server

Lightik
Уже с Приветом
Posts: 1165
Joined: 03 Jul 2002 20:43
Location: AU

View vs. Stored Procedure in SQL Server

Post by Lightik »

Спецы в SQL Server, помогите оценить выбор между хранимой процедурой, возвращающей набор записей, и вью, делающем то же самое. Что работает быстрее, и есть ли разница, и при каких условия она проявится, если запрос на выборку записей один и тот же, непараметризованный.
Соответсвенно тот же вопрос возникает для параметризованного запроса, но тогда уже выбор идет между хранимой процедурой и функцией.
БД используется для веб-апликейшена под ИИС, если это имеет значение. (То есть нагрузку и скорость приходится учитывать)
Не сиди, сложа руки... Сегодня первый день из тех, что тебе остались!
User avatar
Strannik223
Уже с Приветом
Posts: 569
Joined: 14 Dec 2003 04:06
Location: Львов->Киев->Торонто

Post by Strannik223 »

добавлю 3-й вариант: хранимка возвращает вьюшку :)

create sp_bla-bla
as
select * from my_view
Никакой разрухи нет. (с) Проф. Преображенский.
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Для view не хранится план
Потому что план зависит от where которые присоединят к view вовне
Поэтому
select * from V where A=0
select * from V where A>10
могут дать совершенно разные планы

Напротив, как правило в sp план сгенерен заранее, поэтому работает быстрее
В этом и плюс и минус
В случае нерегулярное селективности лучше view, с другой стороны в sp можно нерегулярные значения обрабатывать вручную

В принципе есть случаи когда быстрее одно а когда другое
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
User avatar
UMLец
Уже с Приветом
Posts: 8469
Joined: 15 Oct 2003 18:29
Location: Canada

Post by UMLец »

Dmitry67 wrote:В этом и плюс и минус
В случае нерегулярное селективности лучше view, с другой стороны в sp можно нерегулярные значения обрабатывать вручную

В принципе есть случаи когда быстрее одно а когда другое

Точнее будет сказать, что sp быстрее, когда статистица is up to date. Но и с устаревшей статистикой тоже можно бороться - recompile sp, update statistics regulary если underlying tables очень динамично меняются.
Lightik
Уже с Приветом
Posts: 1165
Joined: 03 Jul 2002 20:43
Location: AU

Post by Lightik »

Dmitry67 wrote:Для view не хранится план

О! Вот это собственно мне тоже хотелось узнать. Мерси. :wink:
Dmitry67 wrote:В случае нерегулярное селективности лучше view, с другой стороны в sp можно нерегулярные значения обрабатывать вручную

А что вы назвали регулярной и нерегулярной селективностью, что то я не могу догадаться....
Не сиди, сложа руки... Сегодня первый день из тех, что тебе остались!
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Пример таблицы с нерегулярной селективностью

1000 000 записей
somecol=0, 500 000 записей
Остальные 500 000 записей имеют значения somecol От 1 до 500000
Если по somecol есть индекс то для
somecol=1 он будет использоваться
А для somecol=0 нет

Это частая в реальности ситуация для NULL, пробела, 'N/A' итд
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
Lightik
Уже с Приветом
Posts: 1165
Joined: 03 Jul 2002 20:43
Location: AU

Post by Lightik »

UMLец wrote:Точнее будет сказать, что sp быстрее, когда статистица is up to date. Но и с устаревшей статистикой тоже можно бороться - recompile sp, update statistics regulary если underlying tables очень динамично меняются.


Гм... То есть если данные меняются редко относительно случаев их запроса, то наверное тогда быстрее извлекать их sp-ой, а не при помощи view, так как план будет up to date для достаточно большого кличества вызовов. Верно?

Вообще-то приложение жутко тормозит на https, админ уверяет меня, что это зависит от количества обращений страницы к БД, (в общем, да, 10 простеньких, к справочникам, запросов на странице - и страница выполняется минуту :roll: , при этом 2-3 запроса на странице - нормальные несколько секунд.), аутентикация там заново происходит при каждом запросе.

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

Может засунуть все запросы в одну хранимую процедуру, кажется я видела в ADO, что можно перебирать рекордсеты по порядку, возвращенные одной хранимой процедурой. Некрасиво, конечно, негибко, но зато вернет все одним-единственным запросом к БД, пока в голову ничего не приходит больше. :pain1:
Сорри, что топик сьехал в несколько другую область, надеюсь, мне и тут подскажут. :P
Не сиди, сложа руки... Сегодня первый день из тех, что тебе остались!
User avatar
UMLец
Уже с Приветом
Posts: 8469
Joined: 15 Oct 2003 18:29
Location: Canada

Post by UMLец »

Dmitry67
И что?
План запроса строится одинаково для sp и view - основываясь на существующей статистике. Если "селектиеность нерегулярная" - то вывод из этого будет сделан одинаковый - для sp и view. Только для view - в момент запроса. То есть важна не сама регулярность, а ее постоянство или изменчивость.
User avatar
UMLец
Уже с Приветом
Posts: 8469
Joined: 15 Oct 2003 18:29
Location: Canada

Post by UMLец »

Lightik wrote:Может засунуть все запросы в одну хранимую процедуру, кажется я видела в ADO, что можно перебирать рекордсеты по порядку, возвращенные одной хранимой процедурой. Некрасиво, конечно...

Красиви или не красиво - вам скажет "лицо по ту сторону экрана" :)
Niky
Уже с Приветом
Posts: 550
Joined: 31 Mar 2000 10:01
Location: Moscow --> Baltimore, MD

Post by Niky »

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

Code: Select all

    cmd = "exec MySP1 'parValue1' 'parValue2'; exec MySP2 ..."

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

Если же таблицы содержат справочную информацию, которая не слишком часто меняется, то эти данные я бы вобще засунул в кэш (если у Вас classic ASP - в Application variable).
User avatar
katit
Уже с Приветом
Posts: 23804
Joined: 05 Jul 2003 22:34
Location: Брест -> St. Louis, MO

Post by katit »

Lightik wrote:Вообще-то приложение жутко тормозит на https, админ уверяет меня, что это зависит от количества обращений страницы к БД, (в общем, да, 10 простеньких, к справочникам, запросов на странице - и страница выполняется минуту :roll: , при этом 2-3 запроса на странице - нормальные несколько секунд.), аутентикация там заново происходит при каждом запросе.


А как https связан с SQL Server???

Может сам веб сервер тормозит и проблема не в запросах?
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Lightik wrote:аутентикация там заново происходит при каждом запросе.

Неужели connection pooling выключено ? Срочно включите
Полегчает в разы
А если connection pooling нет и подтормазживает DNS, то вообще любое время реакции получить
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
Lightik
Уже с Приветом
Posts: 1165
Joined: 03 Jul 2002 20:43
Location: AU

Post by Lightik »

Niky wrote:Если некрасивость в том, что все селекты придется засунуть в одну процедуру, то это дело поправимое. Можно засунуть несколько вызовов в батч, примерно так:

Code: Select all

    cmd = "exec MySP1 'parValue1' 'parValue2'; exec MySP2 ..."

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

Спасибо, сама не догадалась, отличная идея.
Niky wrote:Если же таблицы содержат справочную информацию, которая не слишком часто меняется, то эти данные я бы вобще засунул в кэш (если у Вас classic ASP - в Application variable).

Тогда все выстроятся в очередь к этим апликейшн переменным, которые хранят наиболее часто используемые объекты - и скорость отзыва будет еще ниже. В данном случае не подходит: сайт - и-нет магазин, и довольно посещаемый.

katit, Не знаю, как связан https с БД, но тестирование на обычном сервере показывало нормальный результата, все летало просто, а вот вживую та часть, что на https лежит, тормозит жутко. Если переложить страницу с https части на незащищенную часть живого сайта - опять все классно работает. А скорость вывода страницу на https явно зависит от количества запросов на странице - эту закономерность протестировала.

Dmitry67, я проверяла, от количества открытых коннекшенов скорость вывода страницы не зависит - так что connection pooling скорее всего включен, но у админа я спрошу на всякий случай. Про аутентикацию при каждом запросе - это я так поняла, вот как было в оригинале, когда я спрашивала у админа:
Мой вопрос - почему https работает так медленно.
Ответ: Because HTTPS invokes third party server authentication. Without HTTPS Accellerator it work slow. it's not the problem with ASP, it's problem with making a few round trips to authentication site and back before processing ASP script.
Мой вопрос: Why it depends on quantity of function calling?
Ответ: It could be that each function goes back to database. Every trip to database adds more time.... Trip to the database still needs to be made when you ask for more data. Then "select" statement you have the more trips will be.

Соответсвенно либо я не так поняла ответ, либо админ неточно мне это объяснил, а знаний у меня в этом вопросе недостаточно, чтобы оценить, насколько он прав, к сожаления, я могу только полагаться на эту информацию, пока не найду ей опровержение.
Не сиди, сложа руки... Сегодня первый день из тех, что тебе остались!
Sergey___K
Уже с Приветом
Posts: 13014
Joined: 10 Jul 2001 09:01
Location: VA

Post by Sergey___K »

Может засунуть все запросы в одну хранимую процедуру, кажется я видела в ADO, что можно перебирать рекордсеты по порядку, возвращенные одной хранимой процедурой. Некрасиво, конечно...
Очень даже красиво. Там где это надо. Пример: отчеты с разными секциями и общими исходными и промежуточными данными и параметрами. Вся логика в одном месте, временные таблицы один раз заполняются, и т.д.
User avatar
katit
Уже с Приветом
Posts: 23804
Joined: 05 Jul 2003 22:34
Location: Брест -> St. Louis, MO

Post by katit »

Lightik wrote:katit, Не знаю, как связан https с БД, но тестирование на обычном сервере показывало нормальный результата, все летало просто, а вот вживую та часть, что на https лежит, тормозит жутко. Если переложить страницу с https части на незащищенную часть живого сайта - опять все классно работает. А скорость вывода страницу на https явно зависит от количества запросов на странице - эту закономерность протестировала.


Никак и не связан. Просто данные передаваемые клиенту через SSL должны быть закодированы. А эта кодировка требует ресурсов. Есть много вариантов, но проблема не в запросе :-)

Что сервер отдает клиенту? Как я себе представляю то просто изображается HTML таблица с данными(которые из вашей таблицы). Так вот чем больше данных то тем больше надо кодировать и следовательно загрузка больше. Ну а если еще физически SQL Server и IIS на одном сервер то вы понимаете...

Я не думаю что данные от SQL Server в IIS идут через SSL :pain1:
User avatar
Strannik223
Уже с Приветом
Posts: 569
Joined: 14 Dec 2003 04:06
Location: Львов->Киев->Торонто

Post by Strannik223 »

Вы что то сразу ломитесь что то менять не имея арументированых представлений что именно тормозит (уверения админа в расчет не принимать!) А это плохая практика

Что бы отбросить от себя подозрения (или подтвердить) зайдите на сервер при помощи sql profiler и посмотрите что генерит типичный запрос

Те запросы которые занимают много чего нибудь (время IO, cpu) тяните в query analizer и смотрите план исполнения, после чего оптимизируйте их (если возможно)

Иногда случается что какой нибудь глупый запрос или код генерящий тысячи запросов убивает приложение, трасировщик позволяет это обнаружить
Никакой разрухи нет. (с) Проф. Преображенский.
Niky
Уже с Приветом
Posts: 550
Joined: 31 Mar 2000 10:01
Location: Moscow --> Baltimore, MD

Post by Niky »

Lightik wrote:
Niky wrote:Если же таблицы содержат справочную информацию, которая не слишком часто меняется, то эти данные я бы вобще засунул в кэш (если у Вас classic ASP - в Application variable).

Тогда все выстроятся в очередь к этим апликейшн переменным, которые хранят наиболее часто используемые объекты - и скорость отзыва будет еще ниже. В данном случае не подходит: сайт - и-нет магазин, и довольно посещаемый.

Ну если не делать Lock при каждом чтении, так и не выстроятся. А так-то можно и в базе при каждом чтении таблицу блокировать, если очень постараться. Тянуть каждый раз список штатов из базы - намного медленнее, уж поверьте.
Lightik
Уже с Приветом
Posts: 1165
Joined: 03 Jul 2002 20:43
Location: AU

Post by Lightik »

katit wrote: Ну а если еще физически SQL Server и IIS на одном сервер то вы понимаете...

Я не думаю что данные от SQL Server в IIS идут через SSL :pain1:

Вот выяснила таки наконец - физически они на разных серверах, и данные идут через SSL, поэтому и так долго, и каждый запрос столько времени выполняется. Черт. Так что самое гнусное предположение оказалось верным.

Знаете, какое решение в результате предложено? Сздать БД на том сервере, где SSL и веб-апликейшн, скинуть туда малоизменяемые данные, которые обычные пользователи сайта только читают (ну справочники всякие), sql таском каждое утро их обновлять, и на настоящую БД лазать только за динамическими данными. Тогда и запросов, требующих аутентикации будет немного.

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

Так шо выкручиваться придется вышеописанным образом. Ох, горе мне, горе...
Не сиди, сложа руки... Сегодня первый день из тех, что тебе остались!
User avatar
katit
Уже с Приветом
Posts: 23804
Joined: 05 Jul 2003 22:34
Location: Брест -> St. Louis, MO

Post by katit »

Lightik wrote:Вот выяснила таки наконец - физически они на разных серверах, и данные идут через SSL, поэтому и так долго, и каждый запрос столько времени выполняется. Черт. Так что самое гнусное предположение оказалось верным.


Понятно. Но зачем? Сервера в разных местах и досту по инету идет?
Или по сетке SSL гоняете?
vovap
Уже с Приветом
Posts: 12014
Joined: 05 Apr 2000 09:01
Location: Philadelphia, PA, USA

Post by vovap »

katit wrote:Понятно. Но зачем? Сервера в разных местах и досту по инету идет?
Или по сетке SSL гоняете?

Скорее всего там между тем сервером, где SSL и SQL server стоит файреволл. Вот оно то и делает погоду. При этом да- как раз от числа обращений и зависит.
vovap
Уже с Приветом
Posts: 12014
Joined: 05 Apr 2000 09:01
Location: Philadelphia, PA, USA

Post by vovap »

Вообще если бы кто из классиков по теории данных увидел бы этот топик - тотчас и помер бы. Что лучше - сторед процедуры или вью?
Сторед процедуры должны доставать данные из вью. Вот как должно быть.
User avatar
IA72
Уже с Приветом
Posts: 956
Joined: 04 Mar 2002 10:01

Post by IA72 »

Lightik wrote:
katit wrote: Ну а если еще физически SQL Server и IIS на одном сервер то вы понимаете...

Я не думаю что данные от SQL Server в IIS идут через SSL :pain1:

Вот выяснила таки наконец - физически они на разных серверах, и данные идут через SSL, поэтому и так долго, и каждый запрос столько времени выполняется. Черт. Так что самое гнусное предположение оказалось верным.

Знаете, какое решение в результате предложено? Сздать БД на том сервере, где SSL и веб-апликейшн, скинуть туда малоизменяемые данные, которые обычные пользователи сайта только читают (ну справочники всякие), sql таском каждое утро их обновлять, и на настоящую БД лазать только за динамическими данными. Тогда и запросов, требующих аутентикации будет немного.

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

Так шо выкручиваться придется вышеописанным образом. Ох, горе мне, горе...


Если вы пишете на ASP.NET, то там очень даже продвинутый и гибкий механизм кэширования, никакой "малоизменяемой" базы вам не понадобится.

Return to “Вопросы и новости IT”