powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Оптимизация объема данных БД Access
24 сообщений из 24, страница 1 из 1
Оптимизация объема данных БД Access
    #39716735
mesc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Возникла проблема формирования отчета в БД Access в связи с превышением максимального объема файла access в 2Гб.

Коротко описание процесса.

Есть определенный тяжелый расчет, который происходит в ИС с базой oracle. Результат этого расчета выгружается пользователям в БД access одной таблицей.
Количество строк ~5,8 млн; количество столбцов ~ 30.
Процесс выгрузки выглядит следующим образом:
1. Вначале данные из оракла экспортируются в csv. Вес данного файла 1.3 Гб
2. Далее данный csv импортируется уже в access. На выходе 2,09 Гб.
3. Импорт падает с ошибкой, что формат БД некорректный и не может быть открыт.
До этого момента результаты расчета в оракле были меньше: весь csv в районе 900Мб (4.7 млн строк) и работало исправно


Что пытался сделать:
1. Уменьшил количество столбцов, вес csv уменьшился до 1.1 Гб, при импорте в access , все тот же объем 2,09.
2. в access файле есть спека для таблицы, пытался по максимуму уменьшить объем: "длинные целые" менял на "целые" или вообще "byte" и т.д. Но это не помогло.
3. Сейчас пытаюсь уменьшать количество строк в выгрузке, чтобы найти ту самую критическую массу строк, что дают превышение объема.

Помогите, плиз, кто сталкивался с подобными проблемами:
1. Есть ли возможность как-то оптимизировать объем самого access файла. Так как на выходе csv весит 1.3, а в access он превращается в более 2Гб. Может кто знает как выжать по максимуму?
2. Поменяется ли что-то если переделать с импорта csv, на коннект по ODBC. Может есть режим аля view через access вьюхи из оракла? правда у меня самого в голове, что ничего не поменяется, это тот же импорт только в профиль, но вдруг.
3. Так как я не добился успеха, когда уменьшил количество столбцов, а итоговый объем access остался прежним в 2,09, у меня закралось сомнение, что может количество столбцов и не так сильно влияет на вес итогового файла. Так ли это? либо аксес просто падает на превышении и я не увидел реальный объем, который бы заняли таблицы с разным количеством столбцов. Например
30 столбцов, реальный весь аксеса 2,5 Гб, импорт падает на 2,09. и именно этот результат я вижу

25 столбцов, реальный весь аксеса 2,2 Гб, импорт падает на 2,09. и именно этот результат я вижу
Если так, то нельзя ли как то спрогнозировать / подсчитать объем с определенными столбцами предварительно, не импирическим путем. 1 выгрузка занимает порядка 20-25 минут у меня на машине. Я понимаю, что я могу по спеке таблицы понять примерный объем = сумма всех размеров типов данных столбцов * количество трок. Но мне кажется должны быть некие системные файлы аксеса, и под них также нужна память. Как рассчитать прирост в этих таблицах - хз.
4. Можно ли как то разделить на несколько файлов, но при этом оставить для бизнес пользователя "одно окно"

Цель:
Попытаться быстро временно закрыть данный вопрос, обеспечить работу пользователей в "прежнем режиме" в аксес.

Желательно чтобы при это не пострадала возможность выполнять макросы/запросы на весь перечень данных


Просьба, всякие лишние комментарии аля "Да зачем вы такое туда пихаете", "Кто это придумал" оставлять при себе.


Пока писал пост, появились новые вводные: 5млн строк выгрузил, итоговый вес аксеса 1,75 ГБ
...
Рейтинг: 0 / 0
Оптимизация объема данных БД Access
    #39716745
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А выгрузить в 5 баз по 7 столбцов, а потом связать по ключевому полю не пробовали?
...
Рейтинг: 0 / 0
Оптимизация объема данных БД Access
    #39716756
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mesc1. Есть ли возможность как-то оптимизировать объем самого access файла. Так как на выходе csv весит 1.3, а в access он превращается в более 2Гб. Может кто знает как выжать по максимуму?Ужимайте формат целевой таблицы. Особенно строковые поля. Ибо Акс не знает, что там в импортируемом файле, и резервирует на импорт пространство по максимуму в соответствии со структурой.

