Страница 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 выборка]

Так что особенной "нагрузки" на сервер не наблюдается.

Алексей