Как на самом деле работает set rs = conn.execute (sql)? - PullRequest
2 голосов
/ 27 ноября 2011

В данный момент я пытаюсь повысить производительность в своем приложении ASP Classic, и сейчас я нахожусь на стадии улучшения транзакций SQL.

Я читаю немного из http://www.somacon.com/p236.php

Итак, мой вопрос: Как на самом деле работает линия set rs = conn.execute(sql)?

Я считаю, что строка определяет переменную с именем rs и связывает ВСЕ данные, собранные из базы данных, через предложение SQL (fx select * from users). Затем я могу бросить соединение с базой данных в ад и переопределить мою переменную sql, если хотите, это правда?

Если это правда, тогда я получу наилучшую производительность, выполнив мой код следующим образом:

set conn = server.createobject("adodb.connection")
dsn = "Provider = sqloledb; Data Source = XXX; Initial Catalog = XXX; User Id = XXX; Password = XXX"

conn.open dsn
sql = "select id, name from users"
set rs = conn.execute(sql)
conn.close

-- Do whatever i want with the variable rs

conn.open dsn
sql = "select id from logins"
set rs = conn.execute(sql)
conn.close

-- Do whatever i want with the variable rs

conn.open dsn
sql = "select id, headline from articles"
set rs = conn.execute(sql)
conn.close

-- Do whatever i want with the variable rs

set conn = nothing

В этом примере я открываю и закрываю соединение каждый раз, когда выполняю транзакцию sql.

Это хорошая идея?

Ответы [ 2 ]

3 голосов
/ 28 ноября 2011

Это хорошая идея?

Нет, но не по причинам, указанным Люком.Реальность такова, что ADODB все равно будет кэшировать соединения, поэтому открытие и закрытие соединений не так уж и дорого.Однако вопрос исходит из неверной информации, которую вы, по-видимому, имеете о поведении набора записей ...

От вашего комментария к Луки ответ: -

Но это правильно,что он сохраняет все данные в переменной при выполнении?

Нет, если вы тщательно не сконфигурировали возвращение набора записей как статический курсор на стороне клиента, и даже тогда вам нужно будет убедиться, что курсорполностью заполнен.Только тогда вы можете отключить набор записей от соединения и при этом продолжать использовать данные в наборе записей.

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

Самый эффективный способ минимизировать время, необходимое для подключения - использовать метод ADODB Recordset GetRows.Это высосет все строки в двумерный массив вариантов.Получив этот массив, вы можете обойтись без набора записей и соединения.

Многое еще сделано для минимизации количества соединений, поддерживаемых на сервере, но в действительности на современном оборудовании, которое не является реальной проблемой большинства приложений,Реальная проблема заключается в том, сколько времени текущий запрос поддерживает блокировки в БД.Быстро потребляя и закрывая набор записей, вы сводите к минимуму время удержания блокировок.

Хотя следует предостеречь.Компромисс - повышенный спрос на память на веб-сервере.Вы должны быть осторожны, вы не просто перемещаете одно узкое место в другое.Тем не менее, есть много вещей, которые вы можете сделать с этим.Используйте 64-битную операционную систему и загрузите в нее много памяти или масштабируйте веб-серверы до фермы.

0 голосов
/ 27 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...