|
Как сделать быстрее?
|
|||
---|---|---|---|
#18+
Две базы данных лежат на разных машинах. На обоих машинах стоит 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). Есть ли более быстрый путь? Спасибо С. Бол ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2003, 22:22 |
|
Как сделать быстрее?
|
|||
---|---|---|---|
#18+
Какой гемор, ка-ако-о-ой ге-емо-ор! Чувак ты главного не написал, а почему нельза ОДНУ базу? Если у тебя steklo очищается, не значит ли это что у тебя ВСЕ записи будут новые? или у тебя юзер может одну запись по несколько раз сделать? я думаю тут не над скоростью надо думать, а смысле жизни. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2003, 04:05 |
|
Как сделать быстрее?
|
|||
---|---|---|---|
#18+
Две базы - белая и черная и лечи свой гемор ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2003, 00:21 |
|
Как сделать быстрее?
|
|||
---|---|---|---|
#18+
Так... Значит будем молчать? Пойду схожу на SQL ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2003, 23:16 |
|
Как сделать быстрее?
|
|||
---|---|---|---|
#18+
Мля, опупеть !!! Выпил пива, покурил, читаю - прикольно Неужели такие длинные листинги народ на форуме и читает и советы дельные дает ? :) вставка кучи значений по одному значению работает дольше чем вставка всех сразу. Не пробовал измерить: очищать таблицы в _arc, а потом полностью перегонять из одной базы в другую (не для тонких клиентов конечно, хотя если полей не много ?) А вобще не понятно зачем это. Типа репликации или организации хранилища ? P.S. Две грамули ЛСД и тебе зер гуд ВЕЗДЕ ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2003, 04:26 |
|
Как сделать быстрее?
|
|||
---|---|---|---|
#18+
Делаю вопрос короче. Две базы данных лежат на разных машинах. На обоих машинах стоит 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)) т.е я хочу найти - какие изменения есть в справочниках, чтобы использовать это для своих целей в дальнейшем. Но как это сделать быстрее?! Повторяю - базы разные, т.к. одна для всех - а другая "серая"., а приложение при этом работает практически тоже самое (с минимальными доделками) либо с одними -либо с другими данными. А вообще нет лучше ЛСД, чем пиво с водкой и селёдкой :)) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2003, 12:14 |
|
Как сделать быстрее?
|
|||
---|---|---|---|
#18+
Нельзя ли в Sclad завести в таблицах поле типа там "mod" и при вставке новой записи записывать туда, "+", а при модификации "*". в обработке соответственно те, которые с "+" копировать, а те которые с "*" модифицировать. После окончания обработки поле "mod" апдейтить, где не пустое. По крайней мере не надо сравнивать таблицы. не будет быстрей ? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2003, 04:53 |
|
Как сделать быстрее?
|
|||
---|---|---|---|
#18+
Спасибо, это один из способов. Но надо учесть, что "тупой пользователь" м. изменить данные не только в основном складе, но и в архиве...Хотя на это м. поставить запрет...но к сожалению не я определяю все эти требования И ещё... я знаю, что "гетерогенные" запросы (обращающиеся к 2-м базам) м. делать только через BDE. А хотелось бы найти вариант без этого гемора, потому что получается, я не могу без него обойтись. Или м.б. есть идея реализовать эту же функцию иначе? Ведь по сути - делается каждый день сброс данных в "хранилище", а пользователи продолжают работать с текущей версией и могут править в ней все, что угодно. Ну а архив д.б. полностью автономен. М.б. разбить одну базу на 2 файла? А как сделать так, чтобы физически в одном файле был for ex T_SKLAD1, а во втором T_SKLAD2? Я раньше никогда не думал над многостраничностью потому что места хватало, но м.б задать этот вопрос в форуме отдельно? Попробую. (говорю уже сам с собой) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2003, 13:50 |
|
Как сделать быстрее?
|
|||
---|---|---|---|
#18+
Сейчас InterBase 7 можно поинтересоваться. Там, судя по быстро пролистанному Help, имеется возможность формирования запроса к двум базам данных. Сам InterBase 7 можно скачать здесь: http://www.borland.com/products/downloads/download_interbase.html - правда триальный (правда тиальность выражена сколькими-то юзерами). Попробовать, и, если все работает, на будущее запомнить, пока нормальный не выйдет. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.03.2003, 03:33 |
|
|
start [/forum/topic.php?fid=40&fpage=524&tid=1580741]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
54ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
others: | 339ms |
total: | 489ms |
0 / 0 |