LINUX.ORG.RU

Книга «Работа с Postgresql: настройка, масштабирование», версия 2

 ,


1

4

Вышла обновлённая редакция книги «Работа с Postgresql: настройка, масштабирование». В книге исследуются вопросы по настройке производительности Postgresql, репликации и кластеризации. Изобилие реальных примеров позволит как начинающим, так и опытным разработчикам быстро разобраться с особенностями масштабирования Postgresql для своих приложений. Версия книги 2.0.0 beta. Пока что только сконвертирован pdf. Все правки и замечания автор просит указывать на этой странице - https://github.com/le0pard/postgresql...

Книга доступна в электронном виде под лицензией CC-BY-NC.

>>> Страничка книги



Проверено: anonymous_incognito ()
Последнее исправление: Aceler (всего исправлений: 1)

спасибки. будем почитать

anonymous
()

Первая версия была очень неплохая. Только по объему ближе к статье а не к книге.

jj1111
()

Это отличная новость, товарищи! Первая версия была хороша.

anonymous
()

Что же это такое, «scheta», «uplocheno»...

mashina ★★★★★
()

спасибо за труд и то что не бросаете такое неблагодарное занятие, первая версия была хороша.

real_maverick ★★★
()

решпект!
почитаю на трезвую голову.

iMp ★★★
()

а можно на «страничке книги» html.zip как-нибудь оригинальнее назвать, и чтоб содержимое в отдельной директории, а не в корне было?

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

Не внимательный вы. Там же написано [quote] Prefix реализует поиск текста по префиксу (prefix @> text). Чем это лучше «LIKE prefix\%»? Наличием GiST индекса для более быстрого поиска (тоесть, ваш автокомплит для поля будет очень быстрый). [/quote]

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

>GiST быстрее будет чем btree?

gist включает, но не ограничивается btree

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

Давайте проверим

Создадим таблицу с префиксом

prefix_test=# create table prefixes ( prefix_test(# prefix prefix_range primary key, prefix_test(# name text not null, prefix_test(# shortname text, prefix_test(# status char default 'S', prefix_test(# prefix_test(# check( status in ('S', 'R') ) prefix_test(# ); NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index «prefixes_pkey» for table «prefixes» CREATE TABLE prefix_test=# create index idx_prefix on prefixes using gist(prefix); CREATE INDEX

Создадим таблицу без префикса

prefix_test=# create table non_prefixes ( prefix_test(# prefix text primary key, prefix_test(# name text not null, prefix_test(# shortname text, prefix_test(# status char default 'S', prefix_test(# prefix_test(# check( status in ('S', 'R') ) prefix_test(# ); NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index «non_prefixes_pkey» for table «non_prefixes» CREATE TABLE prefix_test=# CREATE INDEX i_non_prefix ON non_prefixes USING btree(lower(prefix) text_pattern_ops); CREATE INDEX

Заполним идентичными данными

prefix_test=# select count(*) from non_prefixes; count ------- 11966 (1 row)

prefix_test=# select count(*) from prefixes; count ------- 11966 (1 row)

Проверим

prefix_test=# EXPLAIN ANALYZE select * from prefixes where prefix @> '0146'; QUERY PLAN -------------------------------------------------------------------------------------------------------------------- Bitmap Heap Scan on prefixes (cost=4.35..39.77 rows=12 width=33) (actual time=0.585..0.611 rows=1 loops=1) Recheck Cond: (prefix @> '0146'::prefix_range) -> Bitmap Index Scan on idx_prefix (cost=0.00..4.34 rows=12 width=0) (actual time=0.518..0.518 rows=1 loops=1) Index Cond: (prefix @> '0146'::prefix_range) Total runtime: 0.787 ms (5 rows)

prefix_test=# EXPLAIN ANALYZE select * from prefixes where prefix @> '0146'; QUERY PLAN -------------------------------------------------------------------------------------------------------------------- Bitmap Heap Scan on prefixes (cost=4.35..39.77 rows=12 width=33) (actual time=0.860..0.870 rows=1 loops=1) Recheck Cond: (prefix @> '0146'::prefix_range) -> Bitmap Index Scan on idx_prefix (cost=0.00..4.34 rows=12 width=0) (actual time=0.813..0.813 rows=1 loops=1) Index Cond: (prefix @> '0146'::prefix_range) Total runtime: 1.137 ms (5 rows)