Но лучше вот куда подумать:
mescКоличество строк ~5,8 млн; количество столбцов ~ 30.
И что, в итоговом отчёте формируется 5,8 миллионов строк? это ж под 100 тыс. страниц, даже если по минимуму...
А если они обрабатываются и ужимаются до вменяемого размера - что мешает там, на оракле, провести и эту обработку? или уже тут, но в более вменяемой СУБД?

В крайнем случае попробуйте подумать о нарезке этого CSV на куски и обработке массива данных по частям.
...
Рейтинг: 0 / 0
Оптимизация объема данных БД Access
    #39716777
mesc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Joss,
Добрый день, пока что не пробовал.

Дополнительно опишу как именно выгрузка происходит. Это не совсем ручной процесс:
1. Сделан небольшой интерфейс в аксесе, где пользователь указывает ключевые параметры для выгрузки отчета. Жмет кнопку
2. Запускается vba скрипт, который коннектится к БД, выполняет запрос sql
3. выгружается результат запроса в csv и далее импорт

Честно, навыками как реализовать это c ходу в vba у меня нет, но я понял вектор, мне нужно читать, как это сделать. Пока что это выглядит как нормальный вариант для решения на будущее, если все таки останемся с этим отчетом в аксесе: делим отчет на несколько файлов БД с разными столбцами при выгрузке, в последнем выгружаемом файле линкуемся на другие по ключу.
Нужно почитать как в vba связи на БД на таблицы сделать.
...
Рейтинг: 0 / 0
Оптимизация объема данных БД Access
    #39716799
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mescДалее данный csv импортируется уже в access.

Можно попробовать НЕ импортировать, переименовать в txt и тупо прилинковать тестовый файл в виде таблицы, если структура csv хитро замороченная (что вряд ли), то сделать отдельную выгрузку в txt с уникальным разделителем полей... Проблем с величиной файла точно не будет, по быстродействию возможно будет дольше, ну и рекордсет на основе txt не редактируемый (про это вроде речь не шла)
...
Рейтинг: 0 / 0
Оптимизация объема данных БД Access
    #39716800
mesc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Добрый день.

1. Может я не до конца понимаю. Выгрузка идет через csv. В csv ужимать нечего, т.к. это просто текст. Далее этот текст при импорте трансформируется в таблицу аксес по спефикации этой таблицы. Тут я пробовал шаманить, но типы данных верхнеуровневые. Например "текстовый", я не могу в спеке на таблицу сказать текстовый (10 символов), как по аналогии с varchar2(10) в оракл. Везде где я видел "длинное целое" и понимал что это избыточно, менял на "целые".
Может вы знаете как текст обрезать по символам, чтобы аксес много место не резервировал в пустую.

2. С этим отчетом работают бизнес пользователи, и хоть компания давно переросла аксес, не все бизнес пользователи готовы и хотят работать в oracle напрямую.
Можно жестко зафиксировать все отчеты и срезы по аналитике и отдать эти отчеты на реализацию в BI, в этом направлении работаем, но пока сам бизнес до конца не созрел в определении всех необходимых метрик и разрезов.
На выходе получается что пользователи получают самую полный вариант данных, а далее, с помощью аксеса "крутят" его как хотят.
...
Рейтинг: 0 / 0
Оптимизация объема данных БД Access
    #39716809
Прогер_самоучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
при расчётах зачищайте темповые таблы.
ну и что, что 5 млн записей. Это не они забивают вам память в аксе, а расчёты с данными.
Делаете какие-то обработки перед отчётом, кроме применение фильтров ?
...
Рейтинг: 0 / 0
Оптимизация объема данных БД Access
    #39716820
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mescКоличество строк ~5,8 млн;
наверняка это данные за несколько лет .... я бы видимо разбила на базы по году бд2015,бд2016, бд2017,,,,
--запрос года/годов
--выбор в рабочую таблицу рядовых строк или итогов по году
...
Рейтинг: 0 / 0
Оптимизация объема данных БД Access
    #39716830
Фотография Лапух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Видимо справочников маловато, ибо по моему устоявшемуся Нубскому убеждению - Текст занимает гораздо больше места чем число, а тексты имеють противное свойство повторяться в таблицах-фактов.
...
Рейтинг: 0 / 0
Оптимизация объема данных БД Access
    #39716832
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mesc "текстовый", я не могу в спеке на таблицу сказать текстовый (10 символов), как по аналогии с varchar2(10) в оракл.
что мешает?
при программном создании таблицы указывается длина поля
Set fld = tD.CreateField("fld1", dbText, 10 ): tD.Fields.Append fld
при создании переменной
Dim str1 as string*10
2Гб это что -то связанное с 32-х разрядностью было...
...
Рейтинг: 0 / 0
Оптимизация объема данных БД Access
    #39716837
Прогер_самоучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleckomesc "текстовый", я не могу в спеке на таблицу сказать текстовый (10 символов), как по аналогии с varchar2(10) в оракл.
что мешает?
при программном создании таблицы указывается длина поля
Set fld = tD.CreateField("fld1", dbText, 10 ): tD.Fields.Append fld
при создании переменной
Dim str1 as string*10
2Гб это что -то связанное с 32-х разрядностью было...нет.
...
Рейтинг: 0 / 0
Оптимизация объема данных БД Access
    #39716838
Прогер_самоучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
любая база акс вплоть до 2019 может быть до 2 гб. Смотрите спецификации.
Другое дело, что это легко обходиться кучей связанных бд, что, собственно, и предложила Пенсионерка.
...
Рейтинг: 0 / 0
Оптимизация объема данных БД Access
    #39716846
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Оптимизация объема данных БД Access
    #39717347
Прогер_самоучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Оптимизация объема данных БД Access
    #39717376
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mesc1. Сделан небольшой интерфейс в аксесе, где пользователь указывает ключевые параметры для выгрузки отчета. Жмет кнопку
2. Запускается vba скрипт, который коннектится к БД, выполняет запрос sql
3. выгружается результат запроса в csv и далее импортА дальше? Что делается с полученным набором данных после импорта в пункте 3? Какие-то обработки и группировки? Так почему всё то же не делается там, на сервере, средствами Оракла?
...
Рейтинг: 0 / 0
Оптимизация объема данных БД Access
    #39718244
mesc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Во вопросам объема
речь идет про MS access 2010.

Что удалось прокопать, понять:
1. Линковка с файлом не годится.
При линковке нельзя использовать стандартные фильтры столбцов в таблице, при клике на заголовок столбца. Только ручной ввод, выбор чекбоксами недоступен

Очень долго прогружает. Если кликнуть внизу таблицы на стрелку "последняя запись" access умирает.
2. Текстовый поля, как правильно было замечено, которые повторяются, съедают очень много места. Протестировал, убрал 4 столбца, вес файла 1,5 Гб. Этого 4 текстовых столбца дали минимум 25% веса всего файла в котором 30 столбцов
3. Из-за пункта 2 начал двигаться в сторону оптимизации объема текстовых полей. Импорт данных происходит через DoCmd.TransferText. Там указывается спецификации таблицы для создания самой таблицы под данный импорт. Спека создана через интерфейс, где нет возможности указать количество символов для текстового поля. Как указать в спеке конкретный ограничения по символам не нашел + дополнительно решили попробовать загружать из oracle напрямую.
4. В итоге что сейчас есть и на чем остановился:

на vba реализовал создание таблицы с оптимизированным размером текстовых столбцов

написал коннект к базе данных по ADODB

остановился на том как перекинуть таблицу из oracle в существующую access.
4.1. Можно ли просто sql запросом с открытым коннектом к БД Oracle сделать insert "таблица access" select from table (пакет.процедура oracle)
4.2. Если 4.1. нельзя, как реализовать по другому. Читал про recordset. Может кто скинуть пример блока с получением данных из таблицы оракл и инсерт в таблицу access

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
 Set conn = New ADODB.Connection
    Set rs = New ADODB.Recordset
    conStr = "Provider=OraOLEDB.Oracle;Data Source=ххх;User Id=ххх; Password=ххх;"
      
    strSQL = "insert into shop select name3 from  table(схема.пакет.процедура ( p_ver =>'" & in_version & "', p_collection =>'" & in_collection & "', p_country =>'" & in_country & "', p_business =>'" & in_business & "',p_type_calc =>'4' )) "
   
   conn.Open (conStr)
   conn.Execute strSQL



shop - таблица созданная внутри access
table(схема.пакет.процедура ( p_ver =>'" & in_version & "', p_collection =>'" & in_collection & "', p_country =>'" & in_country & "', p_business =>'" & in_business & "',p_type_calc =>'4' )) - данные из оракл, полученные через API = процедуре с указание параметров, которые пользователь вводит в форму в access

При таком вызове, ризонно получаю ответ, что таблица не сущесвует, потому что он пытается инсертить в оракле, где этой таблицы нет.

Спасибо!

На всякий случай, тем кому было интересно, что это, и зачем в таком большом объеме держать. Речь про крупную группу компаний в сфере ритейла в одежде.
Это планы по завозу нового товара в магазины в разрезе сезонов (Осень/Зима или Весна/Лето).
Разрез магазин + размер каждого товара (например, если мы продаем белые футболки, то для размеров S,М,L будут разные строки)
ГРУБЫЙ подсчет объема: 500 магазинов * 5000 единиц товара * 4 размера по каждому ~ 10млн. Так как не во всех магазинах весь ассортимент продается получаем 5,8 млн строк.
Далее такой самый низки разрез позволяет различным департаментам во своему крутить данный и смотреть нужные показатели.
...
Рейтинг: 0 / 0
Оптимизация объема данных БД Access
    #39718276
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mesc,

