pd.read_ sql метод для подсчета количества строк в большой базе данных Access - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь прочитать количество строк в большой базе данных доступа и пытаюсь найти наиболее эффективный метод. Вот мой код:

driver = 'access driver as string'
DatabaseLink = 'access database link as string'
Name = 'access table name as string'

conn = pyodbc.connect(r'Driver={' + driver + '};DBQ=' + DatabaseLink +';') 
cursor = conn.cursor()
AccessSize = cursor.execute('SELECT count(1) FROM '+ Name).fetchone()[0]
connection.close()

Это работает, и AccessSize дает мне целое число с числом строк в базе данных, однако это занимает слишком много времени для вычисления (моя база данных содержит более 2 миллионов строк и 15 столбцов).

Я попытался прочитать данные через pd.read_sql и использовал функциональность chunksize для l oop и продолжал считать длину каждого чанка, но это также занимает много времени. Я также попытался .fetchall в секции выполнения курсора, но скорость была похожа на .fetchone

Я бы подумал, что будет более быстрый метод для быстрого вычисления длины таблицы, поскольку я не требует, чтобы вся таблица была прочитана. Моя мысль состоит в том, чтобы найти значение индекса последней строки, поскольку это по сути количество строк, но я не уверен, как это сделать.

Спасибо

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020

От комментария к вопросу:

К сожалению, в базе данных нет подходящих ключей или индексов ни в одном из столбцов.

Тогда вы не сможете ожидайте хорошей производительности от базы данных, потому что каждый SELECT будет сканировать таблицу.

У меня есть база данных Access на сетевом ресурсе. Он содержит одну таблицу с 1 миллионом строк и абсолютно без индексов. Сам файл базы данных Access составляет 42 МБ. Когда я делаю

t0 = time()
df = pd.read_sql_query("SELECT COUNT(*) AS n FROM Table1", cnxn)
print(f'{time() - t0} seconds')

, это занимает 75 секунд и генерирует 45 МБ сетевого трафика c. Простое добавление первичного ключа в таблицу увеличивает размер файла до 48 МБ, но тот же код занимает 10 секунд и генерирует 7 МБ сетевого трафика c.

TL; DR: Добавить первичный ключ к или продолжать страдать от плохой работы.

0 голосов
/ 26 февраля 2020

2 миллиона не должны занимать так много времени. Я использую pd.read_ sql (con, sql), например:

con = connection
sql = """ my sql statement
here"""

table = pd.read_sql(sql=sql, con=con) 

Вы делаете что-то другое?

В моем случае я использую базу данных db2, возможно, поэтому быстрее.

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