ááá¯ááºáá¶áá
áºááŸááºážááŸá á¡áá±á¬ááºážáá¯á¶ážáá»á¬ážá០áááºáá±áá»á¬ áá±á¬ááºáá±á«ááºážáá»á¬ážá
áœá¬ ááŸááºáááºážáááºáá²á·áááºá
ááá¯á·ááŒá±á¬áá·áºá áá»áœááºá¯ááºááá¯á·á áááºáá±á¬ááºááŸá¯á¡áá»á¬ážáá¯á¶ážáá±áá¬áá±á·á
áºáá
áºáá¯ááŸá âáá±ážáá¶áá±á¬â áá±ážááœááºážáá»á¬ážááᯠáá
áºáááºááŒááºáááºáááºážá
á
áºááŒááºážááẠá¡á¶á·ááŒá
áá¬ááá¯ááºáá±á
ááá¯á·á¡ááŒáẠáá±á¬ááºáááºá á¯á¶á ááºážá á áºáá±ážááŸá¯áá»á¬ážá á áááºáááºá á¬ážá áá¬áá±á¬ááºážááá·áº á¥ááá¬áá áºáá¯ááᯠááŒááá²á·áááºá ááááŠážá áœá¬ optimization ááŒá®ážáá±á¬ááºá áœááºážáá±á¬ááºáááºáá»áááºážááŒááºážá á¡ááœá²á·áá»á¬ážá áœá¬á ááá·áºáá²ááŒááºáááºááŸá¯ááŒáá·áº áá±á¬ááºážááá¯áá»ááºáá áºáá¯á á®ááẠá¡áá±á¬ááºážáá¯á¶ážáááºááœááºáá»ááºáá»á¬ážááŒáá·áº áá¯ááºáá±á¬ááºáá²á·ááŒáááºá
0- áá¯á¶ážá áœá²áá°á áá¬ááá¯áá»ááºáá¬áá²á
[KDPV
á¡áá¯á¶ážááŒá¯áá°áá
áºáŠážááẠ"á¡ááŒááº" á¡áááºááŒáá·áºááŸá¬ááœá±ááŒááºážá¡ááŒá±á¬ááºážááŒá±á¬áá±á¬á¡áá«ááœááºáá¬ááá¯ááá¯ááá¯ááááºážá áááºážááẠáá²á·ááá¯á·áá±á¬ á
á¬ááŒá±á¬ááºážááœá²áá»á¬ážá¡ááœáẠ"ááá¯ážáá¬áž" ááŸá¬ááœá±ááŸá¯á¡ááŒá
Ạáááºáá±á¬á·á០ááŒá
áºáá¬áááºááá¯ááºáá±á ... LIKE '%ÑПза%'
á¡áááºááŒá±á¬áá·áºááá¯áá±á¬áºááá¯á·áá±á¬ááºááááºááá¬áá«áááºáááºá 'РПзалОÑ'
О 'ÐагазОМ РПза'
áá«áá±áá²á· 'ÐÑПза'
ááẠ'ÐПЌ ÐеЎа ÐПÑПза'
.
á¡áá¯á¶ážááŒá¯áá°á áááºáá°á·ááᯠáá±ážáá±á¬ááºááá·áº áá±á·á
ááºá¡ááá·áºááŸá¬ áá°ááááºá á
áá¬ážáá¯á¶ážáá¡á
ááŒáá·áºááŸá¬ááœá±áá«á áá±á«ááºážá
ááºáá²á· á¡á²áá«ááᯠááá¯áááºááá¯ááºá¡á±á¬ááºáá¯ááºáá«á ááœááºá
áááºáááºá áááºáá²á·áááºá ááá»ááá»ááá¯ááá¯á·ááŒá¯áááá·áºáááºá áá»ááºáá»ááºážáá®ážáá«áž - interlinear ááá·áºááœááºážááŸá¯á¡ááœááºá
1- áá¯ááºáááºážáá¬áááºááᯠááá·áºáááºáá«á
ááá¯á·áááºááá¯áááẠáá°áá
áºáŠážááẠá¡ááá¡áá» áááºáááºááá¯ááºáá«á 'ÑПз Ќагаз'
ááá¯á·ááŒá±á¬áá·áº áááºááẠá
áá¬ážáá¯á¶ážáá
áºáá¯á¶ážá
á®ááᯠááŸá±á·áááºááŒáá·áº ááŸá¬ááœá±ááááºááŒá
áºáááºá ááá¯ááºáá°ážá ááááºá
áá¬ážáá¯á¶ážááœá±ááᯠáááºááœááºáá»ááºááŸáááŸá âá¡á±á¬ááºáá±á¬áºááŒáá«â áá¯ááºááá¯á·ááẠá¡áá¯á¶ážááŒá¯áá°áá
áºáá±á¬ááºá¡ááœáẠá¡ááŒááºá¡ááááºá¡ááŒáœááºááᯠáá¯á¶á·ááŒááºááá¯á·á ááá¯ááœááºáá«ááẠ- ááŸá¬ááœá±áá±ážá¡ááºáá»ááºá áá«ááᯠáááºááá¯ááá¯ááºááœááºááá²ááá¯áá¬ááᯠááŒáá·áºáá«á
áá±áá¯áá»á¡á¬ážááŒáá·áº, ááŸááºáááºá
áœá¬ ááŒá¿áá¬á¡ááœáẠááá¯á¡ááºáá»ááºáá»á¬ážááᯠáá¯á¶áá±á¬áºááŒááºážááẠááŒá±ááŸááºážáá»ááºáááºáááºáá»á±á¬áºááŒá
áºáááºá ááá«ááá¶ááŸá¬ ááŒá
áºáááºááŸááºááᯠááœá²ááŒááºážá
áááºááŒá¬ááŒá®áž ááááá¬ážáá«á
Abstract Developer á áá¬áá¯ááºááá²á
1.0: ááŒááºáááŸá¬ááœá±áá±ážá¡ááºáá»ááº
á¡áá¯ážá ááŸá¬ááœá±áá±ážá áááºáááºá áá« áá¬á០ááá¯ááºáá»ááºáá°áž - devops ááœá±ááᯠáá±ážááá¯ááºáá¡á±á¬ááºá áá±áá¬áá±á·á áºááá¯á· ááŸá¬ááœá±áá±ážá¡ááºáá»ááºááᯠááŒááºáááá¯á· ááŒáá·áºáá»ááºá á±áá«- Sphinxá ElasticSearchá...
áááºáá°ááŒá¯ááŒááºážááŸáá·áº á¡ááŒá±á¬ááºážá¡áá²áá»á¬ážá á¡ááŸáááºá¡áá¯ááºá¡á á¡áá¯ááºááá¬áž-á¡áá±ážáá±ážáá±á¬áºáááºáž á¡áá¯ááºááœá±ážáá»ááºááŸá¯áá
áºáá¯á ááá¯á·áá±á¬áºá áá»áœááºá¯ááºááá¯á·áááá
á¹á
ááá¯ááºáá«á áá±á¬ááºáááºáá
áºáŠážá
á®á¡ááœáẠáá°áá¡áá±á¬áá·áºáá±áá¬áá±á¬ááºá¡ááœááºážááœááºáᬠááŸá¬ááœá±ááŸá¯ááᯠáá¯ááºáá±á¬ááºáá±á¬ááŒá±á¬áá·áºááŒá
áºáááºá ááŒá®ážáá±á¬á· áá±áá¬á á¡áá±á¬áºáá±áž ááœá²ááŒá¬ážááŸá¯ ááŸáááŒá®áž áááºáá±áá»á¬á á¡áᯠáááºáá²ááᯠáááºááœá¬ážáááºááá¯ááẠ'ÐагазОМ РПза'
ááá¯á·áá±á¬áẠ5-10 á
áá¹ááá·áºááŒá¬ááŒá®ážáá±á¬áẠáá°ááẠáá°á·á¡á®ážáá±ážááºááᯠááœáŸááºáááºáá±á·ááœá¬ážáᬠáááºážááá¯ááŸá¬ááœá±ááŒá®áž ááŒááºáá±ážáá»ááºááŒá±á¬ááºáž áááááá±ááŒá®ááŒá
áºáááºá
ááá¯á·ááŒá±á¬áá·áº - ááŒáá«á áá¯á· "áá±áá¬áá±á·á áºááœááºááá¯ááºááá¯ááº" ááŸá¬ááœá±áá«. áá¶áá±á¬ááºážáá±á¬ááºáá áœá¬á PostgreSQL ááẠáá»áœááºá¯ááºááá¯á·á¡á¬áž á€á¡áá¬ááᯠáá¯ááºáá±á¬ááºááẠááœáá·áºááŒá¯áá¬ážááŒá®áž ááœá±ážáá»ááºá áá¬áá áºáá¯áá»áŸáá¬ááá¯áẠ- áááºážááá¯á·ááᯠááŒáá·áºááŸá¯áá«áááºá
1.1: "ááá¯ážáá¬áž" á¡ááá¯ááºážááœá²
áá»áœááºá¯ááºááá¯á·ááẠâsubstringâ áá°áá±á¬ á
áá¬ážáá¯á¶ážááᯠá
áœá²ááá¯ááºáá¬ážáááºá ááá¯á·áá±á¬áº á
á¬áááºážááœá²áá»á¬ážááŒáá·áº á¡ááœáŸááºážááŸá¬ááœá±ááŒááºážá¡ááœáẠ(áá¯á¶ááŸááºá¡áá¯á¶ážá¡ááŸá¯ááºážáá»á¬ážááŒáá·áºáááº) á¡ááœááºáá±á¬ááºážááœááºáá«áááºá
áá±á¬áºáááºááᯠááá¯ážááŸááºážá á±ááẠá¡á±á¬ááºáá«áááºážáááºááŒá¬ážááᯠáá°ááá¯ááºáá¡á±á¬ááºá
CREATE TABLE firms(
id
serial
PRIMARY KEY
, name
text
);
á¡á á áºá¡ááŸááºá¡ááœá²á·á¡á ááºážáá»á¬ážá ááŸááºáááºážáá±á«ááºáž 7.8 áááºážááᯠááá¯áá±áá¬ááœáẠá¡ááºáá¯ááºáá¯ááºáᬠáááºážááá¯á·ááᯠá¡ááœáŸááºážááŒá¯áá«áááºá
CREATE EXTENSION pg_trgm;
CREATE INDEX ON firms USING gin(lower(name) gin_trgm_ops);
interlinear ááŸá¬ááœá±ááŸá¯á¡ááœáẠááááá¯á¶áž ááŸááºáááºáž áá áá¯ááᯠááŸá¬ááŒáá·áºáá¡á±á¬ááºá
SELECT
*
FROM
firms
WHERE
lower(name) ~ ('(^|s)' || 'ÑПза')
ORDER BY
lower(name) ~ ('^' || 'ÑПза') DESC -- ÑМаÑала "МаÑОМаÑÑОеÑÑ ÐœÐ°"
, lower(name) -- ПÑÑалÑМПе пП алÑавОÑÑ
LIMIT 10;
á¡ááºáž á¡á²áá«... 26msá 31MB ááŸá¬ááœá±áá¬ážáá±á¬ 1.7 áá¯á¡ááœáẠáá±áá¬ááŸáá·áº 10K áá»á±á¬áº á á áºáá¯ááºáá¬ážáá±á¬ ááŸááºáááºážáá»á¬áž áááºáá«á á ááááºá áááœá±á á¡áááºážáá»á¬ážáá±áááºá ââááá¯áááá±á¬ááºáá²á· á¡áá¬áááŸááá°ážáá¬ážá
1.2- á á¬áá¬ážááŒáá·áº ááŸá¬ááœá±ááá¬ážá FTS áá«á
á¡ááŸááºááŸá¬á PostgreSQL ááẠá¡ááœááºá¡á
áœááºážáááºáááºá
CREATE INDEX ON firms USING gin(to_tsvector('simple'::regconfig, lower(name)));
SELECT
*
FROM
firms
WHERE
to_tsvector('simple'::regconfig, lower(name)) @@ to_tsquery('simple', 'ÑПза:*')
ORDER BY
lower(name) ~ ('^' || 'ÑПза') DESC
, lower(name)
LIMIT 10;
á€áá±áá¬ááœáẠquery execution ááᯠáá»ááºážááŒáá¯ááºááá¯ááºááŒááºážá áá»áœááºá¯ááºááá¯á·ááᯠá¡áááºážáááºáá°áá®áá±ážáá²á·ááŒá®áž á¡áá»áááºááᯠáá áºáááºááŒááºáá±á¬ááºáá²á·áááºá 11ms. á á¯á á¯áá±á«ááºáž 1.5 á ááá¯áááºážá¡á±á¬áẠáááºááááºá 20MB. ááá¯á·áá±á¬áº á€ááœááºá áá»áœááºá¯ááºááá¯á·áááºááŸá¯ááá·áº ááá¬á ááŒá®ážáá¬ážáá±áá±á á¡ááŒá±á¬ááºážááŸá¬ áá»áœááºá¯ááºááá¯á·áááºááá·áº ááá¬á ááŒá®ážáá¬ážáá±á áááºááŸáºáá áºáá¯ááœááºááœá¬ážááá¯ááºááá·áº á¡ááœáá·áºá¡áááºáž ááá¯áá»á¬ážáá±áá±á áá áºááºá០áááºáááá·áº á¡ááá¯á á¬áá»ááºááŸá¬ááá¯ááºážááẠáá±á¬ááºážááá¯áá»ááºá¡ááœáẠá¡áá¬ážá¡áá¬ááŸááá±á¬ âáááááºáá»á¬ážâ ááŒá áºáááºá
1.3- LIKE ááŸááá±ážáá¬ážá
ááááºáá±á¬ááºážááá¯áá»ááºááẠáá°ááá¯ááºážá¡ááœáẠáá±á¬ááºážááœááºáá±á¬áºáááºáž áá áºáá±á·áá»áŸáẠá¡ááŒáááºáá áºááááºáž ááœá²áá¯ááºááŸáᬠáááŸááááºááŒá áºáááºá 2TB data ááá¯áááºáá«á á¡áá±á¬ááºážáá¯á¶ážá¡ááŒá±á¡áá±ááœááºá ááŸááºáá¬ááºááŸáá±á¬áºáááºážáá±á¬ááºáž á¡áááºá áááºáá¶ááá±á¬ááºážáá«áá ááá¯á·áá±á¬áẠdisk ááŸááŒá áºáááºá áá®áá±á¬á· áá±ážáááºá¡á±á¬áẠááŒáá¯ážá á¬ážááŒáá·áºáá¡á±á¬ááºá
á¡áá¯á¶ážááŒá¯áá°ááŒááºáá»ááºáá±á¬á¡áá¬ááᯠááŸááºáá¬ážááŒáá«á
áá¯á· ááááá¯á¶áž "áááºáá
áá²". áá«ááŒá±á¬áá·áº áá«á áá°á·áá²á· á¡ááá·áºááŸááºážáá¯á¶ážáá¯á¶á
á¶áá«á text_pattern_ops
! áá»áœááºá¯ááºááá¯á· ááŸá¬ááœá±áá±ááá·áº ááŸááºáááºáž áá áá¯á¡áá âááá¯á¶áá±á¬ááºâ áá«á FTS ááŸá¬ááœá±ááŸá¯ááᯠá¡áá¯á¶ážááŒá¯á áááºážááá¯á·ááᯠá¡ááŒá®ážáááºáááºááŸá¯ááááºááŒá
áºáá«áááºá
CREATE INDEX ON firms(lower(name) text_pattern_ops);
SELECT
*
FROM
firms
WHERE
lower(name) LIKE ('ÑПза' || '%')
LIMIT 10;
á¡ááœááºáá±á¬ááºážááœááºáá±á¬á áœááºážáá±á¬ááºááẠ- á á¯á á¯áá±á«ááºáž 0.05ms ááŸáá·áº 100KB ááẠá¡áááºážáááºááá¯áááºá áááº! áá«ááá¯á·áᬠáá±á·ááœá¬ážáááºá áá¬áááºááŒáá·áº á á®áááºááá¯á·ááŒá±á¬áá·áº á¡áá¯á¶ážááŒá¯áá°ááẠááááºáá»á¬ážááœáẠááá»á±á¬ááºáá»ááºááœá¬ážá á±áááºá
SELECT
*
FROM
firms
WHERE
lower(name) LIKE ('ÑПза' || '%')
ORDER BY
lower(name)
LIMIT 10;
á¡áá¯ážá áá áºáá¯áá¯á ááááºáááŸáá±á¬á·áá°áž - á¡ááœáŸááºážáá áºáá¯ááŸááá¯á¶ááááºá áá«áá±ááá·áº á¡áá»áá¯ážá¡á á¬ážááœá²áá¬á á¡á²áá«ááᯠáá»á±á¬áºááœá¬ážáá²á·áááº... áá±áá»á¬áá«áááºá áá«áᬠá¡áááºááœá±ážáá»ááºááŸá¯ááẠá¡ááá»á¬ážá áœá¬ ááá¯áááá±á¬ááºáá±ááŒá®á áá«áá±ááá·áº...
1.4- "ááá¯ááºáá áºáá¯áá²á·ááŒá®ážá¡á±á¬ááº"
ááá¯á·áá±á¬áº á¡ááá¯ááºážá¡ááŒá¬ážá¡ááá¯áẠááŸá¬ááœá±ááá¯ááºááŒá®áž áá¯á¶ááŸááºá¡ááá¯ááºáž á á®áááºááᯠá¡áá¯á¶ážááŒá¯áá² á¡ááœáŸááºážáá áºáᯠááŸááá«áááºá áá¯á¶ááŸáẠbree!
CREATE INDEX ON firms(lower(name));
áááºážááá¯áá±á¬ááºážááá¯ááŸáᬠ"áá°ááá¯ááºááá¯ááºá á¯áá±á¬ááºáž" ááá«áááº-
SELECT
*
FROM
firms
WHERE
lower(name) >= 'ÑПза' AND
lower(name) <= ('ÑПза' || chr(65535)) -- ÐŽÐ»Ñ UTF8, ÐŽÐ»Ñ ÐŸÐŽÐœÐŸÐ±Ð°Ð¹ÑПвÑÑ
- chr(255)
ORDER BY
lower(name)
LIMIT 10;
á¡áá°ážáá±á¬ááºážááœááºááẠ- á¡áá»áá¯ážá¡á á¬ážááœá²ááŒááºážá¡áá¯ááºááŒá áºááŒá®áž á¡áááºážá¡ááŒá áºáá¯á¶ážá áœá²ááŸá¯ááẠ"ááá¯ááºáááá¯á áá¯ááº" ááŒá áºáá±áá²á "á ááºááŒááºáá±á¬" FTS ááẠá¡ááá±á¬ááºáá±á«ááºážáá»á¬ážá áœá¬ ááá¯áááá±á¬ááºáááºá! áá»ááºáá¬á¡á¬ážáá¯á¶ážá áá±á¬ááºážááá¯áá»ááºáá áºáá¯áá²ááᯠáá±á«ááºážááá·áºááá¯á·áá²áá»ááºáá±á¬á·áááºá
(
SELECT
*
FROM
firms
WHERE
lower(name) >= 'ÑПза' AND
lower(name) <= ('ÑПза' || chr(65535)) -- ÐŽÐ»Ñ UTF8, ÐŽÐ»Ñ ÐŸÐŽÐœÐŸÐ±Ð°Ð¹ÑПвÑÑ
кПЎОÑПвПк - chr(255)
ORDER BY
lower(name)
LIMIT 10
)
UNION ALL
(
SELECT
*
FROM
firms
WHERE
to_tsvector('simple'::regconfig, lower(name)) @@ to_tsquery('simple', 'ÑПза:*') AND
lower(name) NOT LIKE ('ÑПза' || '%') -- "МаÑОМаÑÑОеÑÑ ÐœÐ°" ÐŒÑ Ñже МаÑлО вÑÑе
ORDER BY
lower(name) ~ ('^' || 'ÑПза') DESC -- ОÑпПлÑзÑеЌ ÑÑ Ð¶Ðµ ÑПÑÑОÑПвкÑ, ÑÑÐŸÐ±Ñ ÐРпПйÑО пП btree-ОМЎекÑÑ
, lower(name)
LIMIT 10
)
LIMIT 10;
áá¯ááááá±ážááœááºážááœá²ááᯠáá¯ááºáá±á¬ááºááŒá±á¬ááºáž áááááŒá¯áá«á ááááá
áºáá¯á áá»áŸá±á¬áºááá·áºáá¬ážáá¬ááẠáááºážáá±ááŸáá² áá±á¬ááºáá¯á¶áž LIMIT
ááá¯ááºážá¡áá±á¡ááœááºá á€áá±ážááœááºážááᯠááá¯ááá¯áá±á¬ááºážááœááºá¡á±á¬ááºááŒá¯áá¯ááºááŒááºážáááºážáááºážá¡ááŒá±á¬ááºáž ááŒá±á¬áá±áá«áááºá
ááá¯á·ááŒá±á¬áá·áºá ááá¯áá»áœááºá¯ááºááá¯á·áááºá á¬ážááœá²áá±á«áºááœáẠbtree ááŸáá·áº gin ááŸá áºáá»áá¯ážáá¯á¶ážááŸááááºá ááá¯á·áá±á¬áºá á¬áááºážá¡ááºážá¡áááááááºá áá±á¬ááºážááá¯ááŸá¯áá»á¬ážá 10% áááºáááºážáá±á¬ áá¯áááááááºááá¯á·ááŒááºážá¡á¬áž á¡áá±á¬ááºá¡áááºáá±á¬áºááẠáá±á¬ááºááŸááááºá. ááá¯ááá¯áááºááŸá¬á áá¯ááºáááºážáá¬áááºá¡ááœáẠááŒáá¯áááºááááŸááá¬ážááá·áº ááá·áºáááºáá»ááºáá»á¬ážááŒá±á¬áá·áºá áá¬áá¬áááºážááŒá áºáá»á¬ážá á á¯á á¯áá±á«ááºážáá¯á¶ážá áœá²ááŸá¯ááᯠá¡ááá áºáá±á¬ááºáá®ážáá«áž áá»áŸá±á¬á·áá»ááá¯ááºáá²á·áááºá
1.5*- áá»áœááºá¯ááºááá¯á·ááẠááá¯ááºááá«áá² áá¯ááºáá±á¬ááºááá¯ááºáááºá
á¡ááẠLIKE
ááŸá¬ážááœááºážáá±á¬ á¡áá»áá¯ážá¡á
á¬ážááœá²ááŒááºážááᯠá¡áá¯á¶ážááŒá¯ááŒááºážá០áá»áœááºá¯ááºááá¯á· áá¬ážáá®ážáá¶áá²á·ááááºá ááá¯á·áá±á¬áº á¡áá¯á¶ážááŒá¯áá±ááá·áº á¡á±á¬áºááá±áá¬á¡á¬áž áááºááŸááºááŒááºážááŒáá·áº áááºážááᯠ"ááŸááºáááºáá±á¬áááºážááŒá±á¬ááºážáá±á«áºááœáẠáá»ááŸááºááá¯ááºáááº"
áá¯á¶áá±á¡á¬ážááŒáá·áº áá°ááááºá
ASC
. ááá¯á·á¡ááŒááºá á¡ááá¯ááºáá áºáá¯ááœáẠáá®ážááŒá¬ážá¡áá»áá¯ážá¡á á¬ážá¡á±á¬áºááá±áá¬áá áºáá¯áá¡áááºááᯠáááºáááºááŸááºááá¯ááºáááºáUSING
. á¡áá»áá¯ážá¡á á¬ážááœá²ááá·áº á¡á±á¬áºááá±áá¬ááẠB-tree á¡á±á¬áºááá±áá¬á¡áá»áá¯á·á áááá¬ážá á¯ááẠáááºážáá±á¬ ááá¯á·ááá¯áẠááá¯ááŒá®ážáá±á¬ á¡ááœá²á·áááºááŒá áºááá«áááºáASC
á¡áá»á¬ážá¡á¬ážááŒáá·áº áá®áá»áŸáááºáUSING <
ОDESC
á¡áá»á¬ážá¡á¬ážááŒáá·áº áá®áá»áŸáááºáUSING >
.
áá»áœááºá¯ááºááá¯á·áá¡ááŒá±á¡áá±ááœááºá "áá»á±á¬á·áááºáž" áááºá ~<~
:
SELECT
*
FROM
firms
WHERE
lower(name) LIKE ('ÑПза' || '%')
ORDER BY
lower(name) USING ~<~
LIMIT 10;
2: áá±á¬ááºážááá¯áá»ááºáá»á¬áž áá»ááºáá¬áá¯á¶
ááᯠáá»áœááºá¯ááºááá¯á·ááẠáá»áœááºá¯ááºááá¯á·ááá±á¬ááºážááá¯ááŸá¯ááᯠááŒá±á¬ááºá ááá¯á·ááá¯áẠáá áºááŸá áºááŒá¬ âá áááºáá¬ážâ ááẠáá¬ážáá²á·ááŒá®áž ááŸááºáá¬ááºá á á¯á á¯áá±á«ááºážáá±á·á áẠâá á¯ááºáá°ááŒááºážâ ááœáŸááºážááááºážáá»á¬ážááŸáá·áºá¡áá° áááºážááᯠâááááºááœááºâ áááºáá¶ááœá±á·ááŸáááá·áºá¡ááœáẠá¡á¶á·á¡á¬ážááá·áºáááá«áááºábuffers ááœá± ááŸááºáá®áž) áá²ááŸá¬ 5.5TB ááá¯ááá¯áá¬á áááá¯ááááºáá±á¬áẠááá¯áá«áááºá
áá¯ááºáá«áááºá áá»áœááºá¯ááºááá¯á·ááá¯ááºáááºážááẠááŒá®ážááœá¬ážáá¬ááŒá®áž áá»áœááºá¯ááºááá¯á·ááá¯ááºáááºážáááºááẠááá¯ážáá¬áá±á¬áºáááºáž áá°áá®áá±á¬ááá¬áááŒáá·áº ááá¯ááºáá«á ááá¯ááá¯áááºááŸá¬ á€áá±áá¬ááœáẠáá«ážáá»áŸá¬ážáááºáᯠááá¯ááá¯ááẠ- á¡ááŒá±ááŸá¬ááŒáá·áºáá¡á±á¬ááºá
2.1: á á¬áá»ááºááŸá¬áááœá±ážááœá¬ážááŸá¯
áá áºáá»áááºáá»áááºááœááºá á¡ááŒá¬ážáá±á¬ ááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯á¡ááœá²á·á០á¡ááŒááºá á¬ááœá²ááŸá¬ááœá±ááŸá¯á០áá°áá®áá±á¬áºáááºáž áá»á²á·ááœááºáá¬ážáá±á¬ ááááºáá»á¬ážááŸáá·áºá¡áá° registry ááá¯á· "áá¯ááº" ááá¯ááºá á±ááẠááá¯áá¬ážáá«áááºá á á¬áá»ááºááŸá¬áááºážááœáŸááºááŒááºážáááŸááá² ááŸááºáá¯á¶áááºááŒááºážáá°ááẠá¡áááºáááºážá á á¥áºážá á¬ážááŒáá«á áá¯á·á
( ... LIMIT <N> + 10)
UNION ALL
( ... LIMIT <N> + 10)
LIMIT 10 OFFSET <N>;
ááá¯á¡áá« áá±á¬á·ááºáá²áá±ážáá¬ážáá°á¡ááœáẠáááºááá·áºááá á®ážááŸá¯ááŸáááŸááá² âá á¬áá»ááºááŸá¬áá áºáá»ááºááŸá¬ááŒááºážâ áááºááŒááºážááŒáá·áº ááŸá¬ááœá±ááŸá¯ááááºáá»á¬ážá á á¬áááºážááá¬ážááᯠááŒáááá¯ááºáá«ááŒá®á
ááááºáá±á¬á·á áá±áá¬áá»á¬ážá áá±á¬ááºáááºááœá² á á¬áá»ááºááŸá¬áá áºáá¯á á®á¡ááœáẠááá¯áá»á¬ážáá¬áááºááŸáá·áºá¡áá»áŸ áááºáááºá (áá»áœááºá¯ááºááá¯á·á áœáá·áºáá áºááá·áºááááºá¡áá»áááºááŸá¡á¬ážáá¯á¶ážááŸáá·áºááá¯á¡ááºáá±á¬ "á¡ááŒá®áž") - ááá¯ááá¯áááºááŸá¬áááºážáááºááŸááºážáááºážáá±á¬ááá·áºáá»ááºáááºááŒá áºáááºá áá«áá±ááá·áº á¡ááºáá¬áá±á·á áºááŸá¬ ááááºážáááºážáá¬ážáá²á· áá±á¬á·ááá± áá±á¬ááºáááŒááẠáááºáá«áááºáá«ááŸá¬ ááŸá¬ááœá±ááŸá¯ááᯠá áááºáá¬á ááá¯ááŸááºáááá·áºáááºá áá«áá±ááá·áº á¡á²áá«á áá±á¬ááºáá áºááŒáááºáá±á¬ááºáá«áá²á
2.2: áá»áœááºáá±á¬áº áá°ážááŒá¬ážáááºážááŒá¬ážáá²á·á¡áá¬áá áºáá¯ááᯠááá¯áá»ááºáááºá
áá áºáá»áááºáá»áááºááŸá¬áá±á¬á· developer á ááá¯áá»ááºáááºá ááááºááá°áá¬ááᯠáá±áá¬ááŒáá·áº ááœá²ááŒá¬ážá¡á±á¬ááºááŒá¯áá¯ááºáá«á ááááºáá±á¬ááºážááá¯áá»ááºáá áºáá¯áá¯á¶ážááᯠCTE ááá¯á· áá±ážááá¯á·áá²á·ááá·áº á¡ááŒá¬ážááá¬ážááŸá
WITH q AS (
...
LIMIT <N> + 10
)
SELECT
*
, (SELECT ...) sub_query -- какПй-ÑП запÑÐŸÑ Ðº ÑвÑзаММПй ÑаблОÑе
FROM
q
LIMIT 10 OFFSET <N>;
áá«áá±á¬ááºá០áááá¯ážáá«áá°ážá ááá¯ááºááẠááŒááºáá±ážááá·áº ááŸááºáááºáž 10 áá¯á¡ááœááºáᬠá¡áá²ááŒááºáá¬ážáá¬ááá¯á·á
2.3- ááœá²ááŒá¬ážááááŒááºááŸá¯ááẠá¡áááá¬ááºáááºážáá²á·ááŒá®áž ááá¯áá¬áááºážáááºá
2nd subquery á០ááá¯ááá¯á·áá±á¬ ááá·áºáá²ááŒá
áºá
ááºá áá
áºáá±áᬠáá»á±á¬ááºááœá¬ážáááºá NOT LIKE
á¡ááœá¡á±áá±. á¡á²áá«ááŒá®ážááẠááŸááºážáá«áááºá UNION ALL
ááŒááºáá¬áá²á·áááºá á¡áá»áá¯á·áá±á¬á
á¬áá»á¬ážááẠááŸá
áºááŒáááºá - á
á¬ááŒá±á¬ááºážáá¡á
ááœáẠááááá¯á¶ážááœá±á·áááŒá®áž áá±á¬ááºáááẠá€á
á¬ááŒá±á¬ááºážááááá
áá¬ážáá¯á¶ážáá¡á
ááœááºá ááá·áºáááºáá»ááºááœááºá 2nd subquery á ááŸááºáááºážáá»á¬ážá¡á¬ážáá¯á¶ážááẠáááááŸááºáááºážáá»á¬ážááŸáá·áº ááá¯ááºáá®ááá¯ááºáá«áááºá
á¡ááŒá±á¬ááºážáááºážááᯠááŸá¬áá±ááá·áºá¡á á¬áž developer á áá¬áá¯ááºááá²á
- á¡ááœááºá¡á á¬áž ááŸá áºá áá°áááºážááá°áá¬áá»á¬áž
- DISTINCT ááᯠáá»áŸá±á¬ááºáá¬ážáá«áá á¬ááŒá±á¬ááºážáá áºáá¯á á®á áá¬áááá áºáá¯áááºážááá¯áᬠááá°áááº
WITH q AS (
( ... LIMIT <2 * N> + 10)
UNION ALL
( ... LIMIT <2 * N> + 10)
LIMIT <2 * N> + 10
)
SELECT DISTINCT
*
, (SELECT ...) sub_query
FROM
q
LIMIT 10 OFFSET <N>;
ááá¯ááá¯áááºááŸá¬á ááááºááẠá¡áá¯á¶ážááœáẠá¡ááá¡áá»áá°áá®ááŒá±á¬ááºáž ááŸááºážááŸááºážáááºážáááºáž áááá¬áá±á¬áºáááºáž 2nd CTE subquery ááá¯á· "áá»á¶áááºážááŒááºáž" áá¡ááœáá·áºá¡áááºážááẠááá¯ááá¯ááŒáá·áºáá¬ážáá¬ááŒá®áž áááºážáááŸááá»áŸááºáááºá ááá¯ááá¯ááŸááºážáááºážá áœá¬áááºááá¯ááºáááºá.
áá«áá±ááá·áº áá«á áááºážáááºážá
áá¬á¡áá±á¬ááºážáá¯á¶ážáá±á¬á· ááá¯ááºáá«áá°ážá developer á á
ááŒá®áž ááœá±ážááá¯ááºážáááºá DISTINCT
áááºáááºááŸááºááŸááºááœá±á¡ááœáẠááá¯ááºáá² áááºáááºá¡á¬ážáá¯á¶ážá¡ááœááºáá« áá
áºáá«áááºážáá«á ááŸááºáááºážáá»á¬ážá ááá¯á·áá±á¬áẠsub_query á¡ááœááºâáá±ážááŒááºážááŸá¯áááááºââááá¯áá±áá¬ááœáẠá¡ááá¯á¡áá»á±á¬ááºáá«áááºáá²á·áááºá á¡áᯠá¡ááŒá
áºáááºáá±ážáááºá DISTINCT
database ááᯠexecute áá¯ááºáá¬ážááŒá®ážáá¬ážáá«á 10 subqueries ááá¯ááºáá² <2 * N> + 10 á¡á¬ážáá¯á¶áž!
2.4: á¡á¬ážáá¯á¶ážááẠáá°ážáá±á«ááºážáá±á¬ááºááœááºááŸá¯á
ááá¯á·ááŒá±á¬áá·áºá developer áá»á¬ážááẠáá±á¬ááºáááºááœá² âá á¬áá»ááºááŸá¬â áá áºáá¯á á®ááᯠáááºáá¶áááŸááá¬ááœáẠáá¬áá¬ááŸááºááŸá±ážááœá±ážááŸá¯ááŸáá·áºá¡áá° registry ááᯠáááá¬áááºááŸá¬ážáá±á¬ N áááºááá¯ážáá»á¬ážááá¯á· âáá»áááºááŸáâ ááẠáá¯á¶áá±á¬ááºáá±á¬ á áááºááŸááºáááºážáá¶ááŸá¯ áááŸááá±á¬ááŒá±á¬áá·áº áá±á¬á·ááºáá²áá±ážáá¬ážáá°áá»á¬ážááẠáááºážááá¯á·ááẠáááºážááá¯á·á¡á¬áž á¡ááŸá±á¬ááºá¡ááŸááºáááŒá áºá á±áá«á
á¡ááŒá¬ážáá¬áá០developer áá»á¬áž áááºážááá¯á·áá¶ááá¯á· áá±á¬ááºááŸááá¬ááŒá®áž ááá¯áá²á·ááá¯á·áá±á¬ á¡áááºááŒá±ááá·áºáááºážáááºážááᯠá¡áá¯á¶ážááŒá¯ááá¯áááºá¡áá ááŒá áºáááºá áááºááá²áá² ááŸá¬ááœá±ááŸá¯ á¡ááœáẠ- ááá¯ááá¯áááºááŸá¬á áá»áœááºá¯ááºááá¯á·ááẠá¡áá»áá¯á·áá±á¬ááá°áá¬áá»á¬ážá០á¡ááá¯ááºážáá áºáá¯ááá¯áá°áá¬á áááºážááᯠá¡ááá¯á¡ááŒá±á¡áá±áá»á¬ážááŒáá·áº á á áºáá¯ááºááŒá®ážá ááááºááá¯ááœá²áá«á ááá¯á·áá±á¬áẠáá±á¬ááºá¡ááá¯ááºáž (áá»áœááºá¯ááºááá¯á·áááá á¹á ááœáẠN ááá¯ážááŒááºážááŒáá·áº á¡á±á¬ááºááŒááºáááº)á á áááºááá¯á·ááᯠáááºáá¬ážááŒááºááᯠááŒáá·áºááœááºážááá·áºá¡áá»áááºá¡áá ááŒá áºáááºá
áá±áá°áá»á¡á¬ážááŒáá·áº áááºážáááá±á¬ááá°áá¬áá»á¬áž N ááẠ17K áá®ážáá«ážáááºááá¯ážáá»á¬ážáá±á¬ááºááŸááá²á·áááºáááŸáá·áº áá áºáááºáááºážááœááºááẠá¡áááºážáá¯á¶áž 4K ááá¯ááá¯á·áá±á¬ááºážááá¯ááŸá¯áá»á¬ážááᯠ"ááœááºážáááºáá áºáá»áŸá±á¬ááº" ááœáẠáá¯ááºáá±á¬ááºáá²á·áá«áááºá áá±á¬ááºáá¯á¶ážáá°ááá¯á·ááᯠáá²áá¶á·á áœá¬ á áááºááºáááºáá²á·áááºá áááºáá«áááºáá« áá áºááŒáááºáá»áŸáẠ1GB áááºááá¯áá®...
á á¯á á¯áá±á«ááºáž
source: www.habr.com