Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
33 / 33 / 15
Регистрация: 07.05.2014
Сообщений: 313
1

Лучшее решение для обработки большой бд

04.11.2014, 15:34. Показов 2131. Ответов 30
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет! Ребята, вопросик такой.

Есть База данных 2418192 строк
Полей 36 всего.

Работаю через vba, нужно автоматизированно работать с этой базой. Но один запрос в такую базу выполняется несколько минут. А для выполнения задачи запросов нужно сделать до 3000.

На какие методы лучше перескакивать? Знаний крайне мало... Решить задачу надо уже завтра-посезавтра. Алгоритмы проработаны все. Формат таблицы - dbf.


Пример запроса:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Set rstt = CurrentDb.OpenRecordset("select * from addrobj") 'открываем базу c объектами адресов
        '-----------------------------------
        Do Until rstt.EOF
            If adr_slovo(2) = rstt![formalname] Then 'сравниваем имеющийся в массиве объект с обхектом из бд
                Debug.Print a = a + 1, "Удачно не зависла"  'чисто чтобы видеть что прога не зависла
            End If
            adr_testimm = adr_testimm + 1  'чисто чтобы видеть что прога не зависла
            Debug.Print adr_testimm  'чисто чтобы видеть что прога не зависла
            
                
        rstt.MoveNext
        Loop
Спасибо всем!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.11.2014, 15:34
Ответы с готовыми решениями:

Найти лучшее решение
Вот задание Напишите программу, которая использует приведенные строки при подсчете количества...

Yii - это лучшее решение?
Хочу перенести проект на PHP фреймворк Yii Проект tm360.ru Сам проект на самописе (корявом)...

Лучшее решение по сборке (видеокарта, оперативка)
Здравствуйте. Появилась возможность обновить железо. И есть 2 варианта. Купить видеокарту подороже,...

После Снежинска бездействие в краткосрочной перспективе-лучшее решение
Вкратце,это уже писал,со Снежинском куча запросов с 1-й страницы упаа на 2-ю или 3-ю,пробовал массу...

30
Эксперт MS Access
17486 / 7248 / 1651
Регистрация: 21.06.2012
Сообщений: 13,864
04.11.2014, 16:00 2
Цитата Сообщение от almaz1994 Посмотреть сообщение
Формат таблицы - dbf.
Таблица импортирована в базу или линкована? Если импортирована - есть ли в ней индексы. Наличие индексов по нужным полям убыстряет работу запросов (в любой базе).
2
Эксперт MS Access
26806 / 14485 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
04.11.2014, 16:09 3
И где запросы? Показан пример работы с рекордсетом.

Кстати, Debug.Print работает синхронно, а значит занимает время. Возможно даже большую часть времени. Печатайте хотя бы через сотню записей
Visual Basic
1
2
3
4
5
6
Dim i
...........
Do Until rstt.EOF
    i=i+1
...........
    If (i mod 100)=0 Then Debug.Print ...
1
Модератор
Эксперт MS Access
11960 / 4828 / 779
Регистрация: 07.08.2010
Сообщений: 14,139
Записей в блоге: 4
04.11.2014, 16:26 4
в первую очередь поясните суть adr_slovo(2)
пока видно только одно
--полный перебор 2млн записей с подсчетом adr_testimm
--если совпало условие отбора --подсчет а

не видно сути, а без понимания задачи --помочь сложно

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Set rstt = CurrentDb.OpenRecordset("select * from addrobj") 'открываем базу c объектами адресов
        '-----------------------------------
 Do Until rstt.EOF
    If adr_slovo(2) = rstt![formalname] Then 
    'сравниваем имеющийся в массиве объект с объектом из бд
    Debug.Print a = a + 1, "Удачно не зависла"  
   'чисто чтобы видеть что прога не зависла
    End If
    adr_testimm = adr_testimm + 1  
    'чисто чтобы видеть что прога не зависла
    Debug.Print adr_testimm  
    'чисто чтобы видеть что прога не зависла
 rstt.MoveNext
 Loop
1
33 / 33 / 15
Регистрация: 07.05.2014
Сообщений: 313
04.11.2014, 16:52  [ТС] 5
Цитата Сообщение от ltv_1953 Посмотреть сообщение
Таблица импортирована в базу или линкована? Если импортирована - есть ли в ней индексы. Наличие индексов по нужным полям убыстряет работу запросов (в любой базе).
Таблица с сайта ФИАС. Индексов нет( Она импортирована

Добавлено через 2 минуты
Цитата Сообщение от mobile Посмотреть сообщение
И где запросы? Показан пример работы с рекордсетом.
Ну я только так умею
Цитата Сообщение от mobile Посмотреть сообщение
Кстати, Debug.Print работает синхронно, а значит занимает время. Возможно даже большую часть времени. Печатайте хотя бы через сотню записей
Попробую через 1000000, это не очень важно, сейчас следующим сообщением всю задачу опишу)
0
Эксперт MS Access
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
Цитата Сообщение от shanemac51 Посмотреть сообщение
в первую очередь поясните суть adr_slovo(2)
пока видно только одно
--полный перебор 2млн записей с подсчетом adr_testimm
--если совпало условие отбора --подсчет а
не видно сути, а без понимания задачи --помочь сложно
Кратко цель всего: загрузить файл excel импортом в access, там есть около 1000 адресов. Выполнить процедуру. И в таблице этой рядом с каждым адресом прописывается индекс.

