|
Перебор записей в цикле (ADO)
|
|||
---|---|---|---|
#18+
rs.Open "select D_REG from dokument", db, adOpenDynamic, adLockBatchOptimistic Do While Not rs.EOF rs.Fields(0).Value = Моя_функция (rs.Fields(0).Value) rs.Update rs.MoveNext Loop табличка по SQl server пробовал для небольшого набора записей - на ура для 20-30 тыс. облом что изменить ? или только хр.процедурой залечит? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2003, 14:10 |
|
Перебор записей в цикле (ADO)
|
|||
---|---|---|---|
#18+
попробуйте так называемые курсоры-брандспойты: CursorLocation=aduseServer CursorType=adOpenForwardOnly LockType=adLockReadOnly CashSize=1 ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2003, 18:14 |
|
Перебор записей в цикле (ADO)
|
|||
---|---|---|---|
#18+
Спасибо вроде помогло токо LockType = adLockOptimistic а зачем используется CashSize ? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2003, 11:09 |
|
Перебор записей в цикле (ADO)
|
|||
---|---|---|---|
#18+
Вопрос - зачем для обновления использовать цикл? Если попробовать просто запрос на обновление. Поскольку в качестве нового значения используется функция (как я понял, клиентская), параметр которой - некоторое поле из обновляемой таблицы (не обязательно), то в лоб задачу не решить: я тут маленько поэксперементировал с таблицей, у которой 62 тыс. записей: Option Explicit Private Sub cmdTest_Click() Dim cnn As New ADODB.Connection Dim strConn As String Dim strSQL As String Dim rst As New ADODB.Recordset Dim tStart As Date Dim tEnd As Date rst.CursorLocation = adUseClient rst.LockType = adLockPessimistic strConn = "Provider=SQLOLEDB.1;Password=1111;Persist Security Info=False;User ID=fake;Initial Catalog=mkvd;Data Source=10.80.180.108" cnn.Open strConn ' Таблица содержит около 62 тыс. записей ' Первый вариант - с помощью UPDATE запроса. На выполнение запроса затрачено около 2-х секунд. В качестве нового значения выступает результат пользовательской функции dbo.fnTest, которая хранится на сервере. У пользователя должны быть права на ее выполнение strSQL = "UPDATE tblСтатТалон SET ВозрБольного=dbo.fnTest([ВозрБольного])" tStart = Time DoEvents cnn.Execute (strSQL) tEnd = Time MsgBox "update запрос затратил " & DateDiff("s", tStart, tEnd) & " секунд(ы)" ' Второй вариант: с помощью набора и цикла. На выпоолнение запроса затрачено около 130 секунд. Тут без слов все ясно. strSQL = "SELECT ВозрБольного FROM tblСтатТалон" rst.Open strSQL, cnn tStart = Time DoEvents Do Until rst.EOF rst![ВозрБольного] = 10 rst.MoveNext Loop tEnd = Time MsgBox "do loop затратил " & DateDiff("s", tStart, tEnd) & " секунд(ы)" If cnn.State = 1 Then cnn.Close Set cnn = Nothing End If If rst.State = 1 Then rst.Close Set rst = Nothing End If End Sub Итог - первый метод на два порядка быстрее и позволяет использовать строковое выражение функций, что может быть очень удобно ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2003, 21:16 |
|
|
start [/forum/topic.php?fid=60&msg=32202470&tid=2171037]: |
0ms |
get settings: |
10ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
40ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
50ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 147ms |
0 / 0 |