Оптимизация выборки данных из базы.

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Оптимизация выборки данных из базы.

Сообщение MEMBER » 17.06.2009 (Ср) 12:09

Здравствуйте. ;) Сто лет не заглядывал.

Язык: VB 6 SP 3
База: MS Access 97
Таблиц в базе: 1 (одна)
Заголовки столбцов: | Counter | Singer | Song | Text | Music | Filename |
Для доступа к БД используется компонент Data.

Программа на входе получает список имён аудиофайлов в текстовом файле, на выходе выдаёт в TextBox информацию Исполнитель песни, Название песни, Автор текста, Автор музыки.

Реализовал выборку из базы так:
Код: Выделить всё
' Имена аудиофайлов предварительно загружаются в массив arrFN с помощью Split.

For i = 0 to Ubound(arrFN)
    strFN = arrFN(i)
    Data1.RecordSource = "SELECT * FROM Songs WHERE Filename = '" & strFN & "'"
    Data1.Refresh
    strData = strData & Data1.Recordset.Fields("Singer ") & vbTab _
                              & Data1.Recordset.Fields("Song") & vbTab _
                              & Data1.Recordset.Fields("Text") & vbTab _
                              & Data1.Recordset.Fields("Music ") & vbCrLf
Next


Но это решение тот ещё маразм, в случае обработки текстового файла с количеством строк под пять сотен слабенький комп, на котором идёт обработка, "задумывается" минут на 7. Это при условии того, что в базе всего 800 записей, а что будет когда в базе будет под пять тысяч записей я и представлять не хочу, страшно. :)
Возникает вопрос, а как вообще можно оптимизировать выборку? К примеру в SELECT указывать не одно имя файла, а сразу 100, или как-то ещё?
---
Прошу извинить за тупой вопрос, я настолько давно не брал в руки шашек, что почти нифига не помню.
Спасибо. ;)
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Оптимизация выборки данных из базы.

Сообщение alibek » 17.06.2009 (Ср) 12:13

Используй метод Find, будет быстрее. Особенно если столбец Filename проиндексирован.
Lasciate ogni speranza, voi ch'entrate.

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Re: Оптимизация выборки данных из базы.

Сообщение MEMBER » 17.06.2009 (Ср) 12:17

alibek писал(а):Используй метод Find, будет быстрее. Особенно если столбец Filename проиндексирован.

Спасибо, alibek. И ещё раз здравствуйте.

После использования Find'a ведь всё равно придётся перезагружать Recordset, или я ошибаюсь?

В принципе сделав поле Filename индексированным я уже увеличил скорость обработки весьма значительно. Вот что значит всё забыть.
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Оптимизация выборки данных из базы.

Сообщение iGrok » 17.06.2009 (Ср) 12:36

1) Отсортируй список имён файлов, сделай выборку "SELECT * FROM Songs ORDER BY FileName", а потом бегай по полностью открытому рекордсету при помощи Find.

2) Не помню, сработает или нет с текстовым полем, но можно сделать выборку "SELECT * FROM Songs WHERE FileName IN ('fn1', 'fn2', 'fn3'...)"
Предварительно собрав все имена файлов в строку.
label:
cli
jmp label

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Re: Оптимизация выборки данных из базы.

Сообщение MEMBER » 17.06.2009 (Ср) 12:43

iGrok писал(а):1) Отсортируй список имён файлов, сделай выборку "SELECT * FROM Songs ORDER BY FileName", а потом бегай по полностью открытому рекордсету при помощи Find.

2) Не помню, сработает или нет с текстовым полем, но можно сделать выборку "SELECT * FROM Songs WHERE FileName IN ('fn1', 'fn2', 'fn3'...)"
Предварительно собрав все имена файлов в строку.


Спасибо, попробую.
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Оптимизация выборки данных из базы.

Сообщение alibek » 17.06.2009 (Ср) 13:00

MEMBER писал(а):После использования Find'a ведь всё равно придётся перезагружать Recordset, или я ошибаюсь?

Ошибаешься. Это после Filter его надо обновлять.
Lasciate ogni speranza, voi ch'entrate.

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Re: Оптимизация выборки данных из базы.

Сообщение MEMBER » 17.06.2009 (Ср) 18:22

Всем низкий поклон. Всё сделал.
Выборка за год на слабой машинке занимает 1 минуту, супротив прошлых чёрт знает скольких минут.
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Re: Оптимизация выборки данных из базы.

Сообщение HandKot » 18.06.2009 (Чт) 7:38

так же можно попробовать прицепить текстовый файл как "линковaнную таблицу"
и потом одним запросом выбрать всё что надо

Код: Выделить всё
SELECT * FROM Songs Inner Join FileName on ...
I Have Nine Lives You Have One Only
THINK!

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Оптимизация выборки данных из базы.

Сообщение SLIM » 18.06.2009 (Чт) 21:20

HandKot писал(а):так же можно попробовать прицепить текстовый файл как "линковaнную таблицу"
и потом одним запросом выбрать всё что надо


с inner join-ом работать будет значительно медленней (касательно текстовых полей)
Пишите жизнь на чистовик.....переписать не удастся.....


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 135

    TopList