В общем задача такова:
Я открываю таблицу №1 с адресами (1 адрес=1 поле)
Беру первую строку с поля adres.
Выполняю его разбиение по объектам адреса, ну к примеру (Татарстан Казань Вахитова д 30)
Каждый объект в отдельный массив adr_slovo заносится.
Вот до этого момента выполнено

Далее, нужно объяснить:
База объектов адресов есть, но все объекты в одном поле хранятся. Т.е. в одном и том же поле и республики, и улицы. В соседних полях есть "Код региона" и т.д. Есть "Уровень", где написано число 1,2,3... Ну и числа соответствнено обозначают республику, область, город и т.д.

Ну и вот. Мне нужно брать каждый элемент массива и по нему делать запрос в эту огромную базу данных.
По полуенным результатам:
-Если результатов несколько, то смотрим сначала первый. Иначе действий не требуется.
--По первому результату определяем его уровень (область это, или город или что еще)
Если это область, тогда запоминаем его ID. (К примеру это была "Московская" и его ID=102)

Теперь берем следующий элемент массива (Пусть это например "Кукуево")
В ту же большую таблицу делаем запрос, чтобы совпало поле названия по "Кукуево" и поле ID_Родителя было равным 102.

Ну и т.д.

Когда находим улицу, тогда уже еще в одну таблицу делаем запрос. Чтобы ID_города, название_улицы, номер_дома совпали, и берем индекс.

Алгоритм на листочке бумаги русским языком описан полностью) Всю ночь вчера составлял)

Добавлено через 56 секунд
Цитата Сообщение от ltv_1953 Посмотреть сообщение
После импорта проиндексируйте поля, по которым будут выборки/сортировки. Сожмите базу. Запустите самый "тяжелый" запрос и сравните.
Можно пожалуйста с этого момента подробнее?)) Как индексировать, что это и с чем кушать? Спасибо!)
0
Эксперт MS Access
17486 / 7248 / 1651
Регистрация: 21.06.2012
Сообщений: 13,864
04.11.2014, 17:14 8
Цитата Сообщение от almaz1994 Посмотреть сообщение
Как индексировать, что это и с чем кушать?
Вы предлагаете мне процитировать здесь несколько страниц хелпа с картинками? Может проще его прочитать в оригинале?
1
33 / 33 / 15
Регистрация: 07.05.2014
Сообщений: 313
04.11.2014, 17:17  [ТС] 9
Цитата Сообщение от ltv_1953 Посмотреть сообщение
Вы предлагаете мне процитировать здесь несколько страниц хелпа с картинками? Может проще его прочитать в оригинале?
Понял, спасибо!) Пожалуйста, большая просьба не отписываться с темы
0
Модератор
Эксперт MS Access
11960 / 4828 / 779
Регистрация: 07.08.2010
Сообщений: 14,139
Записей в блоге: 4
04.11.2014, 17:57 10
загрузить файл excel импортом в access, там есть около 1000
у вас всего 1000 записей
зачем же adr_slovo выполнять 2 млн раз

==
по крайней мере
Visual Basic
1
2
Set rstt = CurrentDb.OpenRecordset("select * from addrobj where adres like '*кукуево*'")
 'открываем базу c объектами адресов только по кукуеву
1
33 / 33 / 15
Регистрация: 07.05.2014
Сообщений: 313
04.11.2014, 18:02  [ТС] 11
Цитата Сообщение от shanemac51 Посмотреть сообщение
у вас всего 1000 записей
зачем же adr_slovo выполнять 2 млн раз
Есть 1000 адресов в таблице №1 вида "Московская область, г Кукуево, ул. Смирнова, д. 55"
adr_slovo(n) - массив, каждый элемент которого содержит объект адреса. adr_slovo(1)="Московская", adr_slovo(2)="Кукуево" и т.д.

В таблице №2 есть база объектов адресов, где их более 2млн
Я сравниваю объект adr_slovo(n) с объектами из таблицы №2
0
Модератор
Эксперт MS Access
11960 / 4828 / 779
Регистрация: 07.08.2010
Сообщений: 14,139
Записей в блоге: 4
04.11.2014, 18:12 12
даже обращение к элементу массива adr_slovo(2)---времени требует, а вы обращаетесь 2 млн раз

по крайней мере