мдя... тут ситуация в которой каждую идею нужно проверять практически... даже самую не очевидную...
В принципе если действительно много повторов в текстовых полях то можно поступить так:
1. Определяем ВСЕ текстовые поля с частыми повторами и делаем для них ОДИН классификатор (отдельную таблицу):
id - ключ/счетчик
txt - собственно текст текстового поля.
2. В таблице назначения (куда) меняем текстовые поля на Длинное целое для кодов из классификатора.
3. При импорте файла из оракла алгоритм такой:
- Для каждой строки импорта, для каждого текстового поля - ищем в классификаторе значение ключа этого текста и подставляем его в соответствующее поле таблицы назначения.
- Если в классификаторе нет такого текста, добавляем его в классификатор, получаем ключ и подставляем его в соответствующее поле таблицы назначения.
Ну и все... для анализа отдаем с таблицами или Запрос на базе двух таблиц или в основной таблице делаем подстановки для полей с кодами, чтобы на экране вместо кодов видеть текст из классификатора (так проще).
Нюансы:
- процедура импорта это будет код на vba (по крайней мере в первый раз).
- возможно импорт будет идти относительно долго (но это только в первый раз пока классификатор пустой от слова совсем.
- в классической интерпретации нужно делать отдельный классификатор на каждое поле, но в данном случае возможно это ни к чему...
- по идее основная таблица и таблица классификатора могут влезть в один файл БД при таком раскладе,
но даже и тут есть возможность для маневра - может быть даже это и логично (классификатор держать в отдельном файле, а к основной БД просто линковать таклицу)....
...
Рейтинг: 0 / 0
Оптимизация объема данных БД Access
    #39718292
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mescРечь про крупную группу компаний в сфере ритейла в одежде.
Это планы по завозу нового товара в магазины в разрезе сезонов (Осень/Зима или Весна/Лето).
Разрез магазин + размер каждого товара (например, если мы продаем белые футболки, то для размеров S,М,L будут разные строки)
ГРУБЫЙ подсчет объема: 500 магазинов * 5000 единиц товара * 4 размера по каждому ~ 10млн. Так как не во всех магазинах весь ассортимент продается получаем 5,8 млн строк.Итого. BIGINT для синтетического уника. INT код магазина. INT (ну ладно, пусть BIGINT) код товара. INT (вообще-то BYTE) для размера. На всё про всё - несколько десятков мегабайт. Ну и плюс ещё столько же - справочники магазинов, товаров и размеров.

Короче - сделайте нормально, а не через одно место. И сможете в одной БД хранить сведения за десять лет, и ещё место останется...
...
Рейтинг: 0 / 0
Оптимизация объема данных БД Access
    #39718314
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mesc, думал что за спека? процедура для соединения стрингов (спекание строк)? ан нет... оказывается это спецификация. Schema.ini по научному. 8396111
...
Рейтинг: 0 / 0
Оптимизация объема данных БД Access
    #39718517
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vmag- процедура импорта это будет код на vba (по крайней мере в первый раз).
Я бы сделал это в виде процедуры на Оракле. Будет работать на порядок быстрее, в Акс останется выгрузить только готовые таблицы
...
Рейтинг: 0 / 0
Оптимизация объема данных БД Access
    #39718667
Nebo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mesc,

То, что Вы делаете, это слишком много для Аксесса.
Должен быть и запас по размеру базы.

Есть же какие-то генераторы отчётов.

И потом надо разбивать на куски.

Бывает, конечно задачи с большими объёмами.

Зачем выгружать в Аксесс? На Оракле нельзя всё считать?
...
Рейтинг: 0 / 0
Оптимизация объема данных БД Access
    #39718674
Nebo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mesc,

авторНа всякий случай, тем кому было интересно, что это, и зачем в таком большом объеме держать. Речь про крупную группу компаний в сфере ритейла в одежде.
Это планы по завозу нового товара в магазины в разрезе сезонов (Осень/Зима или Весна/Лето).
Разрез магазин + размер каждого товара (например, если мы продаем белые футболки, то для размеров S,М,L будут разные строки)
ГРУБЫЙ подсчет объема: 500 магазинов * 5000 единиц товара * 4 размера по каждому ~ 10млн. Так как не во всех магазинах весь ассортимент продается получаем 5,8 млн строк.
Далее такой самый низки разрез позволяет различным департаментам во своему крутить данный и смотреть нужные показатели.

Не для Акссесса эта задача по большому счёту. Аксесс гудеть будет от напряжения.
Такие файлы может стоить выгружать в обычные текстовые файлы.
Дальше брать, может, Си или другой язык.
С их помощью загонять всё в структуры и обсчитывать.
Это если сразу всё и много обсчитывать.
Это непростая задачка.
...
Рейтинг: 0 / 0
Оптимизация объема данных БД Access
    #39718681
Nebo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mesc,

Не для Акса эта задача.
Если Вы крупный ритейл - то поищите подходящие инструменты.
Они есть.
...
Рейтинг: 0 / 0
Оптимизация объема данных БД Access
    #39721306
mesc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nebo, добрый день.

Вы абсолютно правы, именно поэтому я обозначал цель в самом начале:
Попытаться быстро временно закрыть данный вопрос, обеспечить работу пользователей в "прежнем режиме" в аксес.

Сейчас делаем перевод данных отчетов в известный BI viewer родом из США, но с французским акцентом (чтобы без явной рекламы)
Данный софт полностью подходит под наши задачи и устраивает пользователей.
Думаю в течении месяца реализуем.

Всем спасибо за помощь!
Вопрос закрыт.
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Оптимизация объема данных БД Access
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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