pypyodb c sql запрос к базе данных, хранящейся в облачном хранилище ms, медленный при запросе новейших данных, но быстрый при запросе самых старых данных - PullRequest
0 голосов
/ 29 апреля 2020

Я использую pypyodb c и pandas .read_sql_query для запроса облачной сохраненной базы данных MS Access .accdb файл.

def query_data(group_id,dbname = r'\\cloudservername\myfile.accdb',table_names=['ContainerData']):

        start_time = datetime.now()
        print(start_time)
        pypyodbc.lowercase = False
        conn = pypyodbc.connect(
            r"Driver={Microsoft Access Driver (*.mdb, *.accdb)};"+
            r"DBQ=" + dbname + r";")
        connection_time = datetime.now()-start_time
        print("Connection Time: " + str(connection_time))

        querystring = ("SELECT TOP 10 Column1, Column2, Column3, Column4 FROM " + 
            table_names[0] + " WHERE Column0 = " + group_id)

        my_data = pd.read_sql_query(querystring,conn)

        print("Query Time: " + str(datetime.now()-start_time-connection_time))

        conn.close()

        return(my_data)

База данных насчитывает около 30 000 строк. Group_id - это последовательные числа от 1 до 3000 с 10 строками, назначенными каждой группе. Например, строки 1-10 в базе данных (самая старая дата) имеют group_id = 1. Все строки 2990-3000 (новейшие данные) имеют group_id = 3000.

Когда я храню базу данных локально на моем P C и запускаю query_data('1'), время соединения составляет 0,1 с, а время запроса - 0,01 с. , Аналогично, при query_data('3000') время соединения составляет 0,2 с, а время запроса - 0,08 с.

Когда база данных хранится на облачном сервере, время соединения варьируется от 20 до 60 с. Когда я запускаю query_data('1') время запроса составляет ~ 3 секунды. ТЕПЕРЬ БОЛЬШАЯ ПРОБЛЕМА: Когда я запускаю query_data('3000') время запроса, я ~ 10 минут!

Я пытался использовать ORDER BY group_id DESC, но оба запроса занимают ~ 10 минут.

Я также попытался изменить значение group_id "Order by" на Descending в самом accdb и установить для "Order by on load" значение yes. Похоже, что ни один из них не меняет то, как запрос SQL находит данные.

Проблема в том, что код, который я использую, почти всегда должен находить самые новые данные (например, group_id = max), который занимает самое большое количество времени для поиска. Есть ли способ сделать запрос SQL обратным порядку поиска, чтобы сначала просматривались самые новые записи, а не самые старые записи? Я не возражал бы против 3 секунд (или даже 1). минута) время запроса, но 10-минутное время запроса слишком велико. Или есть параметр, который я могу изменить в базе данных доступа, чтобы изменить порядок хранения данных?

Я также наблюдал за монитором сети во время выполнения сценария, и python .exe стабильно отправляет около 2 Кбит / с и получает около 25 Кбит / с на протяжении всей 10-минутной продолжительности сценария.

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