LINUX.ORG.RU

Ответ на: комментарий от eternal_sorrow

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

steemandlinux ★★★★★
() автор топика
Ответ на: комментарий от steemandlinux

Настройки дефолтные

стандартная ошибка. дефолтные настройки постгри заточены на минимальное потребление ресурсов и не подходят для какой-либо реальной работы.

vtVitus ★★★★★
()
Ответ на: комментарий от theNamelessOne

Вот что он предложил:

# DB Version: 11
# OS Type: linux
# DB Type: oltp
# Total Memory (RAM): 32 GB
# CPUs num: 8
# Connections num: 50
# Data Storage: ssd

max_connections = 50
shared_buffers = 8GB
effective_cache_size = 24GB
maintenance_work_mem = 2GB
checkpoint_completion_target = 0.9
wal_buffers = 16MB
default_statistics_target = 100
random_page_cost = 1.1
effective_io_concurrency = 200
work_mem = 41943kB
min_wal_size = 2GB
max_wal_size = 4GB
max_worker_processes = 8
max_parallel_workers_per_gather = 4
max_parallel_workers = 8
steemandlinux ★★★★★
() автор топика
Последнее исправление: steemandlinux (всего исправлений: 1)
Ответ на: комментарий от Deleted

Никаких улучшений. Не понимаю почему RPostgreSQL в R гораздо быстрее.

steemandlinux ★★★★★
() автор топика

время вырастает до 0.25 сек

Время между чем и чем? Вы что именно тестируете?

anonymous
()
import psycopg2
conn = psycopg2.connect(dbname='data', user='postgres', password='...')
cur=conn.cursor()
cur.execute('CREATE TABLE IF NOT EXISTS users (user_id serial PRIMARY KEY, username VARCHAR(50) NOT NULL, email VARCHAR(355) UNIQUE NOT NULL)')			
conn.commit()
cur.execute('DELETE FROM users')
conn.commit()
for i in range(50000):
    cur.execute('insert into users (username, email) values (%(username)s, %(email)s)',
      {"username": 'balabldasblablabladblbalablablablablablabl{}'.format(i), "email": 'mialmiaolmialimalamalimailm@mailamalmalaiimliamilalmialmialim{}.com'.format(i) }
    )
conn.commit()

import timeit
def readrows(cur, number):
	cur.execute("SELECT username FROM users LIMIT {}".format(number))
	for row in cur:
		pass

for count in range(10000, 60000, 20000):
  print('readrows(cur, {}): {}'.format(
    count,
    timeit.timeit('readrows(cur, {})'.format(count), "from __main__ import cur, readrows", number=1)
    ) )
readrows(cur, 10000): 0.00844403600000021
readrows(cur, 30000): 0.018557535000000236
readrows(cur, 50000): 0.026785620000000065
>>> psycopg2.__version__
'2.8.3 (dt dec pq3 ext lo64)'
>>> conn.server_version
100010

ЧЯДНТ? Умолчательная конфигурация, пустая база на жестком диске.

byko3y ★★★★
()
Ответ на: комментарий от steemandlinux

Между LIMIT 10000 и LIMIT 30000

Время между LIMIT 10000 и LIMIT 30000 — это время за которое вы нажимаете enter на клавиатуре. Скорее всего вы не поняли мой вопрос.

Вам нужно измерить вот эти промежутки времени:

<A>
cur.execute("SELECT name FROM users LIMIT 10000")
<B>
for row in cur:
    pass
<C>

B - A = dt1

C - B = dt2

Сколько у вас dt1 и dt2 для LIMIT 10000 и сколько dt1 и dt2 при запуске с LIMIT 30000? Где расположен сервер и где клиент? Какой объём памяти на клиенте? Какой размер у поля name в среднем (SELECT avg(octet_length(name)) FROM users)? Какой размер переданных данных? Есть ли параллельная нагрузка на базу в момент выполнения ваших запросов?

anonymous
()
Ответ на: комментарий от anonymous

dt1 = 0.001

dt2 = 0.02 и 0.25 соответственно.

поле там не VARCHAR, а DECIMAL.

steemandlinux ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.