powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Оптимизация фильтра
10 сообщений из 10, страница 1 из 1
Оптимизация фильтра
    #39102423
NBjHCBrc6KlSObm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Есть такая простенькая база хешей рутрекера: yadi.sk/d/FN1x5mjhkAN63
В 2003-м формате, чтобы у всех открывалась.
Одна таблица (ну почти), одна форма.
Проблема: фильтр в форме, он же поиск, занимает примерно 10 секунд, что некоторым кажется много.
Понятно, что 1625973 записи это не так уж и мало, но может есть какой-нибудь манёвр для оптимизации, про который я забыл?
...
Рейтинг: 0 / 0
Оптимизация фильтра
    #39102469
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NBjHCBrc6KlSObm,
в конструкторе в таблице t_torrents установите свойство "Индексированное поле - Да" для полей forum_name и torrent_name , размер базы увеличится, за то ваши фильтры будут работать значительно шустрее
...
Рейтинг: 0 / 0
Оптимизация фильтра
    #39102477
NBjHCBrc6KlSObm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
guest_rusimport,
попробовал, но не заметил прироста скорости.
...
Рейтинг: 0 / 0
Оптимизация фильтра
    #39102488
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NBjHCBrc6KlSObm,
...
Рейтинг: 0 / 0
Оптимизация фильтра
    #39102493
NBjHCBrc6KlSObm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
guest_rusimport,
если сначала выбрать название форума, а потом уже название торрента, то конечно быстро.
Тем более «любовь» само по себе быстро ищется. Если же искать например «raime», то всё уже не так быстро.
Лучше тестировать на простом запросе из двух слов:
Код: plsql
1.
2.
3.
4.
SELECT *
FROM t_torrents
WHERE torrent_name LIKE "*aphex*twin*"
;
...
Рейтинг: 0 / 0
Оптимизация фильтра
    #39102494
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NBjHCBrc6KlSObm,
попутно:
...
Рейтинг: 0 / 0
Оптимизация фильтра
    #39102579
NBjHCBrc6KlSObm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Predeclared,
да, согласен, проще убрать такой подсчёт, чем полагаться на Me.Recordset.RecordCount. Нормальный счётчик через RecordsetClone время поиска ещё раза в 2 увеличивает :о(
...
Рейтинг: 0 / 0
Оптимизация фильтра
    #39103674
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NBjHCBrc6KlSObm,
решил поэкспериментировать на досуге с вашей базой ... да, если искать "raime" по названию торрента, то время поиска в вашей базе на моем компе идет с среднем 20 сек вне зависимости проиндексировано это поле в таблице или нет... тогда я перегрузил вашу табличку в пустую базу и использовал для дальнейших экспериментов следующую функцию (взял за основу код Joss-а с rusimport-a)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
Public Function fff()
t1 = Timer
' описываем переменные
Dim db As Database
Dim varArray() As Variant
Dim rstData As DAO.Recordset
Dim strSQL As String
Dim eData As Long
Dim intFields As Integer, i As Long
Dim rst As New ADODB.Recordset

Set db = CurrentDb
' задаем текст запроса
strSQL = "SELECT * from t_torrents"
' число полей в запросе
intFields = 8
' открываем рекордсет
Set rstData = db.OpenRecordset(strSQL)
' проверяем наличие записей
If rstData.RecordCount = 0 Then
    rstData.Close
    MsgBox "Таблица пустая!" _
           , 64, "Содержимое таблицы"
    Exit Function
End If
' определяем количество записей в рекордсете
rstData.MoveLast ' перемещение в конец рекордсета
rstData.MoveFirst ' перемещение в начало рекордсета
eData = rstData.RecordCount ' количество записей в рекордсете
ReDim varArray(intFields, eData) ' устанавливаем размер динамического массива
' первый параметр - число столбцов в массиве (полей в запросе)
' второй параметр - число строк в массиве (число записей в запросе)

' сброс данных из рекордсета в массив
varArray = rstData.GetRows(eData)

rstData.Close
Set rstData = Nothing
Debug.Print Timer - t1
t2 = Timer
rst.Fields.Append "id", adVarChar, 255
rst.Fields.Append "forum_id", adVarChar, 255
rst.Fields.Append "forum_name", adVarChar, 255
rst.Fields.Append "torrent_id", adVarChar, 255
rst.Fields.Append "info_hash", adVarChar, 255
rst.Fields.Append "torrent_name", adVarChar, 255
rst.Fields.Append "torrent_size", adVarChar, 255
rst.Fields.Append "torrent_date", adVarChar, 255
rst.Open
For i = 0 To eData - 1
    If InStr(1, varArray(5, i), "raime") > 0 Then
        'Debug.Print varArray(5, i)
        rst.AddNew
        rst.Fields(0) = varArray(0, i)
        rst.Fields(1) = varArray(1, i)
        rst.Fields(2) = varArray(2, i)
        rst.Fields(3) = varArray(3, i)
        rst.Fields(4) = varArray(4, i)
        rst.Fields(5) = varArray(5, i)
        rst.Fields(6) = varArray(6, i)
        rst.Fields(7) = varArray(7, i)
    End If
Next i
rst.UpdateBatch
Debug.Print Timer - t2
End Function


результаты тестирования на моем компе показали, что ,собственно, поиск по "raime" идет в среднем 4 с небольшим сек + загрузка таблички в массив еще в среднем 13 сек... т.е. если грузить табличку в Public массив при начальной загрузке программы и потом искать по массиву , присваивать результат ADO рекордсету и этот рекордсет рекордсету вашей формы, то поиск получится значительно быстрее...тут, следует заметить, что по слову "любовь" поиск в вашей программе идет вроде бы 1 сек, но это пока не начинаешь листать в конец найденного списка, начинаются "тормоза" пока список не загрузится полностью, что исключено, при присвоении сформированного ADO рекордсета результатов поиска рекордсету формы в предлагаемом мной варианте ... всё это , конечно, хорошо, если памяти на компе достаточно, массив то с полутора миллионами записей из таблички загоняется в память
...
Рейтинг: 0 / 0
Оптимизация фильтра
    #39103853
NBjHCBrc6KlSObm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
guest_rusimport,
мне кажется, вы слишком усложняете. Разница между поиском «raime» и «любовь» в том, что форма показывает время отображения первой страницы результатов. «Любовь» встречается очень часто, поэтому и первая страница набивается довольно быстро, а чтобы заполнить первую страницу по запросу «raime» нужно все полтора миллиона обыскать, поэтому и кажется, что это занимает больше времени. Я выше писал, что для тестирования лучше использовать запрос, ну и смотреть, когда там счётчик внизу появляется.
К тому же InStr("aphex twin") это совсем не то же, что Like "*aphex*twin*" .
...
Рейтинг: 0 / 0
Оптимизация фильтра
    #39103883
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NBjHCBrc6KlSObm,
вы, кажется , спрашивали - "как оптимизировать", я вам предложил один из вариантов, оптимизация на лицо время поиска с 20 сек, уменьшилось до 4 сек, а как адаптировать при этом поиск, чтобы искалось как Like "*aphex*twin*" у меня тут обсуждать даже желания нет, это уже дело техники (для меня , во всяком случае , прозрачно и не интересно)... если вы не состоянии додумать предложенный алгоритм, может другие вам помогут, если у них , конечно, будет желание ...
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Оптимизация фильтра
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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