prefix_test=# EXPLAIN ANALYZE select * from non_prefixes where prefix LIKE '0146%'; QUERY PLAN ------------------------------------------------------------------------------------------------------------ Seq Scan on non_prefixes (cost=0.00..235.58 rows=121 width=26) (actual time=0.267..10.786 rows=1 loops=1) Filter: (prefix ~~ '0146%'::text) Total runtime: 11.540 ms (3 rows)

prefix_test=# EXPLAIN ANALYZE select * from non_prefixes where prefix LIKE '0146%'; QUERY PLAN ------------------------------------------------------------------------------------------------------------ Seq Scan on non_prefixes (cost=0.00..235.58 rows=121 width=26) (actual time=0.201..11.584 rows=1 loops=1) Filter: (prefix ~~ '0146%'::text) Total runtime: 11.639 ms (3 rows)

И напоследок

prefix_test=# select a, b, a <= b as «<=», a < b as «<», a = b as «=», a <> b as «<>», a >= b as «>=», a > b as «>», a @> b as «@>», a <@ b as «<@», a && b as «&&» from (select a::prefix_range, b::prefix_range from (values('123', '123'), ('123', '124'), ('123', '123[4-5]'), ('123[4-5]', '123[2-7]'), ('123', '[2-3]')) as t(a, b) ) as x; a | b | <= | < | = | <> | >= | > | @> | <@ | && ----------+----------+----+---+---+----+----+---+----+----+---- 123 | 123 | t | f | t | f | t | f | t | t | t 123 | 124 | t | t | f | t | f | f | f | f | f 123 | 123[4-5] | t | t | f | t | f | f | t | f | t 123[4-5] | 123[2-7] | f | f | f | t | t | t | f | t | t 123 | [2-3] | t | t | f | t | f | f | f | f | f (5 rows)

prefix_test=# select a, b, a | b as union, a & b as intersect prefix_test-# from (select a::prefix_range, b::prefix_range prefix_test(# from (values('123', '123'), prefix_test(# ('123', '124'), prefix_test(# ('123', '123[4-5]'), prefix_test(# ('123[4-5]', '123[2-7]'), prefix_test(# ('123', '[2-3]')) as t(a, b) prefix_test(# ) as x; a | b | union | intersect ----------+----------+----------+----------- 123 | 123 | 123 | 123 123 | 124 | 12[3-4] | 123 | 123[4-5] | 123 | 123 123[4-5] | 123[2-7] | 123[2-7] | 123[4-5] 123 | [2-3] | [1-3] | (5 rows)

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

Форматирование слетело к черту, но надеюсь все понятно.

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

Ошибка в тестировании. Вот правильно!

С префиксом
[code]
prefix_test=# EXPLAIN ANALYZE select * from prefixes where prefix @> '0146';
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------
Bitmap Heap Scan on prefixes (cost=4.35..39.77 rows=12 width=33) (actual time=0.162..0.163 rows=1 loops=1)
Recheck Cond: (prefix @> '0146'::prefix_range)
-> Bitmap Index Scan on idx_prefix (cost=0.00..4.34 rows=12 width=0) (actual time=0.158..0.158 rows=1 loops=1)
Index Cond: (prefix @> '0146'::prefix_range)
Total runtime: 0.212 ms
(5 rows)

prefix_test=# EXPLAIN ANALYZE select * from prefixes where prefix @> '0146';
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------
Bitmap Heap Scan on prefixes (cost=4.35..39.77 rows=12 width=33) (actual time=0.188..0.189 rows=1 loops=1)
Recheck Cond: (prefix @> '0146'::prefix_range)
-> Bitmap Index Scan on idx_prefix (cost=0.00..4.34 rows=12 width=0) (actual time=0.182..0.182 rows=1 loops=1)
Index Cond: (prefix @> '0146'::prefix_range)
Total runtime: 0.220 ms
(5 rows)
[/code]


Без префикса
[code]
prefix_test=# EXPLAIN ANALYZE select * from non_prefixes where lower(prefix) LIKE lower('0146%');
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------
Bitmap Heap Scan on non_prefixes (cost=5.49..97.75 rows=121 width=26) (actual time=0.053..0.056 rows=1 loops=1)
Filter: (lower(prefix) ~~ '0146%'::text)
-> Bitmap Index Scan on i_non_prefix (cost=0.00..5.46 rows=120 width=0) (actual time=0.032..0.032 rows=1 loops=1)
Index Cond: ((lower(prefix) ~>=~ '0146'::text) AND (lower(prefix) ~<~ '0147'::text))
Total runtime: 0.380 ms
(5 rows)

