Эффективный способ выполнить запрос выбора для миллионов данных - PullRequest
2 голосов
/ 08 апреля 2011

Я хочу выполнить различный запрос на выборку 100 миллионов раз, и у меня есть aprox. 1 миллион строк в таблице. Поэтому я ищу самый быстрый способ для выполнения всех этих запросов выбора.

До сих пор я пробовал три разных метода, и результаты были похожи.

Следующие три метода, конечно, не делают ничего полезного, но предназначены исключительно для сравнения производительности.

Первый метод:

for i in range (100000000):
    cur.execute("select id from testTable where name = 'aaa';")

второй метод:

cur.execute("""PREPARE selectPlan  AS
    SELECT id FROM testTable WHERE name = 'aaa' ;""")

for i in range (10000000):
    cur.execute("""EXECUTE selectPlan ;""")

третий метод:

def _data(n):
    cur = conn.cursor()
    for i in range (n):
    yield (i, 'test')

sql = """SELECT id FROM testTable WHERE name = 'aaa' ;"""   
cur.executemany(sql, _data(10000000))



And the table is created like this: 

cur.execute("""CREATE TABLE testTable ( id int, name varchar(1000) );""")
cur.execute("""CREATE INDEX indx_testTable ON testTable(name)""")

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

Ответы [ 3 ]

1 голос
/ 08 апреля 2011

Этот тип теста вряд ли даст какие-либо полезные данные, но второй метод должен быть самым быстрым, так как после подготовки оператора он сохраняется в памяти сервером базы данных.Дальнейшие вызовы для повторения запроса не требуют передачи текста запроса, поэтому экономия времени занимает немного времени.

Это может быть спорным, так как запрос очень мал (вероятно, такое же количествопакеты по сети повторяют отправку текста запроса), и кэш запроса будет обслуживать одни и те же данные для каждого запроса.

0 голосов
/ 08 апреля 2011

Если вы просто хотите сравнить все SQL самостоятельно и не смешивать Python с уравнением, попробуйте pgbench.

http://developer.postgresql.org/pgdocs/postgres/pgbench.html

И какова ваша цель здесь?

0 голосов
/ 08 апреля 2011

Какова цель получения такого количества данных одновременно? Я не знаю вашей ситуации, но я бы определенно пострадали результаты с использованием лимита и смещения. Взгляни на: 7,6. LIMIT и OFFSET

...