powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как сделать быстрее?
11 сообщений из 11, страница 1 из 1
Как сделать быстрее?
    #32109708
Фотография Bol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Две базы данных лежат на разных машинах. На обоих машинах стоит fb_win32_0_9_5_290 и BDE. На одной машине – Windows2000 server, а на второй Windows98. Менять железо и системы нет возможности (по внутренним причинам).

В алиасе «Steklo» по окончании рабочего дня выполняется копирование данных за день в «Steklo_arc» и затем данные в «Steklo» «чистятся». Перед копированием необходимо выполнить синхронизацию всех справочников, что выполняется следующим образом.

Данные запросы написаны в компонентах «TQuery», которые напрямую минуя «TDatabase» при активации подключаются к алиасам через BDE

Сначала проверяются позиции на наличие новых вставок:

SELECT ":Steklo:T_SKLAD".N_SKLAD,":Steklo:T_SKLAD".N_PARENTS,
":Steklo:T_SKLAD".SKLAD FROM ":Steklo:T_SKLAD" where ":Steklo:T_SKLAD".N_SKLAD<>ALL(SELECT :Steklo_arc:T_SKLAD".N_SKLAD from ":Steklo_arc:T_SKLAD" )

И процедурой ниже описанной в Steklo_arc выполняется добавление строк. (процедура автоматом вызывается из приложения)

CREATE PROCEDURE SYNHRO_SKLAD (N_SKLAD INTEGER,N_PARENTS INTEGER,SKLAD VARCHAR(50)) AS

begin

INSERT INTO T_SKLAD(N_SKLAD,N_PARENTS,SKLAD) VALUES (:N_SKLAD,:N_PARENTS,:SKLAD);

end

Затем идет проверка на изменения в старых позициях:

SELECT ":Steklo:T_SKLAD".N_SKLAD,":Steklo:T_SKLAD".N_PARENTS, ":Steklo:T_SKLAD".SKLAD, ":Steklo_arc:T_SKLAD".N_SKLAD,":Steklo_arc:T_SKLAD".N_PARENTS, ":Steklo_arc:T_SKLAD".SKLAD FROM ":Steklo:T_SKLAD",":Steklo_arc:T_SKLAD" where ((":Steklo:T_SKLAD".N_SKLAD=":Steklo_arc:T_SKLAD".N_SKLAD) and (":Steklo:T_SKLAD".N_PARENTS<>":Steklo_arc:T_SKLAD".N_PARENTS)) or ((":Steklo:T_SKLAD".N_SKLAD=":Steklo_arc:T_SKLAD".N_SKLAD) and (":Steklo:T_SKLAD".SKLAD<>":Steklo_arc:T_SKLAD".SKLAD))


И процедурой ниже описанной в Steklo_arc выполняется изменение строк. (процедура автоматом вызывается из приложения)

CREATE PROCEDURE SYNHRO_SKLADNAME ( N_SKLAD INTEGER, N_PARENTS INTEGER, SKLAD VARCHAR(50)

) AS

BEGIN

UPDATE T_SKLAD SET N_PARENTS=:N_PARENTS, SKLAD=:SKLAD where N_SKLAD=:N_SKLAD;

END


Далее аналогично для таблицы товаров.


SELECT ":Steklo:T_TOVAR".N_TOVAR, ":Steklo:T_TOVAR".N_SKLAD, ":Steklo:T_TOVAR".KOD, ":Steklo:T_TOVAR".TOVAR, ":Steklo:T_TOVAR".SHIR, ":Steklo:T_TOVAR".DLIN, ":Steklo:T_TOVAR".ED_IZM, ":Steklo:T_TOVAR".ZENA_PRICE, ":Steklo:T_TOVAR".ZENA_CHIST, ":Steklo:T_TOVAR".OSTATOK, ":Steklo:T_TOVAR".MIN_STOIM, ":Steklo:T_TOVAR".RAZR_IZM_ZEN, ":Steklo:T_TOVAR".ZENA_PRICE_NEW, ":Steklo:T_TOVAR".ZENA_CHIST_NEW, ":Steklo:T_TOVAR".WHITE_BLACK

FROM ":Steklo:T_TOVAR"

where ":Steklo:T_TOVAR".N_TOVAR<>

ALL(SELECT ":Steklo_arc:T_TOVAR".N_TOVAR

from ":Steklo_arc:T_TOVAR" )



CREATE PROCEDURE SYNHRO_TOVAR (

N_TOVAR INTEGER,

N_SKLAD INTEGER,

KOD VARCHAR(10),

TOVAR VARCHAR(100),

SHIR DOUBLE PRECISION,

DLIN DOUBLE PRECISION,

ED_IZM VARCHAR(10),

ZENA_PRICE DOUBLE PRECISION,

ZENA_CHIST DOUBLE PRECISION,

OSTATOK DOUBLE PRECISION,

MIN_STOIM DOUBLE PRECISION,

RAZR_IZM_ZEN CHAR(1),

ZENA_PRICE_NEW DOUBLE PRECISION,

ZENA_CHIST_NEW DOUBLE PRECISION,

WHITE_BLACK CHAR(50)

) AS

begin

INSERT INTO T_TOVAR(N_TOVAR,N_SKLAD,KOD,TOVAR,SHIR,DLIN,ED_IZM,ZENA_PRICE,

ZENA_CHIST,OSTATOK,MIN_STOIM,RAZR_IZM_ZEN,ZENA_PRICE_NEW,

ZENA_CHIST_NEW,WHITE_BLACK)

VALUES (:N_TOVAR,:N_SKLAD,:KOD,:TOVAR,:SHIR,:DLIN,:ED_IZM,:ZENA_PRICE,

:ZENA_CHIST,:OSTATOK,:MIN_STOIM,:RAZR_IZM_ZEN,:ZENA_PRICE_NEW,

:ZENA_CHIST_NEW,:WHITE_BLACK);

end



SELECT ":Steklo:T_TOVAR".N_TOVAR, ":Steklo:T_TOVAR".N_SKLAD,":Steklo:T_TOVAR".KOD,

":Steklo:T_TOVAR".TOVAR, ":Steklo:T_TOVAR".SHIR,":Steklo:T_TOVAR".DLIN,

":Steklo:T_TOVAR".ED_IZM, ":Steklo:T_TOVAR".ZENA_PRICE,":Steklo:T_TOVAR".ZENA_CHIST,

":Steklo:T_TOVAR".MIN_STOIM,":Steklo:T_TOVAR".WHITE_BLACK,

":Steklo_arc:T_TOVAR".N_TOVAR, ":Steklo_arc:T_TOVAR".N_SKLAD,":Steklo_arc:T_TOVAR".KOD,

":Steklo_arc:T_TOVAR".TOVAR, ":Steklo_arc:T_TOVAR".SHIR,":Steklo_arc:T_TOVAR".DLIN,

":Steklo_arc:T_TOVAR".ED_IZM, ":Steklo_arc:T_TOVAR".ZENA_PRICE,":Steklo_arc:T_TOVAR".ZENA_CHIST,

":Steklo_arc:T_TOVAR".MIN_STOIM,":Steklo_arc:T_TOVAR".WHITE_BLACK

FROM ":Steklo:T_TOVAR",":Steklo_arc:T_TOVAR"

where

((":Steklo:T_TOVAR".N_TOVAR=":Steklo_arc:T_TOVAR".N_TOVAR)

and (":Steklo:T_TOVAR".N_SKLAD<>":Steklo_arc:T_TOVAR".N_SKLAD)) or



((":Steklo:T_TOVAR".N_TOVAR=":Steklo_arc:T_TOVAR".N_TOVAR)

and (":Steklo:T_TOVAR".KOD<>":Steklo_arc:T_TOVAR".KOD)) or



((":Steklo:T_TOVAR".N_TOVAR=":Steklo_arc:T_TOVAR".N_TOVAR)

and (":Steklo:T_TOVAR".TOVAR<>":Steklo_arc:T_TOVAR".TOVAR)) or



((":Steklo:T_TOVAR".N_TOVAR=":Steklo_arc:T_TOVAR".N_TOVAR)

and (":Steklo:T_TOVAR".SHIR<>":Steklo_arc:T_TOVAR".SHIR)) or



((":Steklo:T_TOVAR".N_TOVAR=":Steklo_arc:T_TOVAR".N_TOVAR)

and (":Steklo:T_TOVAR".DLIN<>":Steklo_arc:T_TOVAR".DLIN)) or



((":Steklo:T_TOVAR".N_TOVAR=":Steklo_arc:T_TOVAR".N_TOVAR)

and (":Steklo:T_TOVAR".ED_IZM<>":Steklo_arc:T_TOVAR".ED_IZM)) or



((":Steklo:T_TOVAR".N_TOVAR=":Steklo_arc:T_TOVAR".N_TOVAR)

and (":Steklo:T_TOVAR".ZENA_PRICE<>":Steklo_arc:T_TOVAR".ZENA_PRICE)) or



((":Steklo:T_TOVAR".N_TOVAR=":Steklo_arc:T_TOVAR".N_TOVAR)

and (":Steklo:T_TOVAR".ZENA_CHIST<>":Steklo_arc:T_TOVAR".ZENA_CHIST)) or



((":Steklo:T_TOVAR".N_TOVAR=":Steklo_arc:T_TOVAR".N_TOVAR)

and (":Steklo:T_TOVAR".MIN_STOIM<>":Steklo_arc:T_TOVAR".MIN_STOIM)) or



((":Steklo:T_TOVAR".N_TOVAR=":Steklo_arc:T_TOVAR".N_TOVAR)

and (":Steklo:T_TOVAR".WHITE_BLACK<>":Steklo_arc:T_TOVAR".WHITE_BLACK))





CREATE PROCEDURE SYNHRO_TOVARNAME (

N_TOVAR INTEGER,

N_SKLAD INTEGER,

KOD VARCHAR(10),

TOVAR VARCHAR(100),

SHIR DOUBLE PRECISION,

DLIN DOUBLE PRECISION,

ED_IZM VARCHAR(10),

ZENA_PRICE DOUBLE PRECISION,

ZENA_CHIST DOUBLE PRECISION,

MIN_STOIM DOUBLE PRECISION,

WHITE_BLACK CHAR(50)

) AS

begin

UPDATE T_TOVAR SET N_SKLAD=:N_SKLAD, KOD=:KOD,TOVAR=:TOVAR,

SHIR=:SHIR,DLIN=:DLIN,ED_IZM=:ED_IZM,ZENA_PRICE=:ZENA_PRICE,

ZENA_CHIST=:ZENA_CHIST,MIN_STOIM=:MIN_STOIM,WHITE_BLACK=:WHITE_BLACK

where N_TOVAR=:N_TOVAR;

end





и остальных 3-х справочных таблиц……………………которые сравнительно меньшего размера



В самой большой таблице товаров около 2000 записей.

Всего тратится около 11 мин на суммарный запрос с выполнением процедур. Но это когда две базы лежат у меня дома на одном диске (селерон 800 up to 1066). Есть ли более быстрый путь?



Спасибо

С. Бол
...
Рейтинг: 0 / 0
Как сделать быстрее?
    #32109721
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какой гемор, ка-ако-о-ой ге-емо-ор! Чувак ты главного не написал, а почему нельза ОДНУ базу? Если у тебя steklo очищается, не значит ли это что у тебя ВСЕ записи будут новые? или у тебя юзер может одну запись по несколько раз сделать? я думаю тут не над скоростью надо думать, а смысле жизни.
...
Рейтинг: 0 / 0
Как сделать быстрее?
    #32110131
Фотография Bol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Две базы - белая и черная и лечи свой гемор
...
Рейтинг: 0 / 0
Как сделать быстрее?
    #32111144
Фотография Bol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так... Значит будем молчать? Пойду схожу на SQL
...
Рейтинг: 0 / 0
Как сделать быстрее?
    #32111810
altavista
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мля, опупеть !!! Выпил пива, покурил, читаю - прикольно
Неужели такие длинные листинги народ на форуме и читает и советы дельные дает ? :)
вставка кучи значений по одному значению работает дольше чем вставка всех сразу. Не пробовал измерить: очищать таблицы в _arc, а потом полностью перегонять из одной базы в другую (не для тонких клиентов конечно, хотя если полей не много ?)
А вобще не понятно зачем это. Типа репликации или организации хранилища ?
P.S. Две грамули ЛСД и тебе зер гуд ВЕЗДЕ
...
Рейтинг: 0 / 0
Как сделать быстрее?
    #32112637
