Перевод: CYBERTEC. Cила одного отсутствующего индекса

PostgreSQLКстати, а вы уже перевернули календарь?

Буквально на днях нашел вот такую статью: PostgreSQL: the power of a single missing index от CyberTec. Сначала подумал, что у меня что-то с форматированием текста в браузере стало, или даже в источнике косяк какой — всё по левому краю располагалось.

А потом пригляделся — и не смог устоять от перевода, который получился достаточно вольным, кое-какие огрехи в нем есть.

Индекс отсутствует?

Когда у вас индекса в базе нет
Быстрая работа не передаст привет
Пользователю Постгресa, эффективности ждущего
Желающего получить её как наследство насущное.

Чтобы удовлетворить жажду и желания ДБА
Загрузим немного данных в БД сначала, да?

Pgbench — инструмент такой все знают,
Следующие строки точнее всё объясняют:

[hs@fedora ~]$ pgbench -s 100 -i test
dropping old tables...
NOTICE: table "pgbench_accounts" does not exist, skipping
NOTICE: table "pgbench_branches" does not exist, skipping
NOTICE: table "pgbench_history" does not exist, skipping
NOTICE: table "pgbench_tellers" does not exist, skipping
creating tables...
generating data (client-side)...
10000000 of 10000000 tuples (100%) done (elapsed 9.96 s, remaining 0.00 s)
vacuuming...
creating primary keys...
done in 14.58 s (drop tables 0.00 s, create tables 0.07 s, client-side generate 10.03 s, vacuum 1.68 s, primary keys 2.80 s).

Загрузить миллионы строк в Postgres не сложно
Это простая часть, это всё можно.
На данные, которые так просто создавать
Можно особого внимания и не обращать.

10 секунд для 10 миллионов строк,
Ответственный администратор лучше б не смог.
Производительность будет хорошей,
Как настрой у пользователей — такой же.

Чтобы отпраздновать успех
Запустим БД и посмотрим на текст.

На этот раз мы ищем быстрое чтение,
От чего на высоких скоростях имеем важное впечатление:

[hs@fedora ~]$ pgbench -S -c 10 -T 30 -j 10 test
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: simple
number of clients: 10
number of threads: 10
duration: 30 s
number of transactions actually processed: 3054408
latency average = 0.098 ms
initial connection time = 13.872 ms
tps = 101859.582811 (without initial connection time)

Pgbench — это название данной игры.
101 тысяча транзакций, это мечты!
30 секунд для выполнения текущего теста,
10 подключений без отдыха и потери коннекта.
Даже 10 потоков для клиентского кода,
Работают сверхбыстро, эффективно и скоро.

Однако это всё благодаря индексам было
Которые привносят производительность и силу.
Без индексации жизнь сурова и люди грустят
Так же, когда оптимально shared_buffers настроить хотят.

Наш святой начальник, Сбалансированный Господин
Без него плохая производительность — это путь номер один.
Единственный отсутствующий индекс для теста,
И вся наша БД будет в состоянии протеста.

Вы хотите знать причину?
Обратимся к Господину:

test=# \d+
                                      List of relations
 Schema | Name             | Type  | Owner | Persistence | Access method | Size    | Description 
--------+------------------+-------+-------+-------------+---------------+---------+-------------
 public | pgbench_accounts | table | hs    | permanent   | heap          | 1281 MB | 
 public | pgbench_branches | table | hs    | permanent   | heap          | 40 kB   | 
 public | pgbench_history  | table | hs    | permanent   | heap          | 0 bytes | 
 public | pgbench_tellers  | table | hs    | permanent   | heap          | 80 kB   | 
(4 rows)
 
test=# \d pgbench_accounts
              Table "public.pgbench_accounts"
 Column   | Type          | Collation | Nullable | Default
----------+---------------+-----------+----------+---------
 aid      | integer       |           | not null | 
 bid      | integer       |           |          | 
 abalance | integer       |           |          | 
 filler   | character(84) |           |          | 
Indexes:
    "pgbench_accounts_pkey" PRIMARY KEY, btree (aid)

И наш единственный индекс убивая…
Скорость помашет крылом улетая:

test=# ALTER TABLE pgbench_accounts DROP CONSTRAINT pgbench_accounts_pkey;
ALTER TABLE
test=# \d pgbench_accounts
Table "public.pgbench_accounts"
 Column   | Type          | Collation | Nullable | Default
----------+---------------+-----------+----------+---------
 aid      | integer       |           | not null | 
 bid      | integer       |           |          | 
 abalance | integer       |           |          | 
 filler   | character(84) |           |          | 

Запустим наш тест еще один раз.
Хорошая производительность? Всё без прикрас!

О Боже? Что с моими текущими данными?
Вернется ли скорость, ой как желанная?

[hs@fedora ~]$ pgbench -S -c 10 -T 30 -j 10 test
pgbench (14beta2)
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 100
query mode: simple
number of clients: 10
number of threads: 10
duration: 30 s
number of transactions actually processed: 259
latency average = 1189.653 ms
initial connection time = 5.727 ms
tps = 8.405815 (without initial connection time)

Восемь транзакций в секунду покажет,
Что плохая производительность нас и накажет.
Если у нас один индекс сломают
Все пользователи ходят пешком, не летают.
Начинаем звонить в техподдержку всё чаще и чаще
Администраторы — в бой, углубляйтесь в постгресовые чащи!

Заключение

Какой же итоговый вывод мы сделали?
Убедитесь что присутствуют нужные индексы!
Это очень важный момент
Индексировать нужное — вот и ответ.
Не забывайте о больших и маленьких мелочах —
И производительность будет во всех БД и делах!

Надеюсь, мой стих сделает людей счастливыми.
И убедитесь, что ваши БД стали более быстрыми 🙂

Hans-Jürgen Schönig

Ханс-Юрген Шёниг (Hans-Jürgen Schönig)

Ханс-Юрген Шениг имеет опыт работы с PostgreSQL с 90-х годов. Он является генеральным директором и техническим руководителем компании CYBERTEC, которая является одним из лидеров рынка в этой области и с 2000 года обслуживает бесчисленное количество клиентов по всему миру.


Еще раз ссылка на оригинал.


Be the first to comment

Leave a Reply

Ваш Mail не будет опубликован.


*