เชชเซ‹เชธเซเชŸเช—เซเชฐเซ‡เชเชธเช•เซเชฏเซเชเชฒ เชเชจเซเชŸเชฟเชชเซ‡เชŸเชฐเซเชจ: เชจเชพเชฎ เชฆเซเชตเชพเชฐเชพ เชถเซ‹เชงเชจเชพ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เชถเซเชฆเซเชงเชฟเช•เชฐเชฃเชจเซ€ เชตเชพเชฐเซเชคเชพ, เช…เชฅเชตเชพ "เช†เช—เชณ เช…เชจเซ‡ เช†เช—เชณ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เช เช•เชฐเชตเซเช‚"

เชฆเซ‡เชถเชญเชฐเชจเซ€ เชธเซ‡เชฒเซเชธ เช“เชซเชฟเชธเชจเชพ เชนเชœเชพเชฐเซ‹ เชฎเซ‡เชจเซ‡เชœเชฐเซ‹ เชฐเซ‡เช•เซ‹เชฐเซเชก เช•เชฐเซ‡ เช›เซ‡ เช…เชฎเชพเชฐเซ€ CRM เชธเชฟเชธเซเชŸเชฎ เชฆเชฐเชฐเซ‹เชœ เชนเชœเชพเชฐเซ‹ เชธเช‚เชชเชฐเซเช•เซ‹ - เชธเช‚เชญเชตเชฟเชค เช…เชฅเชตเชพ เชนเชพเชฒเชจเชพ เช—เซเชฐเชพเชนเช•เซ‹ เชธเชพเชฅเซ‡ เชตเชพเชคเชšเซ€เชคเชจเซ€ เชนเช•เซ€เช•เชคเซ‹. เช…เชจเซ‡ เช† เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เชธเซŒเชชเซเชฐเชฅเชฎ เช•เซเชฒเชพเชฏเช‚เชŸ เชถเซ‹เชงเชตเชพ เชœ เชœเซ‹เชˆเช, เช…เชจเซ‡ เชชเซเชฐเชพเชงเชพเชจเซเชฏเชฎเชพเช‚ เช–เซ‚เชฌ เชœ เชเชกเชชเชฅเซ€. เช…เชจเซ‡ เช† เชฎเซ‹เชŸเซ‡ เชญเชพเช—เซ‡ เชจเชพเชฎ เชฆเซเชตเชพเชฐเชพ เชฅเชพเชฏ เช›เซ‡.

เชคเซ‡เชฅเซ€, เชคเซ‡ เช†เชถเซเชšเชฐเซเชฏเชœเชจเช• เชจเชฅเซ€ เช•เซ‡, เชซเชฐเซ€ เชเช•เชตเชพเชฐ เชธเซŒเชฅเซ€ เชตเชงเซ เชฒเซ‹เชก เชฅเชฏเซ‡เชฒ เชกเซ‡เชŸเชพเชฌเซ‡เชเชฎเชพเช‚เชจเชพ เชเช• เชชเชฐ "เชญเชพเชฐเซ‡" เชชเซเชฐเชถเซเชจเซ‹เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเชตเซเช‚ - เช†เชชเชฃเชพ เชชเซ‹เชคเชพเชจเชพ VLSI เช•เซ‹เชฐเซเชชเซ‹เชฐเซ‡เชŸ เชเช•เชพเช‰เชจเซเชŸ, เชฎเชจเซ‡ "เชŸเซ‹เชšเชฎเชพเช‚" เชฎเชณเซเชฏเซเช‚ เชจเชพเชฎ เชฆเซเชตเชพเชฐเชพ "เชเชกเชชเซ€" เชถเซ‹เชง เชฎเชพเชŸเซ‡ เชตเชฟเชจเช‚เชคเซ€ เชธเช‚เชธเซเชฅเชพ เช•เชพเชฐเซเชก เชฎเชพเชŸเซ‡.

เชคเชฆเซเชชเชฐเชพเช‚เชค, เชตเชงเซ เชคเชชเชพเชธเชฎเชพเช‚ เชเช• เชฐเชธเชชเซเชฐเชฆ เช‰เชฆเชพเชนเชฐเชฃ เชฌเชนเชพเชฐ เช†เชตเซเชฏเซเช‚ เชชเซเชฐเชฅเชฎ เช“เชชเซเชŸเชฟเชฎเชพเช‡เชเซ‡เชถเชจ เช…เชจเซ‡ เชชเช›เซ€ เช•เชพเชฎเช—เซ€เชฐเซ€เชฎเชพเช‚ เช˜เชŸเชพเชกเซ‹ เช˜เชฃเซ€ เชŸเซ€เชฎเซ‹ เชฆเซเชตเชพเชฐเชพ เชคเซ‡เชจเชพ เช…เชจเซเช•เซเชฐเชฎเชฟเช• เชธเช‚เชธเซเช•เชพเชฐเชฟเชคเชพ เชธเชพเชฅเซ‡ เชตเชฟเชจเช‚เชคเซ€, เชœเซ‡เชฎเชพเช‚เชฅเซ€ เชฆเชฐเซ‡เช• เชฎเชพเชคเซเชฐ เชถเซเชฐเซ‡เชทเซเช  เชนเซ‡เชคเซเช“ เชธเชพเชฅเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡.

0: เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซ‡ เชถเซเช‚ เชœเซ‹เชˆเช เช›เซ‡?

เชชเซ‹เชธเซเชŸเช—เซเชฐเซ‡เชเชธเช•เซเชฏเซเชเชฒ เชเชจเซเชŸเชฟเชชเซ‡เชŸเชฐเซเชจ: เชจเชพเชฎ เชฆเซเชตเชพเชฐเชพ เชถเซ‹เชงเชจเชพ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เชถเซเชฆเซเชงเชฟเช•เชฐเชฃเชจเซ€ เชตเชพเชฐเซเชคเชพ, เช…เชฅเชตเชพ "เช†เช—เชณ เช…เชจเซ‡ เช†เช—เชณ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เช เช•เชฐเชตเซเช‚"[KDPV เช…เชนเซ€เช‚เชฅเซ€]

เชœเซเชฏเชพเชฐเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชจเชพเชฎ เชฆเซเชตเชพเชฐเชพ "เชเชกเชชเซ€" เชถเซ‹เชง เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเซ‡ เช›เซ‡ เชคเซเชฏเชพเชฐเซ‡ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เชคเซ‡เชจเซ‹ เช…เชฐเซเชฅ เชถเซเช‚ เชฅเชพเชฏ เช›เซ‡? เชคเซ‡ เชฒเช—เชญเช— เช•เซเชฏเชพเชฐเซ‡เชฏ เชธเชฌเชธเซเชŸเซเชฐเชฟเช‚เช— เชœเซ‡เชตเซ€ "เชชเซเชฐเชฎเชพเชฃเชฟเช•" เชถเซ‹เชง เชฌเชจเซ€ เชถเช•เชคเซ€ เชจเชฅเซ€ ... LIKE '%ั€ะพะทะฐ%' - เช•เชพเชฐเชฃ เช•เซ‡ เชชเช›เซ€ เชชเชฐเชฟเชฃเชพเชฎเชฎเชพเช‚ เชฎเชพเชคเซเชฐ เชถเชพเชฎเซ‡เชฒ เชจเชฅเซ€ 'ะ ะพะทะฐะปะธั' ะธ 'ะœะฐะณะฐะทะธะฝ ะ ะพะทะฐ'เชชเชฐเช‚เชคเซ 'ะ“ั€ะพะทะฐ' เช…เชจเซ‡ เชคเซ‡ เชชเชฃ 'ะ”ะพะผ ะ”ะตะดะฐ ะœะพั€ะพะทะฐ'.

เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชฐเซ‹เชœเชฟเช‚เชฆเชพ เชธเซเชคเชฐเซ‡ เชงเชพเชฐเซ‡ เช›เซ‡ เช•เซ‡ เชคเชฎเซ‡ เชคเซ‡เชจเซ‡ เชชเซเชฐเชฆเชพเชจ เช•เชฐเชถเซ‹ เชถเชฌเซเชฆเชจเซ€ เชถเชฐเซ‚เช†เชค เชฆเซเชตเชพเชฐเชพ เชถเซ‹เชงเซ‹ เชถเซ€เชฐเซเชทเช•เชฎเชพเช‚ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชตเชงเซ เชธเซเชธเช‚เช—เชค เชฌเชจเชพเชตเซ‹ เชชเชฐ เชถเชฐเซ‚ เชฅเชพเชฏ เช›เซ‡ เชฆเชพเช–เชฒ เช•เชฐเซเชฏเซเช‚. เช…เชจเซ‡ เชคเชฎเซ‡ เชคเซ‡ เช•เชฐเชถเซ‹ เชฒเช—เชญเช— เชคเชฐเชค เชœ - เช‡เชจเซเชŸเชฐเชฒเชพเช‡เชจเชฐ เช‡เชจเชชเซเชŸ เชฎเชพเชŸเซ‡.

1: เช•เชพเชฐเซเชฏ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เช•เชฐเซ‹

เช…เชจเซ‡ เชคเซ‡เชฅเซ€ เชชเชฃ เชตเชงเซ, เชเช• เชตเซเชฏเช•เซเชคเชฟ เช–เชพเชธ เชฆเชพเช–เชฒ เช•เชฐเชถเซ‡ เชจเชนเซ€เช‚ 'ั€ะพะท ะผะฐะณะฐะท', เชœเซ‡เชฅเซ€ เชคเชฎเชพเชฐเซ‡ เชฆเชฐเซ‡เช• เชถเชฌเซเชฆเชจเซ‡ เช‰เชชเชธเชฐเซเช— เชฆเซเชตเชพเชฐเชพ เชถเซ‹เชงเชตเชพเชจเซ‹ เชฐเชนเซ‡เชถเซ‡. เชจเชพ, เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชฎเชพเชŸเซ‡ เชชเชนเซ‡เชฒเชพเชจเชพ เชถเชฌเซเชฆเซ‹เชจเซ‡ เชนเซ‡เชคเซเชชเซ‚เชฐเซเชตเช• "เช…เชจเซเชกเชฐเชธเซเชชเซ‡เชธเชฟเชซเชพเชฏ" เช•เชฐเชตเชพ เช•เชฐเชคเชพเช‚ เช›เซ‡เชฒเซเชฒเชพ เชถเชฌเซเชฆ เชฎเชพเชŸเซ‡ เชเชกเชชเซ€ เชธเช‚เช•เซ‡เชคเชจเซ‹ เชชเซเชฐเชคเชฟเชธเชพเชฆ เช†เชชเชตเชพเชจเซเช‚ เช–เซ‚เชฌ เชธเชฐเชณ เช›เซ‡ - เช•เซ‹เชˆเชชเชฃ เชถเซ‹เชง เชเชจเซเชœเชฟเชจ เช†เชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชนเซ‡เชจเซเชกเชฒ เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡ เชœเซเช“.

เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เช…เชงเชฟเช•เชพเชฐ เชธเชฎเชธเซเชฏเชพ เชฎเชพเชŸเซ‡ เชœเชฐเซ‚เชฐเชฟเชฏเชพเชคเซ‹ เช˜เชกเชตเซ€ เช เช…เชกเชงเชพ เช•เชฐเชคเชพเช‚ เชตเชงเซ เช‰เช•เซ‡เชฒ เช›เซ‡. เช•เซเชฏเชพเชฐเซ‡เช• เชธเชพเชตเชšเซ‡เชค เช‰เชชเชฏเซ‹เช— เช•เซ‡เชธ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เชชเชฐเชฟเชฃเชพเชฎเชจเซ‡ เชจเซ‹เช‚เชงเชชเชพเชคเซเชฐ เชฐเซ€เชคเซ‡ เชชเซเชฐเชญเชพเชตเชฟเชค เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡.

เช…เชฎเซ‚เชฐเซเชค เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพ เชถเซเช‚ เช•เชฐเซ‡ เช›เซ‡?

1.0: เชฌเชพเชนเซเชฏ เชถเซ‹เชง เชเช‚เชœเซ€เชจ

เช“เชน, เชถเซ‹เชง เชฎเซเชถเซเช•เซ‡เชฒ เช›เซ‡, เชนเซเช‚ เช•เช‚เชˆเชชเชฃ เช•เชฐเชตเชพ เชฎเชพเช‚เช—เชคเซ‹ เชจเชฅเซ€ - เชšเชพเชฒเซ‹ เชคเซ‡เชจเซ‡ เชกเซ‡เชตเซ‹เชชเซเชธเชจเซ‡ เช†เชชเซ€เช! เชคเซ‡เชฎเชจเซ‡ เชกเซ‡เชŸเชพเชฌเซ‡เชเชฎเชพเช‚ เชฌเชนเชพเชฐเชจเซเช‚ เชธเชฐเซเชš เชเชจเซเชœเชฟเชจ เชœเชฎเชพเชตเชตเชพ เชฆเซ‹: เชธเซเชซเชฟเชจเซเช•เซเชธ, เช‡เชฒเชพเชธเซเชŸเชฟเช• เชธเชฐเซเชš,...

เชธเชฟเช‚เช•เซเชฐเชจเชพเช‡เชเซ‡เชถเชจ เช…เชจเซ‡ เชซเซ‡เชฐเชซเชพเชฐเซ‹เชจเซ€ เชเชกเชชเชจเชพ เชธเช‚เชฆเชฐเซเชญเชฎเชพเช‚ เชถเซเชฐเชฎ-เชธเช˜เชจ เชนเซ‹เชตเชพ เช›เชคเชพเช‚ เช•เชพเชฎ เช•เชฐเชตเชพเชจเซ‹ เชตเชฟเช•เชฒเซเชช. เชชเชฐเช‚เชคเซ เช…เชฎเชพเชฐเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ เชจเชนเซ€เช‚, เช•เชพเชฐเชฃ เช•เซ‡ เชถเซ‹เชง เชฆเชฐเซ‡เช• เช•เซเชฒเชพเชฏเช‚เชŸ เชฎเชพเชŸเซ‡ เชคเซ‡เชจเชพ เชเช•เชพเช‰เชจเซเชŸ เชกเซ‡เชŸเชพเชจเชพ เชฎเชพเชณเช–เชพเชฎเชพเช‚ เชœ เชนเชพเชฅ เชงเชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เช…เชจเซ‡ เชกเซ‡เชŸเชพเชฎเชพเช‚ เชเช•เชฆเชฎ เช‰เชšเซเชš เชชเชฐเชฟเชตเชฐเซเชคเชจเช•เซเชทเชฎเชคเชพ เช›เซ‡ - เช…เชจเซ‡ เชœเซ‹ เชฎเซ‡เชจเซ‡เชœเชฐ เชนเชตเซ‡ เช•เชพเชฐเซเชกเชฎเชพเช‚ เชฆเชพเช–เชฒ เชฅเชฏเชพ เช›เซ‡ 'ะœะฐะณะฐะทะธะฝ ะ ะพะทะฐ', เชชเช›เซ€ 5-10 เชธเซ‡เช•เชจเซเชก เชชเช›เซ€ เชคเซ‡เชจเซ‡ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชฏเชพเชฆ เชนเชถเซ‡ เช•เซ‡ เชคเซ‡ เชคเซเชฏเชพเช‚ เชคเซ‡เชจเซเช‚ เชˆเชฎเซ‡เชฒ เชธเซ‚เชšเชตเชตเชพเชจเซเช‚ เชญเซ‚เชฒเซ€ เช—เชฏเซ‹ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชถเซ‹เชงเซ€เชจเซ‡ เชคเซ‡เชจเซ‡ เชธเซเชงเชพเชฐเชตเชพ เชฎเชพเช‚เช—เซ‡ เช›เซ‡.