Фотография Bol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делаю вопрос короче.

Две базы данных лежат на разных машинах. На обоих машинах стоит
IB/Fb. На одной машине – Windows2000 server, а на второй Windows98. Менять железо и системы нет возможности (по внутренним причинам).

В алиасе «Steklo» по окончании рабочего дня выполняется копирование данных за день в «Steklo_arc» и затем данные в «Steklo» «правятся». Перед копированием необходимо выполнить синхронизацию всех справочников, что выполняется следующим образом.

Данные запросы написаны в компонентах «TQuery», которые напрямую минуя «TDatabase» при активации подключаются к алиасам через BDE

Проверяются позиции на наличие новых вставок:

SELECT ":Steklo:T_SKLAD".N_SKLAD,":Steklo:T_SKLAD".N_PARENTS,
":Steklo:T_SKLAD".SKLAD FROM ":Steklo:T_SKLAD" where ":Steklo:T_SKLAD".N_SKLAD<>ALL(SELECT :Steklo_arc:T_SKLAD".N_SKLAD from ":Steklo_arc:T_SKLAD" )

Затем идет проверка на изменения в старых позициях:

SELECT ":Steklo:T_SKLAD".N_SKLAD,":Steklo:T_SKLAD".N_PARENTS, ":Steklo:T_SKLAD".SKLAD, ":Steklo_arc:T_SKLAD".N_SKLAD,":Steklo_arc:T_SKLAD".N_PARENTS, ":Steklo_arc:T_SKLAD".SKLAD FROM ":Steklo:T_SKLAD",":Steklo_arc:T_SKLAD" where ((":Steklo:T_SKLAD".N_SKLAD=":Steklo_arc:T_SKLAD".N_SKLAD) and (":Steklo:T_SKLAD".N_PARENTS<>":Steklo_arc:T_SKLAD".N_PARENTS)) or ((":Steklo:T_SKLAD".N_SKLAD=":Steklo_arc:T_SKLAD".N_SKLAD) and (":Steklo:T_SKLAD".SKLAD<>":Steklo_arc:T_SKLAD".SKLAD))

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

А вообще нет лучше ЛСД, чем пиво с водкой и селёдкой :))
...
Рейтинг: 0 / 0
Как сделать быстрее?
    #32113228
