View vs. Stored Procedure in SQL Server
-
- Уже с Приветом
- Posts: 1165
- Joined: 03 Jul 2002 20:43
- Location: AU
View vs. Stored Procedure in SQL Server
Спецы в SQL Server, помогите оценить выбор между хранимой процедурой, возвращающей набор записей, и вью, делающем то же самое. Что работает быстрее, и есть ли разница, и при каких условия она проявится, если запрос на выборку записей один и тот же, непараметризованный.
Соответсвенно тот же вопрос возникает для параметризованного запроса, но тогда уже выбор идет между хранимой процедурой и функцией.
БД используется для веб-апликейшена под ИИС, если это имеет значение. (То есть нагрузку и скорость приходится учитывать)
Соответсвенно тот же вопрос возникает для параметризованного запроса, но тогда уже выбор идет между хранимой процедурой и функцией.
БД используется для веб-апликейшена под ИИС, если это имеет значение. (То есть нагрузку и скорость приходится учитывать)
Не сиди, сложа руки... Сегодня первый день из тех, что тебе остались!
-
- Уже с Приветом
- Posts: 569
- Joined: 14 Dec 2003 04:06
- Location: Львов->Киев->Торонто
-
- Уже с Приветом
- Posts: 28294
- Joined: 29 Aug 2000 09:01
- Location: SPB --> Gloucester, MA, US --> SPB --> Paris
Для view не хранится план
Потому что план зависит от where которые присоединят к view вовне
Поэтому
select * from V where A=0
select * from V where A>10
могут дать совершенно разные планы
Напротив, как правило в sp план сгенерен заранее, поэтому работает быстрее
В этом и плюс и минус
В случае нерегулярное селективности лучше view, с другой стороны в sp можно нерегулярные значения обрабатывать вручную
В принципе есть случаи когда быстрее одно а когда другое
Потому что план зависит от where которые присоединят к view вовне
Поэтому
select * from V where A=0
select * from V where A>10
могут дать совершенно разные планы
Напротив, как правило в sp план сгенерен заранее, поэтому работает быстрее
В этом и плюс и минус
В случае нерегулярное селективности лучше view, с другой стороны в sp можно нерегулярные значения обрабатывать вручную
В принципе есть случаи когда быстрее одно а когда другое
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
-
- Уже с Приветом
- Posts: 8469
- Joined: 15 Oct 2003 18:29
- Location: Canada
Dmitry67 wrote:В этом и плюс и минус
В случае нерегулярное селективности лучше view, с другой стороны в sp можно нерегулярные значения обрабатывать вручную
В принципе есть случаи когда быстрее одно а когда другое
Точнее будет сказать, что sp быстрее, когда статистица is up to date. Но и с устаревшей статистикой тоже можно бороться - recompile sp, update statistics regulary если underlying tables очень динамично меняются.
-
- Уже с Приветом
- Posts: 1165
- Joined: 03 Jul 2002 20:43
- Location: AU
Dmitry67 wrote:Для view не хранится план
О! Вот это собственно мне тоже хотелось узнать. Мерси.
Dmitry67 wrote:В случае нерегулярное селективности лучше view, с другой стороны в sp можно нерегулярные значения обрабатывать вручную
А что вы назвали регулярной и нерегулярной селективностью, что то я не могу догадаться....
Не сиди, сложа руки... Сегодня первый день из тех, что тебе остались!
-
- Уже с Приветом
- Posts: 28294
- Joined: 29 Aug 2000 09:01
- Location: SPB --> Gloucester, MA, US --> SPB --> Paris
Пример таблицы с нерегулярной селективностью
1000 000 записей
somecol=0, 500 000 записей
Остальные 500 000 записей имеют значения somecol От 1 до 500000
Если по somecol есть индекс то для
somecol=1 он будет использоваться
А для somecol=0 нет
Это частая в реальности ситуация для NULL, пробела, 'N/A' итд
1000 000 записей
somecol=0, 500 000 записей
Остальные 500 000 записей имеют значения somecol От 1 до 500000
Если по somecol есть индекс то для
somecol=1 он будет использоваться
А для somecol=0 нет
Это частая в реальности ситуация для NULL, пробела, 'N/A' итд
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
-
- Уже с Приветом
- Posts: 1165
- Joined: 03 Jul 2002 20:43
- Location: AU
UMLец wrote:Точнее будет сказать, что sp быстрее, когда статистица is up to date. Но и с устаревшей статистикой тоже можно бороться - recompile sp, update statistics regulary если underlying tables очень динамично меняются.
Гм... То есть если данные меняются редко относительно случаев их запроса, то наверное тогда быстрее извлекать их sp-ой, а не при помощи view, так как план будет up to date для достаточно большого кличества вызовов. Верно?
Вообще-то приложение жутко тормозит на https, админ уверяет меня, что это зависит от количества обращений страницы к БД, (в общем, да, 10 простеньких, к справочникам, запросов на странице - и страница выполняется минуту , при этом 2-3 запроса на странице - нормальные несколько секунд.), аутентикация там заново происходит при каждом запросе.
Наверное даже меня решение проблемы быстродействия запросов не спасет в этом случае, похоже главное время тянет именно аутентикация каждого из них. (Честно сказать, не представляла, что это работает именно таким образом, потому что коннекшн открывается одно на всю страницу, и я полагала что при его открытии все и проверится - ан нет, само открытие коннекшена вообще происходит мгновенно)
Может засунуть все запросы в одну хранимую процедуру, кажется я видела в ADO, что можно перебирать рекордсеты по порядку, возвращенные одной хранимой процедурой. Некрасиво, конечно, негибко, но зато вернет все одним-единственным запросом к БД, пока в голову ничего не приходит больше.
Сорри, что топик сьехал в несколько другую область, надеюсь, мне и тут подскажут.
Не сиди, сложа руки... Сегодня первый день из тех, что тебе остались!
-
- Уже с Приветом
- Posts: 8469
- Joined: 15 Oct 2003 18:29
- Location: Canada
Dmitry67
И что?
План запроса строится одинаково для sp и view - основываясь на существующей статистике. Если "селектиеность нерегулярная" - то вывод из этого будет сделан одинаковый - для sp и view. Только для view - в момент запроса. То есть важна не сама регулярность, а ее постоянство или изменчивость.
И что?
План запроса строится одинаково для sp и view - основываясь на существующей статистике. Если "селектиеность нерегулярная" - то вывод из этого будет сделан одинаковый - для sp и view. Только для view - в момент запроса. То есть важна не сама регулярность, а ее постоянство или изменчивость.
-
- Уже с Приветом
- Posts: 8469
- Joined: 15 Oct 2003 18:29
- Location: Canada
-
- Уже с Приветом
- Posts: 550
- Joined: 31 Mar 2000 10:01
- Location: Moscow --> Baltimore, MD
Если некрасивость в том, что все селекты придется засунуть в одну процедуру, то это дело поправимое. Можно засунуть несколько вызовов в батч, примерно так:
В этом случае Вы получите те же несколько рекордсетов, но каждая процедура будет заниматься своим делом.
Если же таблицы содержат справочную информацию, которая не слишком часто меняется, то эти данные я бы вобще засунул в кэш (если у Вас classic ASP - в Application variable).
Code: Select all
cmd = "exec MySP1 'parValue1' 'parValue2'; exec MySP2 ..."
В этом случае Вы получите те же несколько рекордсетов, но каждая процедура будет заниматься своим делом.
Если же таблицы содержат справочную информацию, которая не слишком часто меняется, то эти данные я бы вобще засунул в кэш (если у Вас classic ASP - в Application variable).
-
- Уже с Приветом
- Posts: 23804
- Joined: 05 Jul 2003 22:34
- Location: Брест -> St. Louis, MO
Lightik wrote:Вообще-то приложение жутко тормозит на https, админ уверяет меня, что это зависит от количества обращений страницы к БД, (в общем, да, 10 простеньких, к справочникам, запросов на странице - и страница выполняется минуту , при этом 2-3 запроса на странице - нормальные несколько секунд.), аутентикация там заново происходит при каждом запросе.
А как https связан с SQL Server???
Может сам веб сервер тормозит и проблема не в запросах?
-
- Уже с Приветом
- Posts: 28294
- Joined: 29 Aug 2000 09:01
- Location: SPB --> Gloucester, MA, US --> SPB --> Paris
Lightik wrote:аутентикация там заново происходит при каждом запросе.
Неужели connection pooling выключено ? Срочно включите
Полегчает в разы
А если connection pooling нет и подтормазживает DNS, то вообще любое время реакции получить
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
-
- Уже с Приветом
- Posts: 1165
- Joined: 03 Jul 2002 20:43
- Location: AU
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.
Соответсвенно либо я не так поняла ответ, либо админ неточно мне это объяснил, а знаний у меня в этом вопросе недостаточно, чтобы оценить, насколько он прав, к сожаления, я могу только полагаться на эту информацию, пока не найду ей опровержение.
Не сиди, сложа руки... Сегодня первый день из тех, что тебе остались!
-
- Уже с Приветом
- Posts: 13014
- Joined: 10 Jul 2001 09:01
- Location: VA
Очень даже красиво. Там где это надо. Пример: отчеты с разными секциями и общими исходными и промежуточными данными и параметрами. Вся логика в одном месте, временные таблицы один раз заполняются, и т.д.Может засунуть все запросы в одну хранимую процедуру, кажется я видела в ADO, что можно перебирать рекордсеты по порядку, возвращенные одной хранимой процедурой. Некрасиво, конечно...
-
- Уже с Приветом
- Posts: 23804
- Joined: 05 Jul 2003 22:34
- Location: Брест -> St. Louis, MO
Lightik wrote:katit, Не знаю, как связан https с БД, но тестирование на обычном сервере показывало нормальный результата, все летало просто, а вот вживую та часть, что на https лежит, тормозит жутко. Если переложить страницу с https части на незащищенную часть живого сайта - опять все классно работает. А скорость вывода страницу на https явно зависит от количества запросов на странице - эту закономерность протестировала.
Никак и не связан. Просто данные передаваемые клиенту через SSL должны быть закодированы. А эта кодировка требует ресурсов. Есть много вариантов, но проблема не в запросе
Что сервер отдает клиенту? Как я себе представляю то просто изображается HTML таблица с данными(которые из вашей таблицы). Так вот чем больше данных то тем больше надо кодировать и следовательно загрузка больше. Ну а если еще физически SQL Server и IIS на одном сервер то вы понимаете...
Я не думаю что данные от SQL Server в IIS идут через SSL
-
- Уже с Приветом
- Posts: 569
- Joined: 14 Dec 2003 04:06
- Location: Львов->Киев->Торонто
Вы что то сразу ломитесь что то менять не имея арументированых представлений что именно тормозит (уверения админа в расчет не принимать!) А это плохая практика
Что бы отбросить от себя подозрения (или подтвердить) зайдите на сервер при помощи sql profiler и посмотрите что генерит типичный запрос
Те запросы которые занимают много чего нибудь (время IO, cpu) тяните в query analizer и смотрите план исполнения, после чего оптимизируйте их (если возможно)
Иногда случается что какой нибудь глупый запрос или код генерящий тысячи запросов убивает приложение, трасировщик позволяет это обнаружить
Что бы отбросить от себя подозрения (или подтвердить) зайдите на сервер при помощи sql profiler и посмотрите что генерит типичный запрос
Те запросы которые занимают много чего нибудь (время IO, cpu) тяните в query analizer и смотрите план исполнения, после чего оптимизируйте их (если возможно)
Иногда случается что какой нибудь глупый запрос или код генерящий тысячи запросов убивает приложение, трасировщик позволяет это обнаружить
Никакой разрухи нет. (с) Проф. Преображенский.
-
- Уже с Приветом
- Posts: 550
- Joined: 31 Mar 2000 10:01
- Location: Moscow --> Baltimore, MD
Lightik wrote:Niky wrote:Если же таблицы содержат справочную информацию, которая не слишком часто меняется, то эти данные я бы вобще засунул в кэш (если у Вас classic ASP - в Application variable).
Тогда все выстроятся в очередь к этим апликейшн переменным, которые хранят наиболее часто используемые объекты - и скорость отзыва будет еще ниже. В данном случае не подходит: сайт - и-нет магазин, и довольно посещаемый.
Ну если не делать Lock при каждом чтении, так и не выстроятся. А так-то можно и в базе при каждом чтении таблицу блокировать, если очень постараться. Тянуть каждый раз список штатов из базы - намного медленнее, уж поверьте.
-
- Уже с Приветом
- Posts: 1165
- Joined: 03 Jul 2002 20:43
- Location: AU
katit wrote: Ну а если еще физически SQL Server и IIS на одном сервер то вы понимаете...
Я не думаю что данные от SQL Server в IIS идут через SSL
Вот выяснила таки наконец - физически они на разных серверах, и данные идут через SSL, поэтому и так долго, и каждый запрос столько времени выполняется. Черт. Так что самое гнусное предположение оказалось верным.
Знаете, какое решение в результате предложено? Сздать БД на том сервере, где SSL и веб-апликейшн, скинуть туда малоизменяемые данные, которые обычные пользователи сайта только читают (ну справочники всякие), sql таском каждое утро их обновлять, и на настоящую БД лазать только за динамическими данными. Тогда и запросов, требующих аутентикации будет немного.
Ответа про коннекшп пулинг я добиться не смогла - что-то вроде "неважно, есть он или нет, все равно никто менять это не будет."
Так шо выкручиваться придется вышеописанным образом. Ох, горе мне, горе...
Не сиди, сложа руки... Сегодня первый день из тех, что тебе остались!
-
- Уже с Приветом
- Posts: 23804
- Joined: 05 Jul 2003 22:34
- Location: Брест -> St. Louis, MO
Lightik wrote:Вот выяснила таки наконец - физически они на разных серверах, и данные идут через SSL, поэтому и так долго, и каждый запрос столько времени выполняется. Черт. Так что самое гнусное предположение оказалось верным.
Понятно. Но зачем? Сервера в разных местах и досту по инету идет?
Или по сетке SSL гоняете?
-
- Уже с Приветом
- Posts: 12014
- Joined: 05 Apr 2000 09:01
- Location: Philadelphia, PA, USA
-
- Уже с Приветом
- Posts: 12014
- Joined: 05 Apr 2000 09:01
- Location: Philadelphia, PA, USA
-
- Уже с Приветом
- Posts: 956
- Joined: 04 Mar 2002 10:01
Lightik wrote:katit wrote: Ну а если еще физически SQL Server и IIS на одном сервер то вы понимаете...
Я не думаю что данные от SQL Server в IIS идут через SSL
Вот выяснила таки наконец - физически они на разных серверах, и данные идут через SSL, поэтому и так долго, и каждый запрос столько времени выполняется. Черт. Так что самое гнусное предположение оказалось верным.
Знаете, какое решение в результате предложено? Сздать БД на том сервере, где SSL и веб-апликейшн, скинуть туда малоизменяемые данные, которые обычные пользователи сайта только читают (ну справочники всякие), sql таском каждое утро их обновлять, и на настоящую БД лазать только за динамическими данными. Тогда и запросов, требующих аутентикации будет немного.
Ответа про коннекшп пулинг я добиться не смогла - что-то вроде "неважно, есть он или нет, все равно никто менять это не будет."
Так шо выкручиваться придется вышеописанным образом. Ох, горе мне, горе...
Если вы пишете на ASP.NET, то там очень даже продвинутый и гибкий механизм кэширования, никакой "малоизменяемой" базы вам не понадобится.