เชคเซ‡เชฅเซ€ - เชšเชพเชฒเซ‹ "เชกเชพเชŸเชพเชฌเซ‡เชเชฎเชพเช‚ เชธเซ€เชงเซเช‚" เชถเซ‹เชงเซ‹. เชธเชฆเชจเชธเซ€เชฌเซ‡, PostgreSQL เช…เชฎเชจเซ‡ เช† เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡, เช…เชจเซ‡ เชฎเชพเชคเซเชฐ เชเช• เชตเชฟเช•เชฒเซเชช เชœ เชจเชนเซ€เช‚ - เช…เชฎเซ‡ เชคเซ‡เชฎเชจเซ‡ เชœเซ‹เชˆเชถเซเช‚.

1.1: "เชชเซเชฐเชพเชฎเชพเชฃเชฟเช•" เชธเชฌเชธเซเชŸเซเชฐเชฟเช‚เช—

เช…เชฎเซ‡ "เชธเชฌเชธเซเชŸเซเชฐเชฟเช‚เช—" เชถเชฌเซเชฆเชจเซ‡ เชตเชณเช—เซ€ เชฐเชนเซ€เช เช›เซ€เช. เชชเชฐเช‚เชคเซ เชธเชฌเชธเซเชŸเซเชฐเชฟเช‚เช— (เช…เชจเซ‡ เชจเชฟเชฏเชฎเชฟเชค เช…เชญเชฟเชตเซเชฏเช•เซเชคเชฟ เชฆเซเชตเชพเชฐเชพ เชชเชฃ!) เชฆเซเชตเชพเชฐเชพ เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพ เชถเซ‹เชง เชฎเชพเชŸเซ‡ เชเช• เช‰เชคเซเชคเชฎ เช›เซ‡ เชฎเซ‹เชกเซเชฏเซเชฒ pg_trgm! เชฎเชพเชคเซเชฐ เชชเช›เซ€ เชคเซ‡ เชฏเซ‹เช—เซเชฏ เชฐเซ€เชคเซ‡ เชธเซ‰เชฐเซเชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชœเชฐเซ‚เชฐเซ€ เชฐเชนเซ‡เชถเซ‡.

เชšเชพเชฒเซ‹ เชฎเซ‹เชกเซ‡เชฒเชจเซ‡ เชธเชฐเชณ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชจเซ€เชšเซ‡เชจเซ€ เชชเซเชฒเซ‡เชŸ เชฒเซ‡เชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ€เช:

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);

เชšเชพเชฒเซ‹ เช†เช‚เชคเชฐเชฐเซ‡เช–เซ€เชฏ เชถเซ‹เชง เชฎเชพเชŸเซ‡ เชชเซเชฐเชฅเชฎ 10 เชฐเซ‡เช•เซ‹เชฐเซเชกเซเชธ เชœเซ‹เชˆเช:

SELECT
  *
FROM
  firms
WHERE
  lower(name) ~ ('(^|s)' || 'ั€ะพะทะฐ')
ORDER BY
  lower(name) ~ ('^' || 'ั€ะพะทะฐ') DESC -- ัะฝะฐั‡ะฐะปะฐ "ะฝะฐั‡ะธะฝะฐัŽั‰ะธะตัั ะฝะฐ"
, lower(name) -- ะพัั‚ะฐะปัŒะฝะพะต ะฟะพ ะฐะปั„ะฐะฒะธั‚ัƒ
LIMIT 10;

เชชเซ‹เชธเซเชŸเช—เซเชฐเซ‡เชเชธเช•เซเชฏเซเชเชฒ เชเชจเซเชŸเชฟเชชเซ‡เชŸเชฐเซเชจ: เชจเชพเชฎ เชฆเซเชตเชพเชฐเชพ เชถเซ‹เชงเชจเชพ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เชถเซเชฆเซเชงเชฟเช•เชฐเชฃเชจเซ€ เชตเชพเชฐเซเชคเชพ, เช…เชฅเชตเชพ "เช†เช—เชณ เช…เชจเซ‡ เช†เช—เชณ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เช เช•เชฐเชตเซเช‚"
[explan.tensor.ru เชชเชฐ เชœเซเช“]

เชธเชพเชฐเซเช‚, เชคเซ‡... 26ms, 31MB เชกเซ‡เชŸเชพ เชตเชพเช‚เชšเซ‹ เช…เชจเซ‡ 1.7K เช•เชฐเชคเชพเช‚ เชตเชงเซ เชซเชฟเชฒเซเชŸเชฐ เช•เชฐเซ‡เชฒเชพ เชฐเซ‡เช•เซ‹เชฐเซเชกเซเชธ - 10 เชถเซ‹เชงเซ‡เชฒเชพ เชฒเซ‹เช•เซ‹ เชฎเชพเชŸเซ‡. เช“เชตเชฐเชนเซ‡เชก เช–เชฐเซเชš เช–เซ‚เชฌ เชตเชงเชพเชฐเซ‡ เช›เซ‡, เชถเซเช‚ เชคเซเชฏเชพเช‚ เช•เช‚เชˆเช• เชตเชงเซ เช•เชพเชฐเซเชฏเช•เซเชทเชฎ เชจเชฅเซ€?

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;

เชชเซ‹เชธเซเชŸเช—เซเชฐเซ‡เชเชธเช•เซเชฏเซเชเชฒ เชเชจเซเชŸเชฟเชชเซ‡เชŸเชฐเซเชจ: เชจเชพเชฎ เชฆเซเชตเชพเชฐเชพ เชถเซ‹เชงเชจเชพ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เชถเซเชฆเซเชงเชฟเช•เชฐเชฃเชจเซ€ เชตเชพเชฐเซเชคเชพ, เช…เชฅเชตเชพ "เช†เช—เชณ เช…เชจเซ‡ เช†เช—เชณ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เช เช•เชฐเชตเซเช‚"
[explan.tensor.ru เชชเชฐ เชœเซเช“]

