Я использую 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-минутной продолжительности сценария.