altavista
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нельзя ли в Sclad завести в таблицах поле типа там "mod" и при вставке новой записи записывать туда, "+", а при модификации "*". в обработке соответственно те, которые с "+" копировать, а те которые с "*" модифицировать. После окончания обработки поле "mod" апдейтить, где не пустое. По крайней мере не надо сравнивать таблицы. не будет быстрей ?
...
Рейтинг: 0 / 0
Как сделать быстрее?
    #32113273
Фотография Bol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, это один из способов.
Но надо учесть, что "тупой пользователь" м. изменить данные не только в основном складе, но и в архиве...Хотя на это м. поставить запрет...но к сожалению не я определяю все эти требования

И ещё... я знаю, что "гетерогенные" запросы (обращающиеся к 2-м базам) м. делать только через BDE. А хотелось бы найти вариант без этого гемора, потому что получается, я не могу без него обойтись.

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

Ну а архив д.б. полностью автономен. М.б. разбить одну базу на 2 файла? А как сделать так, чтобы физически в одном файле был for ex T_SKLAD1, а во втором T_SKLAD2? Я раньше никогда не думал над многостраничностью потому что места хватало, но м.б задать этот вопрос в форуме отдельно? Попробую.

(говорю уже сам с собой)
...
Рейтинг: 0 / 0
Как сделать быстрее?
    #32116763
MONITOR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сейчас InterBase 7 можно поинтересоваться. Там, судя по быстро пролистанному Help, имеется возможность формирования запроса к двум базам данных. Сам InterBase 7 можно скачать здесь: http://www.borland.com/products/downloads/download_interbase.html - правда триальный (правда тиальность выражена сколькими-то юзерами). Попробовать, и, если все работает, на будущее запомнить, пока нормальный не выйдет.
...
Рейтинг: 0 / 0
Как сделать быстрее?
    #32117048
Фотография Bol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня минимум 7 коннектов к базе одновременно и несколькими юзерами не обойтись, а цены то кусаются на IB7.
...
Рейтинг: 0 / 0
Как сделать быстрее?
    #32125021
Фотография Bol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тема иссякла?...
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как сделать быстрее?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]