เช…เชนเซ€เช‚ เช•เซเชตเซ‡เชฐเซ€ เชเช•เซเชเซ‡เช•เซเชฏเซเชถเชจเชจเซ€ เชธเชฎเชพเช‚เชคเชฐเชคเชพเช เช…เชฎเชจเซ‡ เชฅเซ‹เชกเซ€ เชฎเชฆเชฆ เช•เชฐเซ€, เชธเชฎเชฏเชจเซ‡ เช…เชกเชงเซ‹ เช•เชฐเซ€ เชฆเซ€เชงเซ‹ 11ms. เช…เชจเซ‡ เช…เชฎเชพเชฐเซ‡ 1.5 เช—เชฃเซเช‚ เช“เช›เซเช‚ เชตเชพเช‚เชšเชตเซเช‚ เชชเชกเซเชฏเซเช‚ - เช•เซเชฒ 20MB. เชชเชฐเช‚เชคเซ เช…เชนเซ€เช‚, เช“เช›เซเช‚, เชตเชงเซ เชธเชพเชฐเซเช‚, เช•เชพเชฐเชฃ เช•เซ‡ เช†เชชเชฃเซ‡ เชตเชพเช‚เชšเซ€เช เช›เซ€เช เชคเซ‡เชŸเชฒเซเช‚ เชฎเซ‹เชŸเซเช‚ เชตเซ‹เชฒเซเชฏเซเชฎ, เช•เซ‡เชถ เชšเซ‚เช•เซ€ เชœเชตเชพเชจเซ€ เชถเช•เซเชฏเชคเชพเช“ เชตเชงเชพเชฐเซ‡ เช›เซ‡, เช…เชจเซ‡ เชกเชฟเชธเซเช•เชฎเชพเช‚เชฅเซ€ เชตเชพเช‚เชšเซ‡เชฒเชพ เชกเซ‡เชŸเชพเชจเชพ เชฆเชฐเซ‡เช• เชตเชงเชพเชฐเชพเชจเชพ เชชเซƒเชทเซเช  เชตเชฟเชจเช‚เชคเซ€ เชฎเชพเชŸเซ‡ เชธเช‚เชญเชตเชฟเชค "เชฌเซเชฐเซ‡เช•" เช›เซ‡.

1.3: เชนเชœเซ เชชเชฃ เช—เชฎเซ‡ เช›เซ‡?

เช…เช—เชพเช‰เชจเซ€ เชตเชฟเชจเช‚เชคเซ€ เชฆเชฐเซ‡เช• เชฎเชพเชŸเซ‡ เชธเชพเชฐเซ€ เช›เซ‡, เชชเชฐเช‚เชคเซ เชคเชฎเซ‡ เชคเซ‡เชจเซ‡ เชฆเชฟเชตเชธเชฎเชพเช‚ เชเช• เชฒเชพเช– เชตเช–เชค เช–เซ‡เช‚เชšเซ‹ เชคเซ‹ เชœ เชคเซ‡ เช†เชตเชถเซ‡ 2TB เชกเซ‡เชŸเชพ เชตเชพเช‚เชšเซ‹. เชถเซเชฐเซ‡เชทเซเช  เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชฎเซ‡เชฎเชฐเซ€เชฎเชพเช‚เชฅเซ€, เชชเชฐเช‚เชคเซ เชœเซ‹ เชคเชฎเซ‡ เช•เชฎเชจเชธเซ€เชฌ เช›เซ‹, เชคเซ‹ เชชเช›เซ€ เชกเชฟเชธเซเช•เชฎเชพเช‚เชฅเซ€. เชคเซ‹ เชšเชพเชฒเซ‹ เชคเซ‡เชจเซ‡ เชจเชพเชจเซ‹ เช•เชฐเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ€เช.

เชšเชพเชฒเซ‹ เชฏเชพเชฆ เช•เชฐเซ€เช เช•เซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชถเซเช‚ เชœเซ‹เชตเชพ เชฎเชพเช‚เช—เซ‡ เช›เซ‡ เชชเซเชฐเชฅเชฎ "เชœเซ‡เชจเซ€ เชธเชพเชฅเซ‡ เชถเชฐเซ‚ เชฅเชพเชฏ เช›เซ‡...". เชคเซ‡เชฅเซ€ เช† เชคเซ‡เชจเชพ เชถเซเชฆเซเชง เชธเซเชตเชฐเซ‚เชชเชฎเชพเช‚ เช›เซ‡ เช‰เชชเชธเชฐเซเช— เชถเซ‹เชง เชจเซ€ เชฎเชฆเชฆ เชธเชพเชฅเซ‡ text_pattern_ops! เช…เชจเซ‡ เชฎเชพเชคเซเชฐ เชœเซ‹ เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ 10 เชœเซ‡เชŸเชฒเชพ เชฐเซ‡เช•เซ‹เชฐเซเชกเซเชธ "เชชเซ‚เชฐเชคเชพ เชจ เชนเซ‹เชฏ" เชœเซ‡ เช…เชฎเซ‡ เชถเซ‹เชงเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช, เชคเซ‹ เช…เชฎเชพเชฐเซ‡ FTS เชถเซ‹เชงเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชคเซ‡เชฎเชจเซ‡ เชตเชพเช‚เชšเชตเชพเชจเซเช‚ เชธเชฎเชพเชชเซเชค เช•เชฐเชตเซเช‚ เชชเชกเชถเซ‡:

CREATE INDEX ON firms(lower(name) text_pattern_ops);

SELECT
  *
FROM
  firms
WHERE
  lower(name) LIKE ('ั€ะพะทะฐ' || '%')
LIMIT 10;

เชชเซ‹เชธเซเชŸเช—เซเชฐเซ‡เชเชธเช•เซเชฏเซเชเชฒ เชเชจเซเชŸเชฟเชชเซ‡เชŸเชฐเซเชจ: เชจเชพเชฎ เชฆเซเชตเชพเชฐเชพ เชถเซ‹เชงเชจเชพ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เชถเซเชฆเซเชงเชฟเช•เชฐเชฃเชจเซ€ เชตเชพเชฐเซเชคเชพ, เช…เชฅเชตเชพ "เช†เช—เชณ เช…เชจเซ‡ เช†เช—เชณ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เช เช•เชฐเชตเซเช‚"
[explan.tensor.ru เชชเชฐ เชœเซเช“]

เช‰เชคเซเชคเชฎ เชชเซเชฐเชฆเชฐเซเชถเชจ - เช•เซเชฒ 0.05ms เช…เชจเซ‡ 100KB เช•เชฐเชคเชพเช‚ เชฅเซ‹เชกเซเช‚ เชตเชงเชพเชฐเซ‡ เชตเชพเช‚เชšเชตเซเช‚! เชซเช•เซเชค เช†เชชเชฃเซ‡ เชœ เชญเซ‚เชฒเซ€ เช—เชฏเชพ เชจเชพเชฎ เชฆเซเชตเชพเชฐเชพ เชธเซ‰เชฐเซเชŸ เช•เชฐเซ‹เชœเซ‡เชฅเซ€ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชชเชฐเชฟเชฃเชพเชฎเซ‹เชฎเชพเช‚ เช–เซ‹เชตเชพเชˆ เชจ เชœเชพเชฏ:

SELECT
  *
FROM
  firms
WHERE
  lower(name) LIKE ('ั€ะพะทะฐ' || '%')
ORDER BY
  lower(name)
LIMIT 10;

เชชเซ‹เชธเซเชŸเช—เซเชฐเซ‡เชเชธเช•เซเชฏเซเชเชฒ เชเชจเซเชŸเชฟเชชเซ‡เชŸเชฐเซเชจ: เชจเชพเชฎ เชฆเซเชตเชพเชฐเชพ เชถเซ‹เชงเชจเชพ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เชถเซเชฆเซเชงเชฟเช•เชฐเชฃเชจเซ€ เชตเชพเชฐเซเชคเชพ, เช…เชฅเชตเชพ "เช†เช—เชณ เช…เชจเซ‡ เช†เช—เชณ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เช เช•เชฐเชตเซเช‚"
[explan.tensor.ru เชชเชฐ เชœเซเช“]

