33 / 33 / 15
Регистрация: 07.05.2014
Сообщений: 313
|
||||||
1 | ||||||
Лучшее решение для обработки большой бд04.11.2014, 15:34. Показов 2131. Ответов 30
Метки нет (Все метки)
Всем привет! Ребята, вопросик такой.
Есть База данных 2418192 строк Полей 36 всего. Работаю через vba, нужно автоматизированно работать с этой базой. Но один запрос в такую базу выполняется несколько минут. А для выполнения задачи запросов нужно сделать до 3000. На какие методы лучше перескакивать? Знаний крайне мало... Решить задачу надо уже завтра-посезавтра. Алгоритмы проработаны все. Формат таблицы - dbf. Пример запроса:
0
|
04.11.2014, 15:34 | |
Ответы с готовыми решениями:
30
Найти лучшее решение Yii - это лучшее решение? Лучшее решение по сборке (видеокарта, оперативка) После Снежинска бездействие в краткосрочной перспективе-лучшее решение |
17486 / 7248 / 1651
Регистрация: 21.06.2012
Сообщений: 13,864
|
|
04.11.2014, 16:00 | 2 |
Таблица импортирована в базу или линкована? Если импортирована - есть ли в ней индексы. Наличие индексов по нужным полям убыстряет работу запросов (в любой базе).
2
|
26806 / 14485 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
|
||||||
04.11.2014, 16:09 | 3 | |||||
И где запросы? Показан пример работы с рекордсетом.
Кстати, Debug.Print работает синхронно, а значит занимает время. Возможно даже большую часть времени. Печатайте хотя бы через сотню записей
1
|
Модератор
|
||||||
04.11.2014, 16:26 | 4 | |||||
в первую очередь поясните суть adr_slovo(2)
пока видно только одно --полный перебор 2млн записей с подсчетом adr_testimm --если совпало условие отбора --подсчет а не видно сути, а без понимания задачи --помочь сложно
1
|
33 / 33 / 15
Регистрация: 07.05.2014
Сообщений: 313
|
|
04.11.2014, 16:52 [ТС] | 5 |
Таблица с сайта ФИАС. Индексов нет( Она импортирована
Добавлено через 2 минуты Ну я только так умею Попробую через 1000000, это не очень важно, сейчас следующим сообщением всю задачу опишу)
0
|
17486 / 7248 / 1651
Регистрация: 21.06.2012
Сообщений: 13,864
|
|
04.11.2014, 17:00 | 6 |
При импорте создайте ключевое поле. После импорта проиндексируйте поля, по которым будут выборки/сортировки. Сожмите базу. Запустите самый "тяжелый" запрос и сравните.
Если обработка связаны с определением ключей из справочников, сформированных заранее, то попробуйте использовать Seek по табличным наборам (только не открывайте/закрывайте их каждый раз, сделайте их глобальными, откройте и определите индекс в начале обработки).
1
|
33 / 33 / 15
Регистрация: 07.05.2014
Сообщений: 313
|
|
04.11.2014, 17:08 [ТС] | 7 |
Кратко цель всего: загрузить файл excel импортом в access, там есть около 1000 адресов. Выполнить процедуру. И в таблице этой рядом с каждым адресом прописывается индекс.
В общем задача такова: Я открываю таблицу №1 с адресами (1 адрес=1 поле) Беру первую строку с поля adres. Выполняю его разбиение по объектам адреса, ну к примеру (Татарстан Казань Вахитова д 30) Каждый объект в отдельный массив adr_slovo заносится. Вот до этого момента выполнено Далее, нужно объяснить: База объектов адресов есть, но все объекты в одном поле хранятся. Т.е. в одном и том же поле и республики, и улицы. В соседних полях есть "Код региона" и т.д. Есть "Уровень", где написано число 1,2,3... Ну и числа соответствнено обозначают республику, область, город и т.д. Ну и вот. Мне нужно брать каждый элемент массива и по нему делать запрос в эту огромную базу данных. По полуенным результатам: -Если результатов несколько, то смотрим сначала первый. Иначе действий не требуется. --По первому результату определяем его уровень (область это, или город или что еще) Если это область, тогда запоминаем его ID. (К примеру это была "Московская" и его ID=102) Теперь берем следующий элемент массива (Пусть это например "Кукуево") В ту же большую таблицу делаем запрос, чтобы совпало поле названия по "Кукуево" и поле ID_Родителя было равным 102. Ну и т.д. Когда находим улицу, тогда уже еще в одну таблицу делаем запрос. Чтобы ID_города, название_улицы, номер_дома совпали, и берем индекс. Алгоритм на листочке бумаги русским языком описан полностью) Всю ночь вчера составлял) Добавлено через 56 секунд Можно пожалуйста с этого момента подробнее?)) Как индексировать, что это и с чем кушать? Спасибо!)
0
|
17486 / 7248 / 1651
Регистрация: 21.06.2012
Сообщений: 13,864
|
|
04.11.2014, 17:14 | 8 |
Вы предлагаете мне процитировать здесь несколько страниц хелпа с картинками? Может проще его прочитать в оригинале?
1
|
33 / 33 / 15
Регистрация: 07.05.2014
Сообщений: 313
|
|
04.11.2014, 17:17 [ТС] | 9 |
0
|
Модератор
|
||||||
04.11.2014, 17:57 | 10 | |||||
зачем же adr_slovo выполнять 2 млн раз == по крайней мере
1
|
33 / 33 / 15
Регистрация: 07.05.2014
Сообщений: 313
|
|
04.11.2014, 18:02 [ТС] | 11 |
Есть 1000 адресов в таблице №1 вида "Московская область, г Кукуево, ул. Смирнова, д. 55"
adr_slovo(n) - массив, каждый элемент которого содержит объект адреса. adr_slovo(1)="Московская", adr_slovo(2)="Кукуево" и т.д. В таблице №2 есть база объектов адресов, где их более 2млн Я сравниваю объект adr_slovo(n) с объектами из таблицы №2
0
|
Модератор
|
||||||
04.11.2014, 18:12 | 12 | |||||
даже обращение к элементу массива adr_slovo(2)---времени требует, а вы обращаетесь 2 млн раз
по крайней мере
1
|
17486 / 7248 / 1651
Регистрация: 21.06.2012
Сообщений: 13,864
|
|
04.11.2014, 18:13 | 13 |
С каким полем или нескольким (OR) полями нужно сравнивать? Все такие выборки с совпадениями делаются запросами, без явного полного просмотра таблицы. И именно по этим полям нужны индексы.
1
|
33 / 33 / 15
Регистрация: 07.05.2014
Сообщений: 313
|
|
04.11.2014, 18:16 [ТС] | 14 |
А вы не могли бы прокомментировать строчки плиз?) И как их использовать?
Добавлено через 1 минуту А где можно мануал по запросам "Для чайников" прочитать? Плииз) Я просто столько литературы перелопатил... И почти ничего, что мог бы понять. Даже рекордсет здесь на форуме объяснили
0
|
Модератор
|
|
04.11.2014, 18:27 | 15 |
сделать ленточную форму на ваш справочник и 2-3 поля поиска
я даже структуры ФИАС не помню(когда-то давно смотрела) ===при 1000 записей я бы видимо сделала так --высветила строку из ексель --выбрала из нее визульно опорные слова --создала фильтр для ФИАС, итог в ленточном виде не думайте, что вы сразу найдете искомое я свои родные координаты найти не смогла(несовпадение названий областей,городов, улиц) причем в каком то справочнике улица дублировалась по всем почтовым отделениям но моя улица не числилась за моим почтовым отделение
1
|
17486 / 7248 / 1651
Регистрация: 21.06.2012
Сообщений: 13,864
|
|
04.11.2014, 18:28 | 16 |
В Путеводитель по разделу есть список литературы. Но Вы бы выложили структуру Таблицы2 и написали, какой элемент массива с каким полем нужно сравнивать, что сделать в случае совпадения (не выводить же что то Debug.Print, или Вам просто нужно убедится, что все компоненты Ваших адресов есть Таблице2).
1
|
33 / 33 / 15
Регистрация: 07.05.2014
Сообщений: 313
|
|
04.11.2014, 19:43 [ТС] | 17 |
Я сейчас лучше оформлю всё правильно и выложу вам на обозрение) Весь алгоритм)
Добавлено через 1 час 6 минут Если кому вдруг интересно вот документация к базе ФИАС Если совпало проверяем поле "AOLEVEL" 20 Открываем еще одну таблицу и делаем запрос с этим элементом массива в поле ULICA при этом следующий элемент массива=DOM Добавлено через 2 минуты Ребята, а могли бы вы мне помочь так... Я сейчас сделаю простую бд с тремя таблицами, и сделать там несколько вещей: 1) Открыть и получить данные с первой таблицы 2) С полученными данными сделать запрос во вторую таблицу 3) С полученными данными сделать запрос в третью таблицу 3) Записать в соседнее поле таблицы 1 полученную информацию Просто если умеете, я так понимаю это быстро будет и несложно?) Я бы вас больше не мучил и сам с кодом разобрался
0
|
33 / 33 / 15
Регистрация: 07.05.2014
Сообщений: 313
|
|
04.11.2014, 20:01 [ТС] | 18 |
cyyberforum_help_access.zip
Ребята, очень большая просьба написать код для следующего: С таблица1 берется первая строка поля adress C полученной информацией делается запрос в таблица2 по полю element, по результату запроса берём информацию с поля ID В третью таблицу делается запрос по условию ID.таблица2=Street.таблица3 и DOM.Таблица1=DOM.таблица3 По результату последнего запроса информация с поля indeks.Таблица3 записывается в поле indeks.таблица1. Здесь бы сразу содержались ответы на все мои вопросы. Вы можете послать меня нафигу прямо здесь или у себя в душе, и это справедливо, но сам я тоже людям помогаю в тех областях, которых разбираюсь) Поэтому прошу Вас помочь мне в этом))) Спасибо Вам огромное человеческое! p.s. сам знаю html|css и административную практику в "Юризме"
0
|
17486 / 7248 / 1651
Регистрация: 21.06.2012
Сообщений: 13,864
|
|
04.11.2014, 20:34 | 20 |
В таблице добавлены индексы, запрос2 определяет для каждой записи из таблицы1 индекс. И немного по другому - (Seek побыстрее будет) функция Запись_Индексов из Module1 записывает их в таблицу1.
1
|
04.11.2014, 20:34 | |
04.11.2014, 20:34 | |
Помогаю со студенческими работами здесь
20
VirtualDub 1.9.9: бесплатное решение для обработки цифрового видео Решение задач с использованием массивов и циклов для их обработки Большой расход памяти при обработки Runnable тасков Лучшее дополнение для антивирусника Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |