On-line: PSP, гостей 0. Всего: 1 [подробнее..]
АвторСообщение
постоянный участник


Пост N: 1091
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 11.07.15 10:37. Заголовок: А работает ли механизм транзакций letodb


в udf-функциях?

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 44 , стр: 1 2 3 All [только новые]


Администратор




Пост N: 3313
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 11.07.15 14:51. Заголовок: Увы, нет. Механизм т..


Увы, нет. Механизм транзакции таков: все изменения накапливаются на клиенте без передачи на сервер, и только по LETO_COMMITTRANSACTION пакетом передаются на сервер, где и выполняются.
Поскольку вызовы leto_udf сразу передаются на сервер и сразу выполняются, вписать их в механизм транзакций не представляется возможным.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1092
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 11.07.15 15:06. Заголовок: Жаль. Подумалось, чт..


Жаль. Подумалось, что было бы неплохо использовать свойство транзакции "либо выполняется целиком, либо не выполняется вообще" при записи из udf-функции, но, видимо, там уже напрямую работает rdd и "влезть" в этот процесс без переделки rdd не получится. Спасибо.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 43
Зарегистрирован: 06.05.14
ссылка на сообщение  Отправлено: 22.11.15 23:49. Заголовок: Команда Leto_BeginTr..


Команда Leto_BeginTransaction() работает, только если DBF открыт с LetoDB. Например, это не работает:

USE Test VIA "DBFNTX" NEW
Leto_BeginTransaction() // Syntax error

Почему? Это очень неудобно для универсальной процедурой которая копирует записи из локального DBF на сервер.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 172
Зарегистрирован: 15.09.05
ссылка на сообщение  Отправлено: 23.11.15 10:05. Заголовок: С транзакциями надо соблюдать следующие правила


С транзакциями надо соблюдать следующие правила :
1. Использовать их только в зонах действия RDD "LETO" , другими словами после RDDSETDEFAULT( "LETO" )
а потом для взаимодействия между файлми разных RDD использовать алиасное имя
2. До закрытия транзакции нельзя использовать команду COMMIT. ( получится Sintax error)

Может Паша посоветует еще чего то .

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3360
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 23.11.15 11:23. Заголовок: Надо просто вызывать..


Надо просто вызывать Leto_BeginTransaction() с рабочей областью, открытой через leto
Пример:

letotab->( Leto_BeginTransaction() )

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 44
Зарегистрирован: 06.05.14
ссылка на сообщение  Отправлено: 23.11.15 18:59. Заголовок: Я знаю, что это може..


Я знаю, что это может решить проблему, но мне интересно, почему Leto_BeginTransaction() использует открытый DBF? Объяснение: в программе у меня есть следующие части:


 цитата:
SELECT Tmp
TransBegin()

WHILE !Eof()
TransProc()
LetoTab->(DBAppend())
LetoTab->f1 := f1
LetoTab->f2 := f2
...
SKIP
END DO
TransEnd()



Универсальные функции (TransBegin, TransProc и TransEnd) хочу, чтобы использовать во всей программы. Функция TransBegin на основе записи TMP (DBFNTX) устанавливает параметры и призывает Leto_BeginTransaction. Но TransBegin "не знает" за LetoTab, поэтому я вынужден передать и этот параметр. Вот почему я хочу знать, если он играет роль в Leto_BeginTransaction?

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3363
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 24.11.15 08:04. Заголовок: Такое поведение связ..


Такое поведение связано с тем, что функции Leto_BeginTransaction необходимо знать, для какого соединения (сервера) letodb будет транзакция. Соединений же может быть несколько. Вот это соединение и берется из текущей рабочей области. А если эта р/о не leto, то генерируется ошибка.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 45
Зарегистрирован: 06.05.14
ссылка на сообщение  Отправлено: 24.11.15 22:20. Заголовок: Спасибо! Я буду испо..


Спасибо! Я буду использовать любую открытую DBF.

(Это не имеет большое значения, но я думаю, что это должно быть изменено).



Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 46
Зарегистрирован: 06.05.14
ссылка на сообщение  Отправлено: 29.11.15 00:33. Заголовок: Когда я начал исполь..