เช“เชน, เชนเชตเซ‡ เช•เช‚เชˆเช• เชเชŸเชฒเซเช‚ เชธเซเช‚เชฆเชฐ เชจเชฅเซ€ - เชเชตเซเช‚ เชฒเชพเช—เซ‡ เช›เซ‡ เช•เซ‡ เชคเซเชฏเชพเช‚ เช•เซ‹เชˆ เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพ เช›เซ‡, เชชเชฐเช‚เชคเซ เชธเซ‰เชฐเซเชŸเชฟเช‚เช— เชคเซ‡เชฎเชพเช‚เชฅเซ€ เชชเชธเชพเชฐ เชฅเชˆ เชœเชพเชฏ เช›เซ‡... เช…เชฒเชฌเชคเซเชค, เชคเซ‡ เชชเชนเซ‡เชฒเชพเชจเชพ เชตเชฟเช•เชฒเซเชช เช•เชฐเชคเชพเช‚ เช˜เชฃเซ€ เชตเช–เชค เชตเชงเซ เช…เชธเชฐเช•เชพเชฐเช• เช›เซ‡, เชชเชฐเช‚เชคเซ...

1.4: "เชซเชพเช‡เชฒ เชธเชพเชฅเซ‡ เชธเชฎเชพเชชเซเชค เช•เชฐเซ‹"

เชชเชฐเช‚เชคเซ เชคเซเชฏเชพเช‚ เชเช• เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพ เช›เซ‡ เชœเซ‡ เชคเชฎเชจเซ‡ เชถเซเชฐเซ‡เชฃเซ€ เชฆเซเชตเชพเชฐเชพ เชถเซ‹เชงเชตเชพ เชฎเชพเชŸเซ‡ เชชเชฐเชตเชพเชจเช—เซ€ เช†เชชเซ‡ เช›เซ‡ เช…เชจเซ‡ เชนเชœเซ เชชเชฃ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เชธเซ‰เชฐเซเชŸเชฟเช‚เช—เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡ - เชจเชฟเชฏเชฎเชฟเชค btree!

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;

เชชเซ‹เชธเซเชŸเช—เซเชฐเซ‡เชเชธเช•เซเชฏเซเชเชฒ เชเชจเซเชŸเชฟเชชเซ‡เชŸเชฐเซเชจ: เชจเชพเชฎ เชฆเซเชตเชพเชฐเชพ เชถเซ‹เชงเชจเชพ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เชถเซเชฆเซเชงเชฟเช•เชฐเชฃเชจเซ€ เชตเชพเชฐเซเชคเชพ, เช…เชฅเชตเชพ "เช†เช—เชณ เช…เชจเซ‡ เช†เช—เชณ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เช เช•เชฐเชตเซเช‚"
[explan.tensor.ru เชชเชฐ เชœเซเช“]

เช‰เชคเซเชคเชฎ - เชธเซ‰เชฐเซเชŸเชฟเช‚เช— เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡, เช…เชจเซ‡ เชธเช‚เชธเชพเชงเชจเชจเซ‹ เชตเชชเชฐเชพเชถ "เชฎเชพเช‡เช•เซเชฐเซ‹เชธเซเช•เซ‹เชชเชฟเช•" เชฐเชนเซ‡ เช›เซ‡, "เชถเซเชฆเซเชง" 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 เชฐเซ‡เช–เชพเช“เชจเซ€ เชธเช‚เช–เซเชฏเชพ. เชนเซเช‚ เช•เซเชตเซ‡เชฐเซ€ เช“เชชเซเชŸเชฟเชฎเชพเช‡เชเซ‡เชถเชจเชจเซ€ เช† เชชเชฆเซเชงเชคเชฟ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเซ€ เชฐเชนเซเชฏเซ‹ เช›เซเช‚ เชชเชนเซ‡เชฒเชพเชฅเซ€ เชœ เชฒเช–เซเชฏเซเช‚ เชนเชคเซเช‚.

เชคเซ‹ เชนเชพ, เชนเชตเซ‡ เช†เชชเชฃเซ€ เชชเชพเชธเซ‡ เชŸเซ‡เชฌเชฒ เชชเชฐ เชฌเซ€เชŸเซเชฐเซ€ เช…เชจเซ‡ เชœเชฟเชจ เชฌเช‚เชจเซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ เช†เช‚เช•เชกเชพเช•เซ€เชฏ เชฐเซ€เชคเซ‡ เชคเซ‡ เชคเชพเชฐเชฃ เช†เชชเซ‡ เช›เซ‡ เช•เซ‡ 10% เชฅเซ€ เช“เช›เซ€ เชตเชฟเชจเช‚เชคเซ€เช“ เชฌเซ€เชœเชพ เชฌเซเชฒเซ‹เช•เชจเชพ เช…เชฎเชฒ เชธเซเชงเซ€ เชชเชนเซ‹เช‚เชšเซ‡ เช›เซ‡. เชเชŸเชฒเซ‡ เช•เซ‡, เช•เชพเชฐเซเชฏ เชฎเชพเชŸเซ‡ เช…เช—เชพเช‰เชฅเซ€ เชœเชพเชฃเซ€เชคเซ€ เช†เชตเซ€ เชฒเชพเช•เซเชทเชฃเชฟเช• เชฎเชฐเซเชฏเชพเชฆเชพเช“ เชธเชพเชฅเซ‡, เช…เชฎเซ‡ เชธเชฐเซเชตเชฐ เชธเช‚เชธเชพเชงเชจเซ‹เชจเชพ เช•เซเชฒ เชตเชชเชฐเชพเชถเชจเซ‡ เชฒเช—เชญเช— เชนเชœเชพเชฐ เช—เชฃเซ‹ เช˜เชŸเชพเชกเซ€ เชถเช•เซเชฏเชพ เช›เซ€เช!

1.5*: เช†เชชเชฃเซ‡ เชซเชพเช‡เชฒ เชตเชฟเชจเชพ เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช

เช‰เชชเชฐ LIKE เช…เชฎเชจเซ‡ เช–เซ‹เชŸเชพ เชธเซ‰เชฐเซเชŸเชฟเช‚เช—เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฅเซ€ เช…เชŸเช•เชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เชนเชคเชพ. เชชเชฐเช‚เชคเซ เช“เชชเชฐเซ‡เชŸเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชคเซ‡เชจเซ‡ "เชธเชพเชšเชพ เชฎเชพเชฐเซเช— เชชเชฐ เชธเซ‡เชŸ" เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡:

เชฎเซ‚เชณเชญเซ‚เชค เชฐเซ€เชคเซ‡ เชคเซ‡ เชงเชพเชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ ASC. เชตเชงเซเชฎเชพเช‚, เชคเชฎเซ‡ เช•เชฒเชฎเชฎเชพเช‚ เชšเซ‹เช•เซเช•เชธ เชธเซ‰เชฐเซเชŸ เช‘เชชเชฐเซ‡เชŸเชฐเชจเซเช‚ เชจเชพเชฎ เชธเซเชชเชทเซเชŸ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ USING. เชธเซ‰เชฐเซเชŸ เช‘เชชเชฐเซ‡เชŸเชฐ เชฌเซ€-เชŸเซเชฐเซ€ เช‘เชชเชฐเซ‡เชŸเชฐเซเชธเชจเชพ เช•เซ‡เชŸเชฒเชพเช• เชชเชฐเชฟเชตเชพเชฐเชจเชพ เช•เชฐเชคเชพเช‚ เช“เช›เชพ เช…เชฅเชตเชพ เชตเชงเซเชจเชพ เชธเชญเซเชฏ เชนเซ‹เชตเชพ เชœเซ‹เชˆเช. ASC เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เชธเชฎเช•เช•เซเชท USING < ะธ DESC เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เชธเชฎเช•เช•เซเชท USING >.