prefix_test=# EXPLAIN ANALYZE select * from non_prefixes where lower(prefix) LIKE lower('0146%');
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------
Bitmap Heap Scan on non_prefixes (cost=5.49..97.75 rows=121 width=26) (actual time=0.226..0.253 rows=1 loops=1)
Filter: (lower(prefix) ~~ '0146%'::text)
-> Bitmap Index Scan on i_non_prefix (cost=0.00..5.46 rows=120 width=0) (actual time=0.141..0.141 rows=1 loops=1)
Index Cond: ((lower(prefix) ~>=~ '0146'::text) AND (lower(prefix) ~<~ '0147'::text))
Total runtime: 0.736 ms
(5 rows)

prefix_test=# EXPLAIN ANALYZE select * from non_prefixes where lower(prefix) LIKE lower('0146%');
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------
Bitmap Heap Scan on non_prefixes (cost=5.49..97.75 rows=121 width=26) (actual time=0.052..0.054 rows=1 loops=1)
Filter: (lower(prefix) ~~ '0146%'::text)
-> Bitmap Index Scan on i_non_prefix (cost=0.00..5.46 rows=120 width=0) (actual time=0.031..0.031 rows=1 loops=1)
Index Cond: ((lower(prefix) ~>=~ '0146'::text) AND (lower(prefix) ~<~ '0147'::text))
Total runtime: 0.121 ms
(5 rows)

prefix_test=# EXPLAIN ANALYZE select * from non_prefixes where lower(prefix) LIKE lower('0146%');
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------
Bitmap Heap Scan on non_prefixes (cost=5.49..97.75 rows=121 width=26) (actual time=0.053..0.055 rows=1 loops=1)
Filter: (lower(prefix) ~~ '0146%'::text)
-> Bitmap Index Scan on i_non_prefix (cost=0.00..5.46 rows=120 width=0) (actual time=0.032..0.032 rows=1 loops=1)
Index Cond: ((lower(prefix) ~>=~ '0146'::text) AND (lower(prefix) ~<~ '0147'::text))
Total runtime: 0.119 ms
(5 rows)
[/code]

le0pard
() автор топика

Респектище переводчику! Огромадное спасибо!

k0valenk0_igor ★★★
()

Вот что значит хорошая новость, никто не обратил внимания на грамматические ошибки ;)

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

Теперь всё ясно, prefix реализует классификацию слова про префиксам (по типам prefix_range), а не только поиск текста по префиксу. Операции «prefix @> '0146'» и «prefix LIKE '0146%'» не эквиаленты (преобразование регистра опустил для простоты).

Для последнего эквивалент будет с оператором <@, или для @> эквивалент через LIKE как «'some_text' LIKE prefix || '%'», что в PG с индексами сделать нельзя (в отличие от <@, через varchar_pattern_op).

mashina ★★★★★
()

а ченджлог где-нибудь можно почитать?

anonymous
()

Молодец, так держать!

cab ★★★★
()

Что-то про встроенную репликацию не написано.

В целом книга похожа на копиляцию официальной документации в очень сокращённом виде.

qqqq ★★
()

Спасибо! Читал предыдущую - очень полезная книженция!

seriyPS
()

Нет аккаунта на гитхабе, поэтому багрепорт здесь (по pdf-версии):

На девятой странице предпоследний абзац (В версии 8.1...) - после запятой синтаксический мусор, распарсить не удалось.

Глава 3: перечитай всё. Часть текста писал хохол без буквы «ы» на клавиатуре. Тонкости:
Страница 30: "...или системы личных сообщений... впрочем понятно." - запятая после «впрочем».
Страница 31: «* Партиционирование по списку значений (list)» - после тире не согласованные падежи. А со следующей строки был хохол. И «достаточно выполните cледующие действия». «Так же не нужно cтавить...» - первый пробел лишний. «дублироватся» - http://tsya.ru. Дальше «пересекатся» - http://tsya.ru. «Listing 3.1...» - опечатка в слове «задания». «поскольку не понятно какой партиции...» - пропущена запятая. «для перенаправления данных с <<мастер>> таблици...» - хохол в последнем слове. Последнее слово на этой странице - опечатка (видимо, не хватает буквы «м» перед точкой).

Страница 32: «И вот, когда таблица уже с миллионами, ...» - лучше перефразировать, например «когда в таблице уже миллионы, ...» В конце страницы опять «таблици».

Это для начала.

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