|
Совет по архитектуре
|
|||
---|---|---|---|
#18+
Доброго дня. Занимаюсь нормализацией консолидирующей базы, которая собирает в себя данные еще с ~30 баз. Вопрос: каким образом лучше выстроить серию запросов, чтобы во время консолидации данных скорость работы была максимальной быстрой, а масшабирование удобным? Возникли следующие мысли: 1. Собирать юнионом данные из локальных таблиц; (медленно + последующие запросы будут обновлять изначальный юнион) 2. Создать серию запросов на добавления свежих данных в промежуточную таблицу в консолидирующей базе; 3. Создать в консолидирующей базе залинкованные с локальными базами таблицы из которых в последующем строить юнион. Кратко: нужно собрать данные в единой структуре из 30 баз в одну максимально быстро, удобно и чтобы это еще и было гибко для масштабирования. Подскажите, люди добрые, как же лучше сделать. спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2017, 14:22 |
|
Совет по архитектуре
|
|||
---|---|---|---|
#18+
Те самые "~30 баз" - они локально лежат или по сети доступны с другого хоста? Реально ли нужно сперва свалить всё в кучу, а потом обрабатывать, или возможно первично обработать их по отдельности, а промежуточные результаты консолидировать и затем дообработать до конечного результата? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2017, 15:23 |
|
Совет по архитектуре
|
|||
---|---|---|---|
#18+
Akina, в сети с доступом от другого хоста. нужно свалить все в кучу и обрабатывать, второй вариант невозможен, т.к. администратор всей это "структуры" один, либо ему потребуется 1 раз сделать все, либо повторить одно и тоже 30 раз. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2017, 15:44 |
|
Совет по архитектуре
|
|||
---|---|---|---|
#18+
kn9kaвторой вариант невозможен, т.к. администратор всей это "структуры" одинНи разу не обоснование. Мне лично кажется наиболее удобным создание отдельных запросов для каждой БД, которые получают локальную копию удалённой таблицы. И дальнейшая работа уже с локальными копиями. Для копирования мне кажется наиболее разумным создать отдельный модуль с необходимыми процедурами, особенно в случае, когда список таблиц может изменяться - запросы к удалённым таблицам или линкованные таблицы явно хуже, особенно если хосты могут отключаться. Тот же модуль с учётом изменений может перестраивать и запросы для дальнейшей обработки данных. Минус: данные могут быть неактуальными, т.е. с момента последнего копирования данных они могли измениться. Минус: значительный объём консолидированной БД (а лимит на размер файла БД весьма невелик). Плюс: обработка происходит локально. Плюс: обработка не будет "затыкаться" в случае недоступности одного или нескольких удалённых хостов - при этом можно будет использовать последнюю версию полученных данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2017, 16:17 |
|
Совет по архитектуре
|
|||
---|---|---|---|
#18+
Akinakn9kaвторой вариант невозможен, т.к. администратор всей это "структуры" одинНи разу не обоснование. Мне лично кажется наиболее удобным создание отдельных запросов для каждой БД, которые получают локальную копию удалённой таблицы. И дальнейшая работа уже с локальными копиями. Для копирования мне кажется наиболее разумным создать отдельный модуль с необходимыми процедурами, особенно в случае, когда список таблиц может изменяться - запросы к удалённым таблицам или линкованные таблицы явно хуже, особенно если хосты могут отключаться. Тот же модуль с учётом изменений может перестраивать и запросы для дальнейшей обработки данных. Минус: данные могут быть неактуальными, т.е. с момента последнего копирования данных они могли измениться. Минус: значительный объём консолидированной БД (а лимит на размер файла БД весьма невелик). Плюс: обработка происходит локально. Плюс: обработка не будет "затыкаться" в случае недоступности одного или нескольких удалённых хостов - при этом можно будет использовать последнюю версию полученных данных. Мы ведь ведем речь об Access 2010? Думал об этом варианте, но мне ненравится перспектива запуска процедуры, каждый раз когда нужно внести изменения, даже незначительные. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2017, 17:00 |
|
Совет по архитектуре
|
|||
---|---|---|---|
#18+
kn9kaмне ненравится перспектива запуска процедуры, каждый раз когда нужно внести изменения, даже незначительные.Какая разница, запускать процедуру или импортировать таблицу вручную? первое даже попроще будет... я уж не говорю о том, что можно хранить штамп времени последней синхронизации данных как в общей БД, так и в частных (если данные не позволяют его получить иными методами), и перезапрашивать только изменившиеся данные. А процедуру вполне можно автостартовать при открытии БД. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2017, 18:28 |
|
Совет по архитектуре
|
|||
---|---|---|---|
#18+
Akina, Разницы нет, Вы правы, но есть альтернативы, как минимум в ввиде 30 юнионов. В этом варианте, всегда будут свежие данные. Вопрос в том, что будет выполняться быстрее: процедура с приблудами или 30 юнионов. то что в дальнейшем работать с процедурой будет быстрее - очевидно. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2017, 10:13 |
|
Совет по архитектуре
|
|||
---|---|---|---|
#18+
kn9kaВопрос в том, что будет выполняться быстрее: процедура с приблудами или 30 юнионов. Процедура будет выполнять то же самое, с теми же 30 юнионами. Только в автоматическиом режиме и с обработкой всех возможных ошибок. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2017, 10:55 |
|
Совет по архитектуре
|
|||
---|---|---|---|
#18+
Akina, Если я не путаю, процедуру нельзя использовать в качестве источника данных для того же селект (или я не прав?). Если прав, то получается, чтобы получать онтайм данные, нужно будет нажимать процедуру, каждый раз когда данные обновяться. Каждое обновление, даже с учетом приблуд в виде получения только свежих данных и прочего, будет сначала выгружать всю таблицу из локальной БД (а их 30), в последствии ограничивая выборку и запихивая их в промежуточную таблицу. Это ведь равносильно 30 юнионам в одном запросе, который в последствии можно использовать исходником для следующей серии запросов.. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2017, 15:11 |
|
Совет по архитектуре
|
|||
---|---|---|---|
#18+
kn9kaЕсли я не путаю, процедуру нельзя использовать в качестве источника данных для того же селектЭто верно. Но я и не говорил об SQL-процедуре. Я говорил о VBA-процедуре (подпрограмме, макросе - в общем, Public Sub, а там называйте как хотите), расположенной в отдельном модуле VBA-проекта и запускаемой автоматически при старте БД и/или по запросу оператора (скажем, с кнопки формы). ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2017, 15:14 |
|
Совет по архитектуре
|
|||
---|---|---|---|
#18+
Akina, да, я понял именно так, как Вы описали. Мне кажется, что время работы процедуры = времени работы 30 юнионов. При учете, что данные нужно "вытягивать" из консолидированной базы довольно часто, создание процедуры просто добавляет еще 1 шаг для актуализации данных в момент необходимости. пример: 30 юнионов: зашел в эксель - нажал обновить - он записал запрос, который джоинит справочники + 30 юнионов с базы. Подождал, получил данные. процедура: зашел в эксель - нажал обновить - работаешь. Забыл, что нужно с локальных баз данные подятнуть - зашел в базу - нажал процедуру, ждешь. заходишь в эксель - жмешь обновить - работаешь. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2017, 15:28 |
|
Совет по архитектуре
|
|||
---|---|---|---|
#18+
kn9kaданные нужно "вытягивать" из консолидированной базы довольно частоИ за это время в частных базах данные меняются, и в консолидированной их нужно обновить? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2017, 15:45 |
|
Совет по архитектуре
|
|||
---|---|---|---|
#18+
Akina, неисключено. хотя наверное, если подумать, количество этих "исправлений" в локальных (частных) БД нестоль высоко, чтобы создавать запрос для обновления онтайм данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2017, 17:19 |
|
Совет по архитектуре
|
|||
---|---|---|---|
#18+
А вот теперь подумайте. Три десятка баз данных. В одной локальной сети и практически со стопроцентным онлайном. И все эти базы данных - в формате файловой БД. Ну не бред ли? Может, уже пора подумать о том, чтобы завести в сети какой-никакой СУБД-сервер и вывалить все данные на него? И по скорости выиграете в разы, и проблема, породившая эту тему, сама собой тихо скончается... делов-то - заменить ныне используемые локальные таблицы в частных базах данных на прилинкованные с сервера, и всё. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2017, 19:34 |
|
Совет по архитектуре
|
|||
---|---|---|---|
#18+
Akina, рад что вы разделяете моё негодование. Компания большая, много бюрократии и политики. Уже начали что-то придумывать, толкать идею, но когда время дойдет до реального появления СУБД неизвестно. Может полгода, может год, а может и больше. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2017, 11:13 |
|
Совет по архитектуре
|
|||
---|---|---|---|
#18+
kn9kaкогда время дойдет до реального появления СУБД неизвестно. Может полгода, может год, а может и больше.Ну вообще-то на начальном этапе вполне подойдёт и бюджетный вариант - выбрать станцию, на которой расположена одна из частных БД и которая работает в режиме 24*7 non-reboot, и на неё поставить какой-нибудь не очень платный сервер - хоть MS SQL CE, хоть тот же MySQL... кстати, опыт эксплуатации подобной схемы вполне способен "протолкать" нормальное решение через бюрократию и политику. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2017, 11:19 |
|
Совет по архитектуре
|
|||
---|---|---|---|
#18+
Добрый день! Подскажите пожалуйста, какое из условий части WHERE будет проверяться СУБД Access быстрее (т.е. что предпочтительнее использовать?): 1. FORMAT(dDate, 'yyyy-MM') LIKE FORMAT(NOW, 'yyyy-MM') 2. YEAR(dDate) = YEAR(NOW) AND MONTH(dDate) = MONTH(NOW) Или есть ещё более оптимальный вариант, чтобы выбрать записи за текущий месяц и год? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2017, 11:04 |
|
|
start [/forum/topic.php?fid=45&msg=39433545&tid=1612559]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
29ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
others: | 366ms |
total: | 493ms |
0 / 0 |