เช…เชฎเชพเชฐเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, "เช“เช›เซเช‚" เช›เซ‡ ~<~:

SELECT
  *
FROM
  firms
WHERE
  lower(name) LIKE ('ั€ะพะทะฐ' || '%')
ORDER BY
  lower(name) USING ~<~
LIMIT 10;

เชชเซ‹เชธเซเชŸเช—เซเชฐเซ‡เชเชธเช•เซเชฏเซเชเชฒ เชเชจเซเชŸเชฟเชชเซ‡เชŸเชฐเซเชจ: เชจเชพเชฎ เชฆเซเชตเชพเชฐเชพ เชถเซ‹เชงเชจเชพ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เชถเซเชฆเซเชงเชฟเช•เชฐเชฃเชจเซ€ เชตเชพเชฐเซเชคเชพ, เช…เชฅเชตเชพ "เช†เช—เชณ เช…เชจเซ‡ เช†เช—เชณ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เช เช•เชฐเชตเซเช‚"
[explan.tensor.ru เชชเชฐ เชœเซเช“]

2: เชตเชฟเชจเช‚เชคเซ€เช“ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช–เชพเชŸเซ€ เชฅเชˆ เชœเชพเชฏ เช›เซ‡

เชนเชตเซ‡ เช…เชฎเซ‡ เช…เชฎเชพเชฐเซ€ เชตเชฟเชจเช‚เชคเซ€เชจเซ‡ เช› เชฎเชนเชฟเชจเชพ เช…เชฅเชตเชพ เชเช• เชตเชฐเซเชท เชฎเชพเชŸเซ‡ "เช‰เช•เชณเชตเชพ" เชฎเชพเชŸเซ‡ เช›เซ‹เชกเซ€ เชฆเชˆเช เช›เซ€เช, เช…เชจเซ‡ เชฎเซ‡เชฎเชฐเซ€เชจเชพ เช•เซเชฒ เชฆเซˆเชจเชฟเช• "เชชเชฎเซเชชเชฟเช‚เช—" เชจเชพ เชธเซ‚เชšเช•เชพเช‚เช•เซ‹ เชธเชพเชฅเซ‡ เชคเซ‡เชจเซ‡ เชซเชฐเซ€เชฅเซ€ "เชŸเซ‹เชš เชชเชฐ" เชถเซ‹เชงเซ€เชจเซ‡ เช…เชฎเชจเซ‡ เช†เชถเซเชšเชฐเซเชฏ เชฅเชพเชฏ เช›เซ‡ (เชฌเชซเชฐเซเชธ เชนเชฟเชŸ เชถเซ‡เชฐ เช•เชฐเซ‡ เช›เซ‡) เชฎเชพเช‚ 5.5TB - เชเชŸเชฒเซ‡ เช•เซ‡, เชคเซ‡ เชฎเซ‚เชณ เช•เชฐเชคเชพเช‚ เชชเชฃ เชตเชงเซ.

เชจเชพ, เช…เชฒเชฌเชคเซเชค, เช…เชฎเชพเชฐเซ‹ เชงเช‚เชงเซ‹ เชตเชงเซเชฏเซ‹ เช›เซ‡ เช…เชจเซ‡ เช…เชฎเชพเชฐเซ‹ เชตเชฐเซเช•เชฒเซ‹เชก เชตเชงเซเชฏเซ‹ เช›เซ‡, เชชเชฃ เชคเซ‡เชŸเชฒเซ€ เชœ เชฐเช•เชฎเชฅเซ€ เชจเชนเซ€เช‚! เช†เชจเซ‹ เช…เชฐเซเชฅ เช เช›เซ‡ เช•เซ‡ เช…เชนเซ€เช‚ เช•เช‚เชˆเช• เช—เซ‚เช‚เชšเชตเชฃเชญเชฐเซเชฏเซเช‚ เช›เซ‡ - เชšเชพเชฒเซ‹ เชคเซ‡เชจเซ‡ เชถเซ‹เชงเซ€ เช•เชพเชขเซ€เช.

2.1: เชชเซ‡เชœเชฟเช‚เช—เชจเซ‹ เชœเชจเซเชฎ

เช…เชฎเซเช• เชธเชฎเชฏเซ‡, เชฌเซ€เชœเซ€ เชกเซ‡เชตเชฒเชชเชฎเซ‡เชจเซเชŸ เชŸเซ€เชฎ เชเชกเชชเซ€ เชธเชฌเชธเซเช•เซเชฐเชฟเชชเซเชŸ เชถเซ‹เชงเชฎเชพเช‚เชฅเซ€ เชฐเชœเชฟเชธเซเชŸเซเชฐเซ€เชฎเชพเช‚ เชธเชฎเชพเชจ, เชชเชฐเช‚เชคเซ เชตเชฟเชธเซเชคเซƒเชค เชชเชฐเชฟเชฃเชพเชฎเซ‹ เชธเชพเชฅเซ‡ "เชœเชฎเซเชช" เช•เชฐเชตเชพเชจเซเช‚ เชถเช•เซเชฏ เชฌเชจเชพเชตเชตเชพ เชฎเชพเช‚เช—เชคเซ€ เชนเชคเซ€. เชชเซ‡เชœ เชจเซ‡เชตเชฟเช—เซ‡เชถเชจ เชตเชฟเชจเชพ เชฐเชœเชฟเชธเซเชŸเซเชฐเซ€ เชถเซเช‚ เช›เซ‡? เชšเชพเชฒเซ‹ เชคเซ‡เชจเซ‡ เชธเซเช•เซเชฐเซ‚ เช•เชฐเซ€เช!

( ... LIMIT <N> + 10)
UNION ALL
( ... LIMIT <N> + 10)
LIMIT 10 OFFSET <N>;

เชนเชตเซ‡ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพ เชฎเชพเชŸเซ‡ เช•เซ‹เชˆเชชเชฃ เชคเชฃเชพเชต เชตเชฟเชจเชพ "เชชเซƒเชทเซเช -เชฆเชฐ-เชชเซƒเชทเซเช " เชฒเซ‹เชกเชฟเช‚เช— เชธเชพเชฅเซ‡ เชถเซ‹เชง เชชเชฐเชฟเชฃเชพเชฎเซ‹เชจเซ€ เชฐเชœเชฟเชธเซเชŸเซเชฐเซ€ เชฌเชคเชพเชตเชตเชพเชจเซเช‚ เชถเช•เซเชฏ เชนเชคเซเช‚.

เช…เชฒเชฌเชคเซเชค, เชนเช•เซ€เช•เชคเชฎเชพเช‚, เชกเซ‡เชŸเชพเชจเชพ เชฆเชฐเซ‡เช• เช…เชจเซเช—เชพเชฎเซ€ เชชเซƒเชทเซเช  เชฎเชพเชŸเซ‡ เชตเชงเซเชจเซ‡ เชตเชงเซ เชตเชพเช‚เชšเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ (เชฌเชงเซเช‚ เช…เช—เชพเช‰เชจเชพ เชธเชฎเชฏเชฅเซ€, เชœเซ‡เชจเซ‡ เช†เชชเชฃเซ‡ เช•เชพเชขเซ€ เชจเชพเช–เซ€เชถเซเช‚, เช‰เชชเชฐเชพเช‚เชค เชœเชฐเซ‚เชฐเซ€ "เชชเซ‚เช‚เช›เชกเซ€") - เชเชŸเชฒเซ‡ เช•เซ‡, เช† เชเช• เชธเซเชชเชทเซเชŸ เชเชจเซเชŸเชฟเชชเซ‡เชŸเชฐเซเชจ เช›เซ‡. เชชเชฐเช‚เชคเซ เช‡เชจเซเชŸเชฐเชซเซ‡เชธเชฎเชพเช‚ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เซ€เชฎเชพเช‚เชฅเซ€ เช†เช—เชฒเชพ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชจ เชชเชฐ เชถเซ‹เชง เชถเชฐเซ‚ เช•เชฐเชตเซ€ เชตเชงเซ เชฏเซ‹เช—เซเชฏ เชฐเชนเซ‡เชถเซ‡, เชชเชฐเช‚เชคเซ เชคเซ‡ เชตเชฟเชถเซ‡ เชฌเซ€เชœเซ€ เชตเชพเชฐ.

2.2: เชฎเชพเชฐเซ‡ เช•เช‚เชˆเช• เชตเชฟเชšเชฟเชคเซเชฐ เชœเซ‹เชˆเช เช›เซ‡

เช…เชฎเซเช• เชธเชฎเชฏเซ‡ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพ เช‡เชšเซเช›เชคเซ‹ เชนเชคเซ‹ เชกเซ‡เชŸเชพ เชธเชพเชฅเซ‡ เชชเชฐเชฟเชฃเชพเชฎเซ€ เชจเชฎเซ‚เชจเชพเชจเซ‡ เชตเชฟเชตเชฟเชงเชคเชพ เช†เชชเซ‹ เช…เชจเซเชฏ เช•เซ‹เชทเซเชŸเช•เชฎเชพเช‚เชฅเซ€, เชœเซ‡เชจเชพ เชฎเชพเชŸเซ‡ เชธเชฎเช—เซเชฐ เช…เช—เชพเช‰เชจเซ€ เชตเชฟเชจเช‚เชคเซ€ CTE เชจเซ‡ เชฎเซ‹เช•เชฒเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€:

WITH q AS (
  ...
  LIMIT <N> + 10
)
SELECT
  *
, (SELECT ...) sub_query -- ะบะฐะบะพะน-ั‚ะพ ะทะฐะฟั€ะพั ะบ ัะฒัะทะฐะฝะฝะพะน ั‚ะฐะฑะปะธั†ะต
FROM
  q
LIMIT 10 OFFSET <N>;

เช…เชจเซ‡ เชคเซ‡เชฎ เช›เชคเชพเช‚, เชคเซ‡ เช–เชฐเชพเชฌ เชจเชฅเซ€, เช•เชพเชฐเชฃ เช•เซ‡ เชธเชฌเช•เซเชตเซ‡เชฐเซ€เชจเซเช‚ เชฎเซ‚เชฒเซเชฏเชพเช‚เช•เชจ เชซเช•เซเชค 10 เชชเชฐเชค เช•เชฐเซ‡เชฒเชพ เชฐเซ‡เช•เซ‹เชฐเซเชกเซเชธ เชฎเชพเชŸเซ‡ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชœเซ‹ เชจเชนเซ€เช‚ ...

2.3: DISTINCT เชธเช‚เชตเซ‡เชฆเชจเชพเชนเซ€เชจ เช…เชจเซ‡ เชจเชฟเชฐเซเชฆเชฏ เช›เซ‡

2เชœเซ€ เชธเชฌเช•เซเชตเซ‡เชฐเซ€เชฎเชพเช‚เชฅเซ€ เช†เชตเซ€ เช‰เชคเซเช•เซเชฐเชพเช‚เชคเชฟเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชฎเชพเช‚ เช•เซเชฏเชพเช‚เช• เช–เซ‹เชตเชพเชˆ เช—เชฏเซ‹ NOT LIKE เชถเชฐเชค. เชคเซ‡ เชธเซเชชเชทเซเชŸ เช›เซ‡ เช•เซ‡ เช† เชชเช›เซ€ UNION ALL เชชเชพเช›เชพ เชซเชฐเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเซเชฏเซเช‚ เช•เซ‡เชŸเชฒเซ€เช• เชเชจเซเชŸเซเชฐเซ€เช“ เชฌเซ‡ เชตเชพเชฐ - เชชเซเชฐเชฅเชฎ เชฒเซ€เชŸเซ€เชจเซ€ เชถเชฐเซ‚เช†เชคเชฎเชพเช‚ เชœเซ‹เชตเชพ เชฎเชณเซ‡ เช›เซ‡, เช…เชจเซ‡ เชชเช›เซ€ เชซเชฐเซ€เชฅเซ€ - เช† เชฒเซ€เชŸเซ€เชจเชพ เชชเซเชฐเชฅเชฎ เชถเชฌเซเชฆเชจเซ€ เชถเชฐเซ‚เช†เชคเชฎเชพเช‚. เชฎเชฐเซเชฏเชพเชฆเชพเชฎเชพเช‚, 2เชœเซ€ เชธเชฌเช•เซเชตเซ‡เชฐเซ€เชจเชพเช‚ เชคเชฎเชพเชฎ เชฐเซ‡เช•เซ‹เชฐเซเชกเซเชธ เชชเชนเซ‡เชฒเชพเชจเชพเช‚ เชฐเซ‡เช•เซ‹เชฐเซเชกเซเชธ เชธเชพเชฅเซ‡ เชฎเซ‡เชš เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡.

เช•เชพเชฐเชฃ เชถเซ‹เชงเชตเชพเชจเซ‡ เชฌเชฆเชฒเซ‡ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพ เชถเซเช‚ เช•เชฐเซ‡ เช›เซ‡?.. เช•เซ‹เชˆ เชชเซเชฐเชถเซเชจ เชจเชฅเซ€!

  • เช•เชฆ เชฌเชฎเชฃเซเช‚ เชฎเซ‚เชณ เชจเชฎเซ‚เชจเชพเช“
  • 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>;

เชเชŸเชฒเซ‡ เช•เซ‡, เชคเซ‡ เชธเซเชชเชทเซเชŸ เช›เซ‡ เช•เซ‡ เชชเชฐเชฟเชฃเชพเชฎ, เช…เช‚เชคเซ‡, เชฌเชฐเชพเชฌเชฐ เช เชœ เช›เซ‡, เชชเชฐเช‚เชคเซ 2เชœเซ€ CTE เชธเชฌเช•เซเชตเซ‡เชฐเซ€ เชฎเชพเช‚ "เช‰เชกเชตเชพเชจเซ€" เชคเช• เช˜เชฃเซ€ เชตเชงเซ€ เช—เชˆ เช›เซ‡, เช…เชจเซ‡ เช† เชตเชฟเชจเชพ เชชเชฃ, เชธเซเชชเชทเซเชŸเชชเชฃเซ‡ เชตเชงเซ เชตเชพเช‚เชšเชตเชพ เชฏเซ‹เช—เซเชฏ.

เชชเชฐเช‚เชคเซ เช† เชธเซŒเชฅเซ€ เชฆเซเชƒเช–เชฆ เชฌเชพเชฌเชค เชจเชฅเซ€. เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช เชชเชธเช‚เชฆ เช•เชฐเชตเชพเชจเซเช‚ เช•เชนเซเชฏเซเช‚ เชคเซเชฏเชพเชฐเชฅเซ€ DISTINCT เชšเซ‹เช•เซเช•เชธ เชฒเซ‹เช•เซ‹ เชฎเชพเชŸเซ‡ เชจเชนเซ€เช‚, เชชเชฐเช‚เชคเซ เชเช• เชธเชพเชฅเซ‡ เชคเชฎเชพเชฎ เช•เซเชทเซ‡เชคเซเชฐเซ‹ เชฎเชพเชŸเซ‡ เชฐเซ‡เช•เซ‹เชฐเซเชกเซเชธ, เชชเช›เซ€ เชธเชฌ_เช•เซเชตเซ‡เชฐเซ€ เชซเซ€เชฒเซเชก โ€” เชธเชฌเช•เซเชตเซ‡เชฐเซ€เชจเซเช‚ เชชเชฐเชฟเชฃเชพเชฎ โ€” เชคเซเชฏเชพเช‚ เช†เชชเชฎเซ‡เชณเซ‡ เชธเชฎเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชนเชคเซเช‚. เชนเชตเซ‡, เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ DISTINCT, เชกเซ‡เชŸเชพเชฌเซ‡เช เชชเชนเซ‡เชฒเชพเชฅเซ€ เชœ เชเช•เซเชเชฟเช•เซเชฏเซเชŸ เช•เชฐเชตเชพเชจเซเช‚ เชนเชคเซเช‚ 10 เชธเชฌเช•เซเชตเซ‡เชฐเซ€เช เชจเชนเซ€เช‚, เชชเชฐเช‚เชคเซ เชคเชฎเชพเชฎ <2 * N> + 10!

2.4: เชฌเชงเชพ เช‰เชชเชฐ เชธเชนเช•เชพเชฐ!

เชคเซ‡เชฅเซ€, เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“ เชœเซ€เชตเชคเชพ เชนเชคเชพ - เชคเซ‡เช“ เชชเชฐเซ‡เชถเชพเชจ เช•เชฐเชคเชพ เชจเชนเซ‹เชคเชพ, เช•เชพเชฐเชฃ เช•เซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชชเชพเชธเซ‡ เชธเซเชชเชทเซเชŸเชชเชฃเซ‡ เชฆเชฐเซ‡เช• เช…เชจเซเช—เชพเชฎเซ€ "เชชเซƒเชทเซเช " เชชเซเชฐเชพเชชเซเชค เช•เชฐเชตเชพเชฎเชพเช‚ เชคเซ€เชตเซเชฐ เชฎเช‚เชฆเซ€ เชธเชพเชฅเซ‡ เชจเซ‹เช‚เชงเชชเชพเชคเซเชฐ เชเชจ เชฎเซ‚เชฒเซเชฏเซ‹ เชธเชพเชฅเซ‡ เชฐเชœเชฟเชธเซเชŸเซเชฐเซ€เชจเซ‡ "เชตเซเชฏเชตเชธเซเชฅเชฟเชค" เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชชเซ‚เชฐเชคเซ€ เชงเซ€เชฐเชœ เชจเชนเซ‹เชคเซ€.

เชœเซเชฏเชพเช‚ เชธเซเชงเซ€ เช…เชจเซเชฏ เชตเชฟเชญเชพเช—เชจเชพ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“ เชคเซ‡เชฎเชจเซ€ เชชเชพเชธเซ‡ เช†เชตเซเชฏเชพ เช…เชจเซ‡ เช†เชตเซ€ เช…เชจเซเช•เซ‚เชณ เชชเชฆเซเชงเชคเชฟเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพ เชฎเชพเช‚เช—เชคเชพ เชจ เชนเชคเชพ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เชถเซ‹เชง เชฎเชพเชŸเซ‡ - เชเชŸเชฒเซ‡ เช•เซ‡, เช…เชฎเซ‡ เช•เซ‡เชŸเชฒเชพเช• เชจเชฎเซ‚เชจเชพเชฎเชพเช‚เชฅเซ€ เชเช• เชŸเซเช•เชกเซ‹ เชฒเชˆเช เช›เซ€เช, เชคเซ‡เชจเซ‡ เชตเชงเชพเชฐเชพเชจเซ€ เชถเชฐเชคเซ‹ เชฆเซเชตเชพเชฐเชพ เชซเชฟเชฒเซเชŸเชฐ เช•เชฐเซ€เช เช›เซ€เช, เชชเชฐเชฟเชฃเชพเชฎ เชฆเซ‹เชฐเซ€เช เช›เซ€เช, เชชเช›เซ€ เช†เช—เชณเชจเซ‹ เชญเชพเช— (เชœเซ‡ เช…เชฎเชพเชฐเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ N เชตเชงเชพเชฐเซ€เชจเซ‡ เชชเซเชฐเชพเชชเซเชค เชฅเชพเชฏ เช›เซ‡), เช…เชจเซ‡ เชคเซ‡เชฅเซ€ เชœเซเชฏเชพเช‚ เชธเซเชงเซ€ เช†เชชเชฃเซ‡ เชธเซเช•เซเชฐเซ€เชจ เชญเชฐเซ€เช เชจเชนเซ€เช‚.

เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡, เชชเช•เชกเชพเชฏเซ‡เชฒเชพ เชจเชฎเซ‚เชจเชพเชฎเชพเช‚ N เชฒเช—เชญเช— 17K เชจเชพ เชฎเซ‚เชฒเซเชฏเซ‹ เชชเชฐ เชชเชนเซ‹เช‚เชšเซ€ เช—เชฏเชพ, เช…เชจเซ‡ เชฎเชพเชคเซเชฐ เชเช• เชœ เชฆเชฟเชตเชธเชฎเชพเช‚ เช“เช›เชพเชฎเชพเช‚ เช“เช›เซ€ 4K เช†เชตเซ€ เชตเชฟเชจเช‚เชคเซ€เช“ "เชธเชพเช‚เช•เชณ เชธเชพเชฅเซ‡" เชšเชฒเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€. เชคเซ‡เชฎเชพเช‚เชฅเซ€ เช›เซ‡เชฒเซเชฒเชพเชจเซ‡ เชนเชฟเช‚เชฎเชคเชญเซ‡เชฐ เชธเซเช•เซ‡เชจ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เชนเชคเชพ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชจ เชฆเซ€เช  1GB เชฎเซ‡เชฎเชฐเซ€...

เช•เซเชฒ

เชชเซ‹เชธเซเชŸเช—เซเชฐเซ‡เชเชธเช•เซเชฏเซเชเชฒ เชเชจเซเชŸเชฟเชชเซ‡เชŸเชฐเซเชจ: เชจเชพเชฎ เชฆเซเชตเชพเชฐเชพ เชถเซ‹เชงเชจเชพ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เชถเซเชฆเซเชงเชฟเช•เชฐเชฃเชจเซ€ เชตเชพเชฐเซเชคเชพ, เช…เชฅเชตเชพ "เช†เช—เชณ เช…เชจเซ‡ เช†เช—เชณ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เช เช•เชฐเชตเซเช‚"

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