Почему набор записей «MoveLast» занимает больше времени на наборе записей с меньшим количеством записей? - PullRequest
0 голосов
/ 04 октября 2019

У меня есть функция, которую я вызываю для извлечения записей определенных полей:

Public Function fun_rstlast(str_input As String, str_field As String) As Variant

    Set rst = dbcOC.OpenRecordset(str_input, dbOpenSnapshot)
    rst.MoveLast

    fun_rstlast = rst.Fields(str_field)

    rst.Close
    Set rst = Nothing

End Function

Она находится в серии циклов, поэтому извлекает ту же последовательность записей, но из двух наборов идентичных таблиц (даЯ знаю, но я хочу сохранить это пока). Раздражает то, что по какой-то причине запуск функции из первого набора таблиц занимает в 10 раз больше времени, чем из второго набора таблиц. Я посмотрел на наборы записей, и один из более быстрой таблицы на самом деле в 2 раза больше!

Вот фрагмент кода, который выполняет цикл:

            Set col = New Collection

            str_DATE_G = "DATE_S"

            arr_field(1) = "DATE_S"
            arr_field(2) = "LATITUDE_T"
            arr_field(3) = "LONGITUDE_T"

            For r = 1 To UBound(arr_ID)

                lng_ID = arr_ID(r)

                For f = 1 To UBound(arr_field)

                    str_field = arr_field(f)

                    'debug.Print "str_field: " & str_field

                    ' Create query string
                    str_input = "SELECT * " _
                        & " FROM (tbl_G_stats_" & tour & " INNER JOIN tbl_G_ov_" & tour _
                        & " ON tbl_G_stats_" & tour & ".PK_G = tbl_G_ov_" & tour & ".PK_G)" _
                        & " INNER JOIN tours_" & tour & " ON tbl_G_ov_" & tour & ".ID_T = tours_" & tour & ".ID_T" _
                        & " WHERE Clng(" & str_DATE_G & ") < " & lng_DATE_G _
                        & " AND tbl_G_stats_" & tour & "." & str_ID_A & " = " & lng_ID

                    secs1 = Timer()

                    var_rstlast = fun_rstlast(str_input, str_field)

                    secs2 = Timer()

                    'debug.Print "var_rstlast: " & var_rstlast

                    Debug.Print "Timer: " & lng_ID & " " & str_field & " " & (secs2 - secs1) * 1000

                    col.Add var_rstlast

                Next f

            Next r

Есть еще один цикл намного дальше назадэто чередование между двумя наборами таблиц (tour).

Стоит отметить, что я исследовал индексы и типы данных двух таблиц, и все они идентичны.

Любые идеи о том, почему этомогло случиться?

1 Ответ

1 голос
/ 04 октября 2019

Наиболее распространенной причиной различной производительности является фрагментация таблицы / индекса.

Чтобы исправить фрагментацию таблицы в Access, можно выполнить сжатие и восстановление. Сжатие и восстановление перемещает все таблицы в целом в новое место, затем удаляет старые таблицы, удаляя всю фрагментацию таблиц в процессе и часто избегая фрагментации файлов.

Фрагментация таблиц обычно происходит при обновлении текстовых данных послеон был вставлен (поскольку текстовые данные могут быть длиннее исходных данных) и при ручной вставке данных в поля первичного ключа. Однако есть и другие причины.

Если вы часто сталкиваетесь с фрагментацией таблицы, Access предлагает параметр Compact on close в меню настроек базы данных. Однако это происходит с существенной задержкой при закрытии базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...