Когда я начал использовать транзакции, моя программа начала работать гораздо медленнее. Так что я сделал некоторые тесты. Тестовая программа копирует локальный DBF в таблице на сервере. Я обнаружил, что моя программа работает намного медленнее, чем Андреев DbfToServer. Например, таблицы 30000 записей:

DbfToServer: 11 с
моя программа: 65 с

Чтобы скопировать, используя тот же алгоритм. После многих испытаний, я нашел разницу: моя DBF таблицы на сервере имеет индекс. Когда индекс выключен, программа значительно ускоряется. Это нормально, LetoDB требуется больше времени, чтобы обновить индекс. Но когда выключается транзакции, программа становится в несколько раз быстрее: 19 с! Почему? Это не логично.

Тогда я попытался изменить размер буфера для транзакции. Я обменял буфер от 1000 до 50.0000, но я не заметил существенной разницы в скорости. Лучшие результаты имеют для буфера 3000-4000. DbfToServer определять размер буфера 1000 x RecordSize, но использует только 70%. Например, если размера данных 1500, тогда буфер 1.500.000, что я думаю, это слишком много.

Что бы вы посоветовали?


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 47
Зарегистрирован: 06.05.14
ссылка на сообщение  Отправлено: 04.12.15 05:30. Заголовок: Продолжаю тестирован..


Продолжаю тестирования с индексами. Я сделал программу, которая копирует Test0 DBF (10000 записей) с локального диска на сервер в DBF Test2. Копирование выполняется следующим образом:

1. Тест2 не имеет индексов, без транзакции (-)
2. Тест2 имеет индексы, без транзакции (I)
3. Тест2 не имеет индексы, транзакции включены (T)
4. Тест2 имеет индексы, транзакции включены (I+T)

Программа и результаты можно найти здесь:

https://drive.google.com/folderview?id=0BwEGIJ1QfjrKY1NNLWRheENyUkE&usp=sharing

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

 
Records - I T I+T
-------------------------------
90000 2.3 3.7 1.5 2.6
170000 2.2 2.3 1.5 3.0
730000 2.2 2.2 1.6 7.6
1450000 2.2 2.3 2.1 11.0
2010000 2.2 2.4 2.0 12.3
2050000 2.2 2.5 2.0 14.3


Почему это происходит? Результаты показывают, что операции и индексы не является проблемой, когда они не используются вместе.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3373
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 04.12.15 09:24. Заголовок: А в letodb.ini на се..


А в letodb.ini на сервере случайно нет строки:

Share_Tables = 1

?

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 48
Зарегистрирован: 06.05.14
ссылка на сообщение  Отправлено: 04.12.15 17:02. Заголовок: Да. Но я проверил ва..


Да. Но я проверил вариант Share_Tables = 0 и получил аналогичные результаты:

Records    -    Ind  Tran Ind+T 
-------------------------------
2090000 2.3 10.2 1.5 14.5
2130000 2.1 2.4 1.8 14.6
2170000 2.2 2.3 1.8 14.4
2210000 2.5 2.4 1.9 15.3
2250000 2.3 2.2 2.0 14.8
2290000 2.5 2.7 2.1 15.8
2330000 2.4 2.5 2.0 14.9


Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3374
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 07.12.15 16:13. Заголовок: Что-то у меня не пол..


Что-то у меня не получается такой результат. А в prg по ссылке нет вообще операций с транзакциями.
Я сделал свой тест с индексом:


PROC Main
Local cPath, nSec, i, nn := 0
Local lTr := .t.

request leto, DBFCDX
RddSetDefault ("LETO")
cPath := "//127.0.0.1:2812/"
Leto_Connect (cPath)

USE (cPath + "wopl") SHARED NEW
SET INDEX TO (cPath + "wopl")

use wop new via "DBFCDX"
go top
nSec := Seconds()
if lTr
wopl->(leto_BeginTransaction(32768))
endif
while ! eof()
wopl->(dbAppend())
for i := 1 to fcount()
wopl->(FieldPut(i, wop->(FieldGet(i))))
next
if nn % 10000 == 0 .and. lTr
wopl->(leto_CommitTransaction())
wopl->(leto_BeginTransaction(32768))
endif
if ++nn == 100000
exit
endif
skip
enddo
if lTr
wopl->(leto_CommitTransaction())
endif
? Seconds() - nSec
// 23.87 -T+I
// 7.32 +T+I

RETURN

Результат работы для 100000 записей:
23.87 сек без транзакций
7.32 сек с транзакциями
Т.е. передача файла, если использовать транзакции, выполняется примерно в 3 раза быстрее.
Одну большую транзакцию я разбил на небольшие по 10000 записей.
Может быть, выложите свой тест, в котором получается медленный результат при использовании транзакций ?

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 49
Зарегистрирован: 06.05.14
ссылка на сообщение  Отправлено: 08.12.15 04:21. Заголовок: DBF Wop (локальный) ..


DBF Wop (локальный) не должен быть больше, чем 10.000 записей. Основная проблема находится в WopL (на сервере). DBF на сервере должен иметь более 500.000 записей и минимум два индекса. Когда есть меньше записей или индекс, скорость увеличивается.

Я пробовал ваш тест программ (Wop = 10k записей):

WopL     Index        -T+I        +T+I 
--------------------------------------
10k 1 4.2 3.9
10k 2 4.2 4.5
2M 1 4.4 7.4
2M 2 4.3 13.0



Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3375
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 08.12.15 09:31. Заголовок: Большие dbf можно вз..


Большие dbf можно взять здесь:
http://www.gnivc.ru/html/gnivcsoft/KLADR/Base.7z
Я взял doma.dbf, более 2-х млн.записей, размер более 200MB
Создал много (9) индексов:
имя тэга ключ
code 'CODE'
namec 'SUBSTR(CODE,1,11)+UPPER(NAME)'
nasel 'SUBSTR(CODE,1,11)'
nameg 'SUBSTR(CODE,1,8)+UPPER(NAME)'
namemp 'SUBSTR(CODE,1,5)+UPPER(NAME)'
ocato 'OCATD'
gni 'GNINMB'
scode 'SUBSTR(CODE,1,2)'
s_code 'SUBSTR(CODE,1,15)'

Прогнал по сети тест с копированием 100000 записей на сервер letodb без транзакций, и с транзакциями по 10000 записей
Результат теста:
Без транзакций: 154 сек
С транзакциями: 44 сек

Вот чуть измененный тест:

PROC Main
Local cPath, nSec, i, nn := 0
Local cNm := 'doma'
Local lTr := .t.

request leto, DBFCDX
RddSetDefault ("LETO")
cPath := "//10.0.0.1:2812/"
//cPath := "//127.0.0.1:2812/"
Leto_Connect (cPath)

USE (cPath + cNm) alias db_srv SHARED NEW
SET INDEX TO (cPath + cNm)

use (cNm) alias db_loc new via "DBFCDX"
go top
nSec := Seconds()
if lTr
db_srv->(leto_BeginTransaction(32768))
endif
while ! eof()
db_srv->(dbAppend())
for i := 1 to fcount()
db_srv->(FieldPut(i, db_loc->(FieldGet(i))))
next
if nn % 10000 == 0
? nn
if lTr
db_srv->(leto_CommitTransaction())
db_srv->(leto_BeginTransaction(32768))
endif
endif
if ++nn == 100000
exit
endif
skip
enddo
if lTr
db_srv->(leto_CommitTransaction())
endif
? lTr, Seconds() - nSec

RETURN


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 50
Зарегистрирован: 06.05.14
ссылка на сообщение  Отправлено: 08.12.15 19:26. Заголовок: Я использую NTX инде..


Я использую NTX индексы, предполагают, что это может быть проблема. Программа с CDX индексов работать быстрее - время сокращается с 13 до 4,4 секунд. Вы можете проверить это?

К сожалению, я должен использовать NTX индексов.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3376
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 09.12.15 09:29. Заголовок: Ну никак не получает..


Ну никак не получается у меня эффект медленной транзакции.
Для ntx копирование 15000 записей с 9 индексами: без транзакции примерно 7 сек, с транзакциями - 6 сек.

letodb.ini:

DataPath = e:/db
EnableFileFunc = 1
EnableAnyExt = 1
Optimize = 1
AutOrder = 1
Default_Driver = NTX

тест:

PROC Main
Local cPath, nSec, i, nn := 0
Local cNm := 'doma'
Local lTr := .t.
Field Code, OCATD, GNINMB

request leto, DBFCDX
RddSetDefault ("LETO")
//cPath := "//10.0.0.1:2812/"
cPath := "//127.0.0.1:2812/"
Leto_Connect (cPath)

USE (cPath + cNm) alias db_srv SHARED NEW
if ! leto_File(cPath+cNm+'.ntx')
? 'Indexing...'
index on CODE to doma1
index on SUBSTR(CODE,1,11) to doma2
index on SUBSTR(CODE,1,11) to doma3
index on SUBSTR(CODE,1,8) to doma4
index on SUBSTR(CODE,1,5) to doma5
index on OCATD to doma6
index on GNINMB to doma7
index on SUBSTR(CODE,1,2) to doma8
index on SUBSTR(CODE,1,15) to doma9
endif

SET INDEX TO (cPath + cNm + '1')
SET INDEX TO (cPath + cNm + '2')
SET INDEX TO (cPath + cNm + '3')
SET INDEX TO (cPath + cNm + '4')
SET INDEX TO (cPath + cNm + '5')
SET INDEX TO (cPath + cNm + '6')
SET INDEX TO (cPath + cNm + '7')
SET INDEX TO (cPath + cNm + '8')
SET INDEX TO (cPath + cNm + '9')
dbSetOrder(1)

use (cNm) alias db_loc new via "DBFCDX"
go top
nSec := Seconds()
if lTr
db_srv->(leto_BeginTransaction(32768))
endif
while ! eof()
db_srv->(dbAppend())
for i := 1 to fcount()
db_srv->(FieldPut(i, db_loc->(FieldGet(i))))
next
if nn % 10000 == 0
? nn
if lTr
db_srv->(leto_CommitTransaction())
db_srv->(leto_BeginTransaction(32768))
endif
endif
if ++nn == 15000
exit
endif
skip
enddo
if lTr
db_srv->(leto_CommitTransaction())
endif
? lTr, Seconds() - nSec

RETURN


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 51
Зарегистрирован: 06.05.14
ссылка на сообщение  Отправлено: 09.12.15 18:06. Заголовок: LetoDB.ini: Default_..


LetoDB.ini:
Default_Driver = NTX
EnableFileFunc = 1
Optimize = 1

сервер: Windows Server 2003, 100Mb LAN
рабочая станция: Windows 7


 цитата:
SET INDEX TO (cPath + cNm + '1')
SET INDEX TO (cPath + cNm + '2')
SET INDEX TO (cPath + cNm + '3')
SET INDEX TO (cPath + cNm + '4')
SET INDEX TO (cPath + cNm + '5')
SET INDEX TO (cPath + cNm + '6')
SET INDEX TO (cPath + cNm + '7')
SET INDEX TO (cPath + cNm + '8')
SET INDEX TO (cPath + cNm + '9')
dbSetOrder(1)



Я думаю, что это только открывает последний индекс. Попробуйте:

SET INDEX TO (cPath + cNm + '1'), (cPath + cNm + '2'), (cPath + cNm + '3'), ...

Я попробую тест на другом сервере. Спасибо за помощь!

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3377
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 09.12.15 18:47. Заголовок: Да, я почти сразу за..


Да, я почти сразу заметил, что пропустил ADDITIVE. Но и с этой опцией результат не изменился.
Попробуйте мой тест с файлом по ссылке, что я дал. Может быть, в вашем тесте есть еще какие-нибудь особенности.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 52
Зарегистрирован: 06.05.14
ссылка на сообщение  Отправлено: 12.12.15 19:57. Заголовок: результаты: без тра..


результаты:

без транзакций : 8.5
С транзакциями: 6.5

Это нормальный результат. Тогда я изменил DBF, добавил числовое поле ID (N10), заполнил ID = RecNo().
После этого изменил тестовую программу таким образом, чтобы она использует только два индекса:

index on ID to doma1
index on Upper(NAME) to doma2

Потом я получил следующие результаты:

без транзакции: 6.3
С транзакциями: 9.0

Когда я добавил третий числовой индекс:

index on ID to doma3

получил:

без транзакции: 6.4
С транзакциями: 11.2

Кажется, что проблема в числовых полях в индексе.


Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3381
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 18.12.15 13:48. Заголовок: Все равно у меня не ..


Все равно у меня не получается медленная транзакция
Без транзакции результат 24.65 сек
С транзакцией: 4.96 сек

Служба letodb установлена на компьютере с win7

letodb.ini:

DataPath = e:/
EnableFileFunc = 1
EnableAnyExt = 1
Optimize = 1
AutOrder = 1
Default_Driver = NTX
#Share_Tables = 1

Вот мой тест:

PROC Main
Local cPath, nSec, i, nn := 0
Local cNm := 'doma'
Local lTr := .t.
Field Code, OCATD, GNINMB, ID, Name

request leto, DBFCDX
RddSetDefault ("LETO")
cPath := "//10.0.0.1:2812/"
//cPath := "//127.0.0.1:2812/"
Leto_Connect (cPath)

USE (cPath + cNm) alias db_srv SHARED NEW
if ! leto_File(cPath+cNm+'1.ntx')
? 'Indexing...'
index on ID to doma1
index on Upper(NAME) to doma2
index on ID to doma3
endif

SET INDEX TO (cPath + cNm + '1') additive
SET INDEX TO (cPath + cNm + '2') additive
SET INDEX TO (cPath + cNm + '3') additive
dbSetOrder(1)

use (cNm) alias db_loc new via "DBFCDX"
go top
nSec := Seconds()
if lTr
db_srv->(leto_BeginTransaction(32768))
endif
while ! eof()
db_srv->(dbAppend())
for i := 1 to fcount()
db_srv->(FieldPut(i, db_loc->(FieldGet(i))))
next
if nn % 10000 == 0
? nn
if lTr
db_srv->(leto_CommitTransaction())
db_srv->(leto_BeginTransaction(32768))
endif
endif
if ++nn == 15000
exit
endif
skip
enddo
if lTr
db_srv->(leto_CommitTransaction())
endif
? lTr, Seconds() - nSec

RETURN


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 53
Зарегистрирован: 06.05.14
ссылка на сообщение  Отправлено: 24.12.15 05:08. Заголовок: Очень странно. Паша,..


Очень странно. Паша, я тестировал вашу программу на трех разных серверах (Win 2003, Win 7, Win 2012), и получил следующие результаты:

      Tr      NoTr 
------------------
s1 12.3 6.7
s2 8.4 6.2
s3 14.3 5.1


Я бы попросить кого-нибудь, чтобы попробовать программу - на этом адресе тестовая программа:

testhttps://drive.google.com/file/d/0BwEGIJ1QfjrKS1RYaEFGMXB0QzA/view?usp=sharing


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4628
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 24.12.15 12:02. Заголовок: nbatocanin пишет: ч..


nbatocanin пишет:

 цитата:
чтобы попробовать программу



Попробовал. Сервер в инете Win2008, вот результат:
Indexing...
0
10000
.F. 322.13

Indexing...
0
10000
.T. 2.36

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 54
Зарегистрирован: 06.05.14
ссылка на сообщение  Отправлено: 05.01.16 20:31. Заголовок: Есть ли функция Leto..


Есть ли функция Leto_CommitTransaction выполняет COMMIT? Необходимо ли выполнить COMMIT после Leto_CommitTransaction?

Ненад

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3401
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 06.01.16 08:03. Заголовок: COMMIT желательно де..


COMMIT желательно делать до выполнения Leto_CommitTransaction()

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 55
Зарегистрирован: 06.05.14
ссылка на сообщение  Отправлено: 08.01.16 05:49. Заголовок: Я сделал новые тесты..


Я сделал новые тесты на несколько серверов (10+). Сначала я попробовал тест, который сделал Паша. Результаты (для меня) были очень странные. Время выполнения очень меняется (почему я взял среднее значение из нескольких тестов). На некоторых серверах, программа выполняется быстрее без транзакции, но в некоторых наоборот. Я думаю, время зависит от скорости диска и Windows кэширования. Например, тест на одном сервере с двумя дисками (HDD и SSD):

     Tran  NoTr 
---------------
HDD 3.9 1.1
SDD 1.4 1.8


Но этот тест не выполняют COMMIT в конце программы, так что я сделал новый тест, который использует функцию Leto_Commit():

IF lTrans 
Leto_CommitTransaction()
END IF
Leto_Commit()


Я также сделал тест так, чтобы больше соответствовать реальной ситуации. Вот тестовая программа:

GoogleDrivehttps://drive.google.com/open?id=0BwEGIJ1QfjrKT2RLdlNvV2NwUHc

Новый тест показал, что работать с транзакции (+COMMIT) всегда быстрее, чем без:

     Tran  NoTr 
---------------
S1 2.5 8.2
S2 1.1 5.6
S3 4.6 10.6
S4 1.1 0.8


Исключением является сервер с SSD (S4).

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 56
Зарегистрирован: 06.05.14
ссылка на сообщение  Отправлено: 08.01.16 20:24. Заголовок: Как ускорить транза..


Как ускорить транзакциу, которая имеет команду DELETE?. Например:

Leto_BeginTransaction() 
//
SEEK nOldId
WHILE nOldId == d_id
DELETE
SKIP
END DO
//
...
//
Leto_CommitTransaction()


Эта программа работает в 20 раз быстрее без транзакции. Программа исключить около 25.000 записей.


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 5458
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 08.01.16 22:31. Заголовок: nbatocanin пишет: W..


nbatocanin пишет:

 цитата:
WHILE nOldId == d_id


Про ускорение не скажу а вот код надо подправить.
 
IF DBSEEK( nOldId )
WHILE nOldId == d_id .and. !eof()
DELETE
SKIP
END DO
ENDIF


Хотя можно ускорить так (без проверки ключа)
 
IF DBSEEK( nOldId )
dbOrderInfo(DBOI_SCOPEBOTTOM,,,nOldId))
DO WHILE !eof()
DELETE
SKIP
END DO
dbOrderInfo(DBOI_SCOPEBOTTOMCLEAR)
ENDIF


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 57
Зарегистрирован: 06.05.14
ссылка на сообщение  Отправлено: 09.01.16 05:19. Заголовок: Попробовал, но не им..


Попробовал, но не имеют никакого эффекта. Я также попробовал DELETE WHILE.

Без транзакции: 1.67
С транзакцией: 80.00


Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3402
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 10.01.16 09:51. Заголовок: nbatocanin пишет: К..


nbatocanin пишет:

 цитата:
Как ускорить транзакциу, которая имеет команду DELETE?. Например:

Leto_BeginTransaction()
//
SEEK nOldId
WHILE nOldId == d_id
DELETE
SKIP
END DO
//
...
//
Leto_CommitTransaction()



Эта программа работает в 20 раз быстрее без транзакции. Программа исключить около 25.000 записей.



Немного видоизмените алгоритм:

Leto_BeginTransaction()
//
i := 0
SEEK nOldId
WHILE nOldId == d_id
DELETE
i ++
if i%1000 == 0
Leto_CommitTransaction()
Leto_BeginTransaction()
endif
SKIP
END DO
Leto_CommitTransaction()

Причина замедления транзакции для большого количества записей следующая: после получения новых данных с сервера по команде skip выполняется проверка, есть ли новая полученная запись в данных транзакции. Если запись есть, то она формируется по данным из буфера транзакции. После каждой итерации буфер транзакции увеличивается, и проверка выполняется каждый раз медленнее.
В этом случае такая проверка и не нужна, поскольку новая запись заведомо не присутствует в буфере транзакции, но в общем случае она нужна.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 58
Зарегистрирован: 06.05.14
ссылка на сообщение  Отправлено: 10.01.16 20:48. Заголовок: Спасибо Пашa, это ча..


Спасибо Пашa, это частично решило проблему. Но программа без транзакции по-прежнему работает быстрее (4.5sek; Без: 1.5сек). Можно ли как-то исключить эту проверку?



Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 60
Зарегистрирован: 06.05.14
ссылка на сообщение  Отправлено: 09.04.16 16:39. Заголовок: Pasha пишет: Причин..


Pasha пишет:

 цитата:
Причина замедления транзакции для большого количества записей следующая: после получения новых данных с сервера по команде skip выполняется проверка, есть ли новая полученная запись в данных транзакции. Если запись есть, то она формируется по данным из буфера транзакции. После каждой итерации буфер транзакции увеличивается, и проверка выполняется каждый раз медленнее.
В этом случае такая проверка и не нужна, поскольку новая запись заведомо не присутствует в буфере транзакции, но в общем случае она нужна.



Паша, можно ли как-то выключение этой проверки? У меня есть большие транзакции, в которых нет дубликатов.

Спасибо,

Ненад

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3426
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 11.04.16 08:15. Заголовок: Сегодня вечером сдел..


Сегодня вечером сделаю обновление

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 934
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 11.04.16 14:09. Заголовок: Pasha В старой верс..


Pasha
В старой версии leto (клиент), мы сделали (стало надежнее, стабильнее):
 
static BOOL lNewCritSect=TRUE;
CRITICAL_SECTION CritSect;

#define CS_EN() EnterCriticalSection( &CritSect )
#define CS_LV() LeaveCriticalSection( &CritSect )


long int leto_DataSendRecv( LETOCONNECTION * pConnection, const char * sData, ULONG ulLen )
{
long int n = 0;

if( lNewCritSect )
{
InitializeCriticalSectionAndSpinCount(&CritSect, 0x00000400);

// TryEnterCriticalSection( &CritSect );

lNewCritSect = FALSE;
}

CS_EN();

if( hb_ipSend( pConnection->hSocket, sData, (ulLen)? ulLen:strlen(sData), -1 ) > 0 )
{
n = leto_Recv( pConnection->hSocket ); // return 0;
}

CS_LV();
// return leto_Recv( pConnection->hSocket );
return n;
}

в новой также планируем сделать, пока на новой не работаем (только тестируем)


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 935
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 11.04.16 18:16. Заголовок: PS что то я с раздел..


PS
что то я с разделом промахнулся - это (выше) к "Internal Error" относиться. Sory

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 62
Зарегистрирован: 06.05.14
ссылка на сообщение  Отправлено: 12.04.16 16:34. Заголовок: long int leto_DataSe..



 цитата:
long int leto_DataSendRecv( LETOCONNECTION * pConnection, const char * sData, ULONG ulLen )



Можете ли вы объяснить, что делает эта функция?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 939
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.04.16 17:17. Заголовок: nbatocanin пишет:что..


nbatocanin пишет:
 цитата:
что делает эта функция?


как я понимаю, она посылает команды серверу и ждет их выполнения

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 63
Зарегистрирован: 06.05.14
ссылка на сообщение  Отправлено: 13.04.16 03:54. Заголовок: Pasha пишет: Сегодн..


Pasha пишет:

 цитата:
Сегодня вечером сделаю обновление



работает, спасибо!

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 98
Зарегистрирован: 06.05.14
ссылка на сообщение  Отправлено: 12.07.16 03:46. Заголовок: Почему это не работа..


Почему это не работает?

USE Test NEW
Leto_BeginTransaction ()
s := Select()
FLock()
(s)->(DBUnlock()) // Syntax error
Leto_CommitTransaction ()


Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3463
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 12.07.16 11:50. Заголовок: Во время транзакции ..


Во время транзакции нельзя выдавать dbUnlock()
Надо или разблокировать данные после LETO_COMMITTRANSACTION().
либо выдать LETO_COMMITTRANSACTION(.t.), задав параметр lUnlockAll

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 99
Зарегистрирован: 06.05.14
ссылка на сообщение  Отправлено: 31.07.16 04:41. Заголовок: А почему это не рабо..


А почему это не работает:

USE Test1 SHARED NEW
RLock ()
USE Test2 SHARED NEW
RLock ()

Leto_BeginTransaction ()
Test2->t_name := "abc"
Leto_CommitTransaction ()

Test1->t_log := .T.

COMMIT // Error LETO/1022 Lock required



Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 100
Зарегистрирован: 06.05.14
ссылка на сообщение  Отправлено: 05.08.16 18:21. Заголовок: Как я понимаю, транз..


Как я понимаю, транзакця разблокирует все таблицы, даже те, которые не упоминаются в транзакции?

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3477
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 06.08.16 18:51. Заголовок: nbatocanin пишет: К..


nbatocanin пишет:

 цитата:
Как я понимаю, транзакця разблокирует все таблицы, даже те, которые не упоминаются в транзакции?



Да, это так. Но у функции leto_CommitTransaction есть параметр lUnlockAll, и при вызове:

leto_CommitTransaction( .F. )

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

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 101
Зарегистрирован: 06.05.14
ссылка на сообщение  Отправлено: 06.08.16 22:21. Заголовок: Жаль, что работает т..


Жаль, что работает таким образом, я думаю, что сейчас транзакции самая слабая часть Letodb.

Большое спасибо!

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 44 , стр: 1 2 3 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

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