Страница 1 из 2
Поделитесь опытом
Добавлено: 16 Февраль 2012, 1:48
gopstop2007
Код: Выделить всё
Из файла в MySQL создали очередь
QueOstatWares QUEUE,PRE(QUE) !
Nid LONG !
N_ID_Items SHORT !порядковый номер реализатора
NWARES SHORT !инд номер товара
Ostatok LONG !остаток по релизатору
END !
====Аналог вышеуказаного файла в TPS только без поля пользов. который берется с № компьютера при подключении к базе ====
WARES FILE,DRIVER('TOPSPEED'),NAME('wares.TPS')
WAR:NWARESKEY KEY(+WAR:NWARES),NOCASE,OPT,PRIMARY
RECORD RECORD
WAR:NWARES SHORT
WAR:OSTAT LONG
END
END
необходимо используя 'Пользов.' и 'Код товара' изменить 'Остаток товара' в файле MySQL(SQLOstatkiAll) или добавить, если записи нет.
Вот вырисовалось
Код: Выделить всё
SET(WAR:NWARESKEY)
LOOP
NEXT(WARES)
IF ERRORCODE() THEN BREAK END
QUE:NWARES = WAR:NWARES
GET(QueOstatWares,QUE:NWARES)
IF ERRORCODE()
SQLOstatkiAll:N_ID_Items = SETUP:N_OutItems ! № компа
SQLOstatkiAll:NWARES = WAR:NWARES
SQLOstatkiAll:Ostatok = WAR:EditOstat
IF MAVInsert(SQLOstatkiAll) ! insert
MAVSHOWERROR
!RETURN
END
ELSE
SQLOstatkiAll:Nid = QUE:Nid
SQLOstatkiAll:N_ID_Items = SETUP:N_OutItems ! № компа
SQLOstatkiAll:NWARES = WAR:NWARES
SQLOstatkiAll:Ostatok = WAR:EditOstat
IF MAVUpdate(SQLOstatkiAll) ! change
MAVSHOWERROR
!RETURN
END
END
END
Вопрос: Есть ли более простая конструкция или аналог REPLACE или еще чего, так как при обращении только одного пользователя обрабатывается около 5000 записей , а таких пользователей до пятнадцати.
Принцип работы, пользователь при подключении к серверу (не постоянное соединение), происходит сравнение записей остатков находящихся на компьютере с остатком на сервере и изменение при необходимости.
Буду рад любой критике, так как дилетант в данном вопросе.
MySQL Clarion 6.3 9058 ABC
Re: Поделитесь опытом
Добавлено: 16 Февраль 2012, 12:10
Алексей- Софт-Центр
Добрый день!
Правильно ли я Вас понял, что:
1. Сначала Вы читаете в очередь SQL - файл
2. Потом сравнивая его с локальным TPS
3. Измененные (или несуществующие)данные записываете обратно в SQL.
Если так, то я бы сделал немного подругому, сократив количество обращений с сервером
и тем самым ускорив данную процедуру.
1. Сначала записать локальный TPS в MySQL базу
2. Выполнить хранимую MySQL-процедуру, которая выполнит обновление/добавление записей в основном MySQL-файле.
Правда, на вкус и цвет ...
Алексей
Re: Поделитесь опытом
Добавлено: 16 Февраль 2012, 13:18
kreator
Не понятно, почему обрабатываются 5000 записей. У вас же поиск идет по индексу (ключу).
Вообще, поиск по ТРS, по-моему, делается так:
clear(WAR:Record)
WAR:NWARES = QUE:NWARES
SET(WAR:NWARESKEY,WAR:NWARESKEY)
LOOP
NEXT(WARES)
..
END
Re: Поделитесь опытом
Добавлено: 16 Февраль 2012, 17:23
gopstop2007
Алексей- Софт-Центр писал(а):Добрый день!
Правильно ли я Вас понял, что:
1. Сначала Вы читаете в очередь SQL - файл
2. Потом сравнивая его с локальным TPS
3. Измененные (или несуществующие)данные записываете обратно в SQL.
Абсолютно, правильно.
Алексей- Софт-Центр писал(а):Добрый день!
1. Сначала записать локальный TPS в MySQL базу
2. Выполнить хранимую MySQL-процедуру, которая выполнит обновление/добавление записей в основном MySQL-файле.
по 2 пункту, есть ли возможность кинуть образец хранимой процедуры, по которой я мог бы создать свою, так как я это буду делать в первый раз
kreator писал(а):Не понятно, почему обрабатываются 5000 записей. У вас же поиск идет по индексу (ключу).
не совсем ясен вопрос, почему обрабатываются ВСЕ записи? потому чтобы ВСЕ записи, что на MySQL и в файле TPS должны быть между собой идентичными (одинаковыми)
Re: Поделитесь опытом
Добавлено: 16 Февраль 2012, 19:00
kreator
Тогда всё правильно. Всё равно придется делать 5000 обращений к SQL серверу (максимально). Я бы не стал переделывать, овчинка выделки не стоит (ИМХО).
А изначально какая идея этой задачи? Репликация данных? Между удаленными точками и центральным офисом?
Re: Поделитесь опытом
Добавлено: 16 Февраль 2012, 19:57
gopstop2007
kreator писал(а):Тогда всё правильно. Всё равно придется делать 5000 обращений к SQL серверу (максимально). Я бы не стал переделывать, овчинка выделки не стоит (ИМХО).
А изначально какая идея этой задачи? Репликация данных? Между удаленными точками и центральным офисом?
вернее 5000*15 обращений к серверу. Задача - объединение остатков для совместного просмотра. Да, репликация, только той части которая доступна для данного пользователя, остальные данные только для просмотра.
Re: Поделитесь опытом
Добавлено: 16 Февраль 2012, 20:26
kreator
А 15 пользователей - с разных компьютеров? В разное время идёт репликация?
Re: Поделитесь опытом
Добавлено: 16 Февраль 2012, 23:04
gopstop2007
kreator писал(а):А 15 пользователей - с разных компьютеров? В разное время идёт репликация?
да, с разных компьютеров. Насчет времени, кто когда запросит, не исключается одновременная (15) репликация. Тут одновременная работа (добавление, изменение, удаление)
Re: Поделитесь опытом
Добавлено: 17 Февраль 2012, 12:31
Алексей- Софт-Центр
Добрый день!
Всё равно придется делать 5000 обращений к SQL серверу (максимально).
Немного не правильно!!!!
Сначала идет считывание ( 5000 обращений) из MySQL в очередь.
Потом сравнение и изменение /дополнение N-записей из программы в MySQL (еще N- обращений).
Где N от 0 (что маловероятно) до 5000 .
Следовательно при таком варианте количество обращений к MySQL = 5000+N.
При варианте с хранимым запросом:
Количество обращений:
1 - выполнить хранимую процедуру очистки таблицы для хранения данных TPS файла пользователя.
5000 - записать данные из TPS в таблицу MySQL
1 - выполнить хранимую процедуру изменение /дополнение записей.
ИТОГО = 1+5000+1=5002
(арифметика-царица наук!
)
По поводу хранимой процедуры:
все достаточно просто смотри формат :
INSERT INTO ... ON DUPLICATE UPDATE ...
Если не разберешься - стучись помогу.
Алексей
Re: Поделитесь опытом
Добавлено: 17 Февраль 2012, 13:57
gopstop2007
По поводу хранимой процедуры:
почитал, говорится о том, сервер SQL желательно (правильно) использовать только для хранения данных, а все операции с большим объемом данных при использовании всех записей для модификации лучше выполнять на клиенте. Типа идет нагрузка на сервер, и увеличивается время доступа других пользователей к серверу. тем более у меня возможно выполнение до 15 хранимок одновременно, не велика ли нагрузка на сервер?
Re: Поделитесь опытом
Добавлено: 17 Февраль 2012, 14:32
Алексей- Софт-Центр
Добрый день!
сервер SQL желательно (правильно) использовать только для хранения данных
Это "версия" , которая тоже имеет право на жизнь
Нагрузка на сервер конечно увеличится, но на сколько???
Проверить просто: создайте хранимую процедуру и посмотрите время ее выполнения.
Ну или включайте логи MySQL и смотрите какие запросы пользователей как долго обрабатываются..
но это уже тема не Клариона, а Администрирования MySql
P.S. На сколько я понял, вся работа у Вас ведется на локальной машине пользователя, а только в какое-то время
происходит "синхронизация" с MySql.
Алексей
Re: Поделитесь опытом
Добавлено: 17 Февраль 2012, 16:08
kreator
Предлагаю следующее. Поскольку репликация, судя по описанию, идет в одну сторону (из TPS в MySQL), то сделайте тест - с одного клиента добавьте 75000 записей в таблицу MySQL (именно в ту, какую надо), но сделайте формирование записей на клиенте в памяти, без использования TPS, посмотрите время выполнения. Я давным давно делал такие тесты, найду у себя, проверю. Просто думаю 75000 записей для SQL сервера - ничто, дробина для слона.
Re: Поделитесь опытом
Добавлено: 17 Февраль 2012, 16:39
Алексей- Софт-Центр
Добрый день!
Поскольку репликация, судя по описанию, идет в одну сторону
В обе: сначали из, потом в MySql
с одного клиента добавьте 75000 записей в таблицу MySQL
Вот здесьб будет "засада":
так как кларион добавляет записи , использую previous оператор, то такое добавление будет ну очень долгое!
Алексей
Re: Поделитесь опытом
Добавлено: 06 Март 2012, 11:39
kreator
Сделал я тест. Создал таблицу на сервере, такую же как у gopstop2007.
Добавление 50000 записей проходит за 23 сек. Update 50000 записей за 25 сек.
Правда MAV не использую, запросы по prop:SQL. И в качестве сервера Sybase SQL Anywhere 12, MySQL нет под рукой.
Re: Поделитесь опытом
Добавлено: 06 Март 2012, 16:14
Алексей- Софт-Центр
Добрый день!
Создал две таблицы в MySql.
В одну записал 50 000 записей .
Вторая таблица аналог первой.
Время выполнения запроса:
insert INTO t2 SELECT * from t1 on duplicate key
update t2.c1=t1.c1,t2.c2=t1.c2 ;
Хранимая процедура 'proba.p' была успешно выполнена.
proba_t2: Запрос открыт за 0.003c [0.002c выполнение, 0.001c выборка]
Так что особенной "нагрузки" на сервер не наблюдается.
Алексей