Index yogwiritsidwa ntchito onjezerani ndi magawo osiyanasiyana.
Chitsanzo:
CREATE TABLE tbl AS
SELECT
generate_series(1, 100000) pk -- 100K "фактов"
, (random() * 1000)::integer fk_cli; -- 1K разных внешних ключей
CREATE INDEX ON tbl(fk_cli); -- индекс для foreign key
SELECT
*
FROM
tbl
WHERE
fk_cli = 1 -- отбор по конкретной связи
ORDER BY
pk DESC -- хотим всего одну "последнюю" запись
LIMIT 1;
Ngakhale pachitsanzo choyambirira chotere - Nthawi 8.5 mwachangu komanso kuwerengeka kochepera 33. Mukakhala ndi "zowona" zambiri pa mtengo uliwonse, zotsatira zake zimakhala zoonekeratu fk.
Ndikuwona kuti index yotereyi imagwira ntchito ngati "prefix" index osati yoyipa kuposa kale pamafunso ena fk, kumene kusankha pk panalibe ndipo palibe (mutha kuwerenga zambiri za izi m'nkhani yanga yokhudza kupeza ma index osagwira ntchito). Kuphatikiza, ipereka zabwinobwino kuthandizira makiyi akunja pamunda uwu.
#2: mphambano ya index (BitmapAnd)
Pamene kutero
Onetsani mapangano onse kwa kasitomala "LLC Kolokolchik", anamaliza m'malo mwa "NAO Buttercup".
Momwe mungadziwire
-> BitmapAnd
-> Bitmap Index Scan
-> Bitmap Index Scan
ayamikira
kulenga composite index ndi minda kuchokera ku zonse zoyambirira kapena kukulitsa imodzi mwazomwe zilipo ndi minda kuchokera pachiwiri.
Chitsanzo:
CREATE TABLE tbl AS
SELECT
generate_series(1, 100000) pk -- 100K "фактов"
, (random() * 100)::integer fk_org -- 100 разных внешних ключей
, (random() * 1000)::integer fk_cli; -- 1K разных внешних ключей
CREATE INDEX ON tbl(fk_org); -- индекс для foreign key
CREATE INDEX ON tbl(fk_cli); -- индекс для foreign key
SELECT
*
FROM
tbl
WHERE
(fk_org, fk_cli) = (1, 999); -- отбор по конкретной паре
-> BitmapOr
-> Bitmap Index Scan
-> Bitmap Index Scan
ayamikira
Gwiritsani ntchito UNION [ONSE] kuphatikiza ma subqueries amtundu uliwonse wa OR-blocks.
Chitsanzo:
CREATE TABLE tbl AS
SELECT
generate_series(1, 100000) pk -- 100K "фактов"
, CASE
WHEN random() < 1::real/16 THEN NULL -- с вероятностью 1:16 запись "ничья"
ELSE (random() * 100)::integer -- 100 разных внешних ключей
END fk_own;
CREATE INDEX ON tbl(fk_own, pk); -- индекс с "вроде как подходящей" сортировкой
SELECT
*
FROM
tbl
WHERE
fk_own = 1 OR -- свои
fk_own IS NULL -- ... или "ничьи"
ORDER BY
pk
, (fk_own = 1) DESC -- сначала "свои"
LIMIT 20;
(
SELECT
*
FROM
tbl
WHERE
fk_own = 1 -- сначала "свои" 20
ORDER BY
pk
LIMIT 20
)
UNION ALL
(
SELECT
*
FROM
tbl
WHERE
fk_own IS NULL -- потом "ничьи" 20
ORDER BY
pk
LIMIT 20
)
LIMIT 20; -- но всего - 20, больше и не надо
“Ndipo mulibe yemweyo, koma ndi mabatani amayi-wa-ngale? " filimu "The Diamond Arm"
Mwachitsanzo, posintha ntchito yomwe ili pamwambapa, wonetsani zopempha 20 zoyambirira "zofunikira" zokonzedwa, mosasamala kanthu za cholinga chake.
Momwe mungadziwire
-> Seq Scan | Bitmap Heap Scan | Index [Only] Scan [Backward]
&& 5 × rows < RRbF -- отфильтровано >80% прочитанного
&& loops × RRbF > 100 -- и при этом больше 100 записей суммарно
ayamikira
Pangani [zambiri] zapadera index yokhala ndi WHERE kapena phatikizani magawo owonjezera mu index.
Ngati zosefera zili "static" pazolinga zanu - ndiye sizikutanthauza kukulitsa mndandanda wa mfundo za m'tsogolo - ndi bwino ntchito WHERE index. Mitundu yosiyanasiyana ya boolean/enum ikugwirizana bwino ndi gululi.
Ngati sefa chikhalidwe akhoza kukhala ndi matanthauzo osiyanasiyana, ndiye kuti ndi bwino kukulitsa ndondomekoyi ndi minda iyi - monga momwe zilili ndi BitmapAnd pamwamba.
Chitsanzo:
CREATE TABLE tbl AS
SELECT
generate_series(1, 100000) pk -- 100K "фактов"
, CASE
WHEN random() < 1::real/16 THEN NULL
ELSE (random() * 100)::integer -- 100 разных внешних ключей
END fk_own
, (random() < 1::real/50) critical; -- 1:50, что заявка "критичная"
CREATE INDEX ON tbl(pk);
CREATE INDEX ON tbl(fk_own, pk);
SELECT
*
FROM
tbl
WHERE
critical
ORDER BY
pk
LIMIT 20;
-> Index [Only] Scan [Backward]
&& loops × (rows + RRbF) < (shared hit + shared read) × 8
-- прочитано больше 1KB на каждую запись
&& shared hit + shared read > 64
ayamikira
Yang'anani mozama pamapangidwe a index yomwe yagwiritsidwa ntchito komanso magawo ofunikira omwe akufunsidwa - mwina gawo la index silinakhazikitsidwe. Nthawi zambiri muyenera kupanga index yofananira, koma popanda minda yachiyambi kapena phunzirani kubwereza mfundo zawo.
Chitsanzo:
CREATE TABLE tbl AS
SELECT
generate_series(1, 100000) pk -- 100K "фактов"
, (random() * 100)::integer fk_org -- 100 разных внешних ключей
, (random() * 1000)::integer fk_cli; -- 1K разных внешних ключей
CREATE INDEX ON tbl(fk_org, fk_cli); -- все почти как в #2
-- только вот отдельный индекс по fk_cli мы уже посчитали лишним и удалили
SELECT
*
FROM
tbl
WHERE
fk_cli = 999 -- а fk_org не задано, хотя стоит в индексе раньше
LIMIT 20;
Chilichonse chikuwoneka bwino, ngakhale molingana ndi ndondomekoyi, koma ndizokayikitsa - pa zolemba 20 zomwe zawerengedwa, tinayenera kuchotsa masamba 4 a deta, 32KB pa mbiri iliyonse - sicholimba mtima? Ndipo index name tbl_fk_org_fk_cli_idx zopatsa chidwi.
Panali kudikirira loko komwe kunaperekedwa ndi pempho lopikisana, kapena panalibe zida zokwanira za CPU/hypervisor hardware.
Momwe mungadziwire
-> *
&& (shared hit / 8K) + (shared read / 1K) < time / 1000
-- RAM hit = 64MB/s, HDD read = 8MB/s
&& time > 100ms -- читали мало, но слишком долго
ayamikira
Gwiritsani ntchito zakunja dongosolo lowunika seva yotsekereza kapena kugwiritsa ntchito zinthu molakwika. Talankhula kale za mtundu wathu wokonzekera njirayi kwa ma seva mazana apa и apa.