Visual Basic
1
2
3
4
5
6
7
dim s1
s1="adres like '*" & adr_slovo(1) & "*'"
s1=s1 & " and adres like '*" & adr_slovo(2) & "*'"
s1=s1 & " and adres like '*" & adr_slovo(3) & "*'"
 
me.filter=s1
me.filteron =true
1
Эксперт MS Access
17486 / 7248 / 1651
Регистрация: 21.06.2012
Сообщений: 13,864
04.11.2014, 18:13 13
Цитата Сообщение от almaz1994 Посмотреть сообщение
Я сравниваю объект adr_slovo(n) с объектами из таблицы №2
С каким полем или нескольким (OR) полями нужно сравнивать? Все такие выборки с совпадениями делаются запросами, без явного полного просмотра таблицы. И именно по этим полям нужны индексы.
1
33 / 33 / 15
Регистрация: 07.05.2014
Сообщений: 313
04.11.2014, 18:16  [ТС] 14
Цитата Сообщение от shanemac51 Посмотреть сообщение
по крайней мере
Код Visual Basic
Код
dim s1
s1="adres like '*" & adr_slovo(1) & "*'"
s1=s1 & " and adres like '*" & adr_slovo(2) & "*'"
s1=s1 & " and adres like '*" & adr_slovo(3) & "*'"
me.filter=s1
me.filteron =true
А вы не могли бы прокомментировать строчки плиз?) И как их использовать?

Добавлено через 1 минуту
Цитата Сообщение от ltv_1953 Посмотреть сообщение
С каким полем или нескольким (OR) полями нужно сравнивать? Все такие выборки с совпадениями делаются запросами, без явного полного просмотра таблицы. И именно по этим полям нужны индексы.
А где можно мануал по запросам "Для чайников" прочитать? Плииз) Я просто столько литературы перелопатил... И почти ничего, что мог бы понять. Даже рекордсет здесь на форуме объяснили
0
Модератор
Эксперт MS Access
11960 / 4828 / 779
Регистрация: 07.08.2010
Сообщений: 14,139
Записей в блоге: 4
04.11.2014, 18:27 15
сделать ленточную форму на ваш справочник и 2-3 поля поиска
я даже структуры ФИАС не помню(когда-то давно смотрела)

===при 1000 записей я бы видимо сделала так
--высветила строку из ексель
--выбрала из нее визульно опорные слова
--создала фильтр для ФИАС, итог в ленточном виде

не думайте, что вы сразу найдете искомое
я свои родные координаты найти не смогла(несовпадение названий областей,городов, улиц)
причем в каком то справочнике улица дублировалась по всем почтовым отделениям
но моя улица не числилась за моим почтовым отделение
1
Эксперт MS Access
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
Цитата Сообщение от ltv_1953 Посмотреть сообщение
В Путеводитель по форуму есть список литературы. Но Вы бы выложили структуру Таблицы2 и написали, какой элемент массива с каким полем нужно сравнивать, что сделать в случае совпадения (не выводить же что то Debug.Print, или Вам просто нужно убедится, что все компоненты Ваших адресов есть Таблице2).
Я сейчас лучше оформлю всё правильно и выложу вам на обозрение) Весь алгоритм)

Добавлено через 1 час 6 минут
Если кому вдруг интересно вот документация к базе ФИАС

Если совпало проверяем поле "AOLEVEL"

если <4

Запоминаем поле GUID
Выполняем строку 10

В противном случае Если=7

выполняем строку 20
10 Делаем запрос туда же со следующим элементом массива, при этом GUID=ParrentGUID

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
Эксперт MS Access
26806 / 14485 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
04.11.2014, 20:28 19
almaz1994, выполните запрос qIndex и в Таблица1 запишется индекс
Вложения
Тип файла: rar База данных5.rar (16.8 Кб, 8 просмотров)
2
Эксперт MS Access
17486 / 7248 / 1651
Регистрация: 21.06.2012
Сообщений: 13,864
04.11.2014, 20:34 20
В таблице добавлены индексы, запрос2 определяет для каждой записи из таблицы1 индекс. И немного по другому - (Seek побыстрее будет) функция Запись_Индексов из Module1 записывает их в таблицу1.
Вложения
Тип файла: 7z База данных5.7z (17.9 Кб, 10 просмотров)
1
04.11.2014, 20:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.11.2014, 20:34
Помогаю со студенческими работами здесь

VirtualDub 1.9.9: бесплатное решение для обработки цифрового видео
Вышел очередной релиз популярной утилиты для работы с видео. Это - бесплатный и очень удобный...

Решение задач с использованием массивов и циклов для их обработки
Решение задач с использованием массивов и циклов для их обработки. Создать соответствующий массив,...

Большой расход памяти при обработки Runnable тасков
Доброго времени суток. Есть такой класс: @Component public class TestClass extends Verify { ...

Лучшее дополнение для антивирусника
Посоветуйте програмку как дополнение к антивируснику (malwarebytes anti malware- на подобе етой)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru