เชฎเชพเช‡เช•เซเชฐเซ‹เชธเชฐเซเชตเชฟเชธ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐเชฎเชพเช‚ เช“เชชเชฐเซ‡เชถเชจเชฒ เชเชจเชพเชฒเชฟเชŸเชฟเช•เซเชธ: เชนเซ‡เชฒเซเชช เชเชจเซเชก เชชเซเชฐเซ‹เชฎเซเชชเซเชŸ เชชเซ‹เชธเซเชŸเช—เซเชฐเซ‡เชธ FDW

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

เชฎเชพเช‡เช•เซเชฐเซ‹เชธเชฐเซเชตเชฟเชธ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐเชฎเชพเช‚ เช“เชชเชฐเซ‡เชถเชจเชฒ เชเชจเชพเชฒเชฟเชŸเชฟเช•เซเชธ: เชนเซ‡เชฒเซเชช เชเชจเซเชก เชชเซเชฐเซ‹เชฎเซเชชเซเชŸ เชชเซ‹เชธเซเชŸเช—เซเชฐเซ‡เชธ FDW
เชฎเชพเชฐเซเช‚ เชจเชพเชฎ เชชเชพเชตเซ‡เชฒ เชถเชฟเชตเซ‡เชถ เช›เซ‡, เชกเซ‹เชฎเช•เซเชฒเชฟเช•เชฎเชพเช‚ เชนเซเช‚ เชเช• เชŸเซ€เชฎเชฎเชพเช‚ เช•เชพเชฎ เช•เชฐเซเช‚ เช›เซเช‚ เชœเซ‡ เชตเชฟเชถเซเชฒเซ‡เชทเชฃเชพเชคเซเชฎเช• เชกเซ‡เชŸเชพ เชตเซ‡เชฐเชนเชพเช‰เชธเชจเซ€ เชœเชพเชณเชตเชฃเซ€ เชฎเชพเชŸเซ‡ เชœเชตเชพเชฌเชฆเชพเชฐ เช›เซ‡. เชชเชฐเช‚เชชเชฐเชพเช—เชค เชฐเซ€เชคเซ‡, เช…เชฎเชพเชฐเซ€ เชชเซเชฐเชตเซƒเชคเซเชคเชฟเช“เชจเซ‡ เชกเซ‡เชŸเชพ เชเชจเซเชœเชฟเชจเชฟเชฏเชฐเชฟเช‚เช— เชคเชฐเซ€เช•เซ‡ เชตเชฐเซเช—เซ€เช•เซƒเชค เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡, เชชเชฐเช‚เชคเซ, เชนเช•เซ€เช•เชคเชฎเชพเช‚, เช•เชพเชฐเซเชฏเซ‹เชจเซ€ เชถเซเชฐเซ‡เชฃเซ€ เช˜เชฃเซ€ เชตเชฟเชถเชพเชณ เช›เซ‡. เชกเซ‡เชŸเชพ เชเชจเซเชœเซ€เชจเซ€เชฏเชฐเซ€เช‚เช— เชฎเชพเชŸเซ‡ ETL/ELT เชธเซเชŸเชพเชจเซเชกเชฐเซเชก เช›เซ‡, เชกเซ‡เชŸเชพ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช…เชจเซ‡ เชคเชฎเชพเชฐเชพ เชชเซ‹เชคเชพเชจเชพ เชŸเซ‚เชฒเซเชธเชจเชพ เชตเชฟเช•เชพเชธ เชฎเชพเชŸเซ‡ เชŸเซ‚เชฒเซเชธเชจเซเช‚ เชธเชฎเชฐเซเชฅเชจ เช…เชจเซ‡ เช…เชจเซเช•เซ‚เชฒเชจ เช›เซ‡. เช–เชพเชธ เช•เชฐเซ€เชจเซ‡, เช“เชชเชฐเซ‡เชถเชจเชฒ เชฐเชฟเชชเซ‹เชฐเซเชŸเชฟเช‚เช— เชฎเชพเชŸเซ‡, เช…เชฎเซ‡ "เชกเซ‹เชณ" เช•เชฐเชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚ เช›เซ‡ เช•เซ‡ เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชเช• เชฎเซ‹เชจเซ‹เชฒเชฟเชฅ เช›เซ‡ เช…เชจเซ‡ เชตเชฟเชถเซเชฒเซ‡เชทเช•เซ‹เชจเซ‡ เชเช• เชกเซ‡เชŸเชพเชฌเซ‡เช เช†เชชเชตเชพเชจเซ‹ เช›เซ‡ เชœเซ‡เชฎเชพเช‚ เชคเซ‡เชฎเชจเซ‡ เชœเชฐเซ‚เชฐเซ€ เชคเชฎเชพเชฎ เชกเซ‡เชŸเชพ เชนเชถเซ‡.

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

เชŸเซ‹เชšเชจเชพ เชธเซเชคเชฐเซ‡ เชคเซ‡ เช†เชจเชพ เชœเซ‡เชตเซ‹ เชฆเซ‡เช–เชพเชฏ เช›เซ‡:

เชฎเชพเช‡เช•เซเชฐเซ‹เชธเชฐเซเชตเชฟเชธ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐเชฎเชพเช‚ เช“เชชเชฐเซ‡เชถเชจเชฒ เชเชจเชพเชฒเชฟเชŸเชฟเช•เซเชธ: เชนเซ‡เชฒเซเชช เชเชจเซเชก เชชเซเชฐเซ‹เชฎเซเชชเซเชŸ เชชเซ‹เชธเซเชŸเช—เซเชฐเซ‡เชธ FDW
เชคเซเชฏเชพเช‚ เชเช• PostgreSQL เชกเซ‡เชŸเชพเชฌเซ‡เช เช›เซ‡ เชœเซเชฏเชพเช‚ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“ เชคเซ‡เชฎเชจเชพ เช•เชพเชฐเซเชฏ เชกเซ‡เชŸเชพเชจเซ‡ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡, เช…เชจเซ‡ เชธเซŒเชฅเซ€ เช…เช—เชคเซเชฏเชจเซเช‚, เชคเชฎเชพเชฎ เชธเซ‡เชตเชพเช“เชจเซ€ เชตเชฟเชถเซเชฒเซ‡เชทเชฃเชพเชคเซเชฎเช• เชชเซเชฐเชคเชฟเช•เซƒเชคเชฟเช“ FDW เชฆเซเชตเชพเชฐเชพ เช† เชกเซ‡เชŸเชพเชฌเซ‡เช เชธเชพเชฅเซ‡ เชœเซ‹เชกเชพเชฏเซ‡เชฒ เช›เซ‡. เช†เชจเชพเชฅเซ€ เช˜เชฃเชพ เชกเซ‡เชŸเชพเชฌเซ‡เชธเซ‡เชธ เชชเชฐ เช•เซเชตเซ‡เชฐเซ€ เชฒเช–เชตเชพเชจเซเช‚ เชถเช•เซเชฏ เชฌเชจเซ‡ เช›เซ‡, เช…เชจเซ‡ เชคเซ‡ เชถเซเช‚ เช›เซ‡ เชคเซ‡เชจเชพเชฅเซ€ เช•เซ‹เชˆ เชซเชฐเช• เชชเชกเชคเซ‹ เชจเชฅเซ€: PostgreSQL, MySQL, MongoDB เช…เชฅเชตเชพ เชฌเซ€เชœเซเช‚ เช•เช‚เชˆเช• (เชซเชพเชˆเชฒ, API, เชœเซ‹ เช…เชšเชพเชจเช• เช•เซ‹เชˆ เชฏเซ‹เช—เซเชฏ เชฐเซ‡เชชเชฐ เชจ เชนเซ‹เชฏ, เชคเซ‹ เชคเชฎเซ‡ เชคเชฎเชพเชฐเซเช‚ เชชเซ‹เชคเชพเชจเซเช‚ เชฒเช–เซ€ เชถเช•เซ‹ เช›เซ‹). เชธเชพเชฐเซเช‚, เชฌเชงเซเช‚ เชธเชฐเชธ เชฒเชพเช—เซ‡ เช›เซ‡! เชถเซเช‚ เช†เชชเชฃเซ‡ เชคเซ‚เชŸเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช?

เชœเซ‹ เชฌเชงเซเช‚ เช†เชŸเชฒเซ€ เชเชกเชชเชฅเซ€ เช…เชจเซ‡ เชธเชฐเชณ เชฐเซ€เชคเซ‡ เชธเชฎเชพเชชเซเชค เชฅเชพเชฏ, เชคเซ‹ เชชเช›เซ€, เชธเช‚เชญเชตเชคเชƒ, เชคเซเชฏเชพเช‚ เช•เซ‹เชˆ เชฒเซ‡เช– เชจ เชนเซ‹เชค.

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

เชเช• เชธเชฐเชณ เชชเซเชฐเชถเซเชจ เช…เชจเซ‡ เชคเซ‡เชจเซ€ เชธเชพเชฅเซ‡ เชเช• เชฏเซ‹เชœเชจเชพ

เชชเซ‹เชธเซเชŸเช—เซเชฐเซ‡เชธ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฐเชฟเชฎเซ‹เชŸ เชธเชฐเซเชตเชฐ เชชเชฐ 6 เชฎเชฟเชฒเชฟเชฏเชจ เชชเช‚เช•เซเชคเชฟ เชŸเซ‡เชฌเชฒเชจเซ‡ เชชเซ‚เช›เซ‡ เช›เซ‡ เชคเซ‡ เชฌเชคเชพเชตเชตเชพ เชฎเชพเชŸเซ‡, เชšเชพเชฒเซ‹ เชเช• เชธเชฐเชณ เชฏเซ‹เชœเชจเชพ เชœเซ‹เชˆเช.

explain analyze verbose  
SELECT count(1)
FROM fdw_schema.table;

Aggregate  (cost=418383.23..418383.24 rows=1 width=8) (actual time=3857.198..3857.198 rows=1 loops=1)
  Output: count(1)
  ->  Foreign Scan on fdw_schema."table"  (cost=100.00..402376.14 rows=6402838 width=0) (actual time=4.874..3256.511 rows=6406868 loops=1)
        Output: "table".id, "table".is_active, "table".meta, "table".created_dt
        Remote SQL: SELECT NULL FROM fdw_schema.table
Planning time: 0.986 ms
Execution time: 3857.436 ms

เชตเชฐเซเชฌเซ‹เช เชธเซเชŸเซ‡เชŸเชฎเซ‡เชจเซเชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฅเซ€ เช…เชฎเชจเซ‡ เชฐเชฟเชฎเซ‹เชŸ เชธเชฐเซเชตเชฐเชจเซ‡ เชฎเซ‹เช•เชฒเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ เชคเซ‡ เช•เซเชตเซ‡เชฐเซ€ เชœเซ‹เชตเชพ เชฎเชณเซ‡ เช›เซ‡ เช…เชจเซ‡ เชœเซ‡เชจเชพ เชชเชฐเชฟเชฃเชพเชฎเซ‹ เช…เชฎเซ‡ เช†เช—เชณเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชฎเชพเชŸเซ‡ เชชเซเชฐเชพเชชเซเชค เช•เชฐเซ€เชถเซเช‚ (RemoteSQL เชฒเชพเช‡เชจ).

เชšเชพเชฒเซ‹ เชฅเซ‹เชกเชพ เช†เช—เชณ เชœเชˆเช เช…เชจเซ‡ เช…เชฎเชพเชฐเซ€ เชตเชฟเชจเช‚เชคเซ€เชฎเชพเช‚ เช˜เชฃเชพ เชซเชฟเชฒเซเชŸเชฐเซเชธ เช‰เชฎเซ‡เชฐเซ€เช: เชเช• เชฎเชพเชŸเซ‡ เชฌเซเชฒเชฟเชฏเชจ เช•เซเชทเซ‡เชคเซเชฐ, เช˜เชŸเชจเชพ เชฆเซเชตเชพเชฐเชพ เชเช• เชŸเชพเช‡เชฎเชธเซเชŸเซ‡เชฎเซเชช เช…เช‚เชคเชฐเชพเชฒเชฎเชพเช‚ เช…เชจเซ‡ เชเช• เชฌเชพเชฏ jsonb.

explain analyze verbose
SELECT count(1)
FROM fdw_schema.table 
WHERE is_active is True
AND created_dt BETWEEN CURRENT_DATE - INTERVAL '7 month' 
AND CURRENT_DATE - INTERVAL '6 month'
AND meta->>'source' = 'test';

Aggregate  (cost=577487.69..577487.70 rows=1 width=8) (actual time=27473.818..25473.819 rows=1 loops=1)
  Output: count(1)
  ->  Foreign Scan on fdw_schema."table"  (cost=100.00..577469.21 rows=7390 width=0) (actual time=31.369..25372.466 rows=1360025 loops=1)
        Output: "table".id, "table".is_active, "table".meta, "table".created_dt
        Filter: (("table".is_active IS TRUE) AND (("table".meta ->> 'source'::text) = 'test'::text) AND ("table".created_dt >= (('now'::cstring)::date - '7 mons'::interval)) AND ("table".created_dt <= ((('now'::cstring)::date)::timestamp with time zone - '6 mons'::interval)))
        Rows Removed by Filter: 5046843
        Remote SQL: SELECT created_dt, is_active, meta FROM fdw_schema.table
Planning time: 0.665 ms
Execution time: 27474.118 ms

เช† เชคเซ‡ เช›เซ‡ เชœเซเชฏเชพเช‚ เชชเซเชฐเชถเซเชจเซ‹ เชฒเช–เชคเซ€ เชตเช–เชคเซ‡ เชคเชฎเชพเชฐเซ‡ เชงเซเชฏเชพเชจ เช†เชชเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชซเชฟเชฒเซเชŸเชฐเซเชธ เชฐเชฟเชฎเซ‹เชŸ เชธเชฐเซเชตเชฐ เชชเชฐ เชธเซเชฅเชพเชจเชพเช‚เชคเชฐเชฟเชค เชฅเชฏเชพ เชจ เชนเชคเชพ, เชœเซ‡เชจเซ‹ เช…เชฐเซเชฅ เช›เซ‡ เช•เซ‡ เชคเซ‡เชจเซ‡ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡, เชชเซ‹เชธเซเชŸเช—เซเชฐเซ‡เชธ เชธเซเชฅเชพเชจเชฟเช• เชฐเซ€เชคเซ‡ เชซเชฟเชฒเซเชŸเชฐ เช•เชฐเชตเชพ (เชซเชฟเชฒเซเชŸเชฐ เชชเช‚เช•เซเชคเชฟ) เช…เชจเซ‡ เชเช•เชคเซเชฐเซ€เช•เชฐเชฃ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชคเชฎเชพเชฎ 6 เชฎเชฟเชฒเชฟเชฏเชจ เชชเช‚เช•เซเชคเชฟเช“ เช–เซ‡เช‚เชšเซ‡ เช›เซ‡. เชธเชซเชณเชคเชพเชจเซ€ เชšเชพเชตเซ€ เช เช•เซเชตเซ‡เชฐเซ€ เชฒเช–เชตเชพเชจเซ€ เช›เซ‡ เชœเซ‡เชฅเซ€ เชซเชฟเชฒเซเชŸเชฐเซเชธ เชฐเชฟเชฎเซ‹เชŸ เชฎเชถเซ€เชจ เชชเชฐ เชŸเซเชฐเชพเชจเซเชธเชซเชฐ เชฅเชพเชฏ เช…เชจเซ‡ เช…เชฎเซ‡ เชซเช•เซเชค เชœเชฐเซ‚เชฐเซ€ เชชเช‚เช•เซเชคเชฟเช“ เชชเซเชฐเชพเชชเซเชค เช•เชฐเซ€เช เช›เซ€เช เช…เชจเซ‡ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเซ€เช เช›เซ€เช.

เชคเซ‡ เช•เซ‡เชŸเชฒเซ€เช• เชฌเซเชฒเชจเชถเซ€เชŸ เช›เซ‡

เชฌเซเชฒเชฟเชฏเชจ เช•เซเชทเซ‡เชคเซเชฐเซ‹ เชธเชพเชฅเซ‡ เชฌเชงเซเช‚ เชธเชฐเชณ เช›เซ‡. เชฎเซ‚เชณ เชตเชฟเชจเช‚เชคเซ€เชฎเชพเช‚, เชธเชฎเชธเซเชฏเชพ เช“เชชเชฐเซ‡เชŸเชฐเชจเซ‡ เช•เชพเชฐเชฃเซ‡ เชนเชคเซ€ is. เชœเซ‹ เชคเชฎเซ‡ เชคเซ‡เชจเซ€ เชธเชพเชฅเซ‡ เชฌเชฆเชฒเซ‹ =, เชชเช›เซ€ เช†เชชเชฃเชจเซ‡ เชจเซ€เชšเซ‡เชจเซเช‚ เชชเชฐเชฟเชฃเชพเชฎ เชฎเชณเซ‡ เช›เซ‡:

explain analyze verbose
SELECT count(1)
FROM fdw_schema.table
WHERE is_active = True
AND created_dt BETWEEN CURRENT_DATE - INTERVAL '7 month' 
AND CURRENT_DATE - INTERVAL '6 month'
AND meta->>'source' = 'test';

Aggregate  (cost=508010.14..508010.15 rows=1 width=8) (actual time=19064.314..19064.314 rows=1 loops=1)
  Output: count(1)
  ->  Foreign Scan on fdw_schema."table"  (cost=100.00..507988.44 rows=8679 width=0) (actual time=33.035..18951.278 rows=1360025 loops=1)
        Output: "table".id, "table".is_active, "table".meta, "table".created_dt
        Filter: ((("table".meta ->> 'source'::text) = 'test'::text) AND ("table".created_dt >= (('now'::cstring)::date - '7 mons'::interval)) AND ("table".created_dt <= ((('now'::cstring)::date)::timestamp with time zone - '6 mons'::interval)))
        Rows Removed by Filter: 3567989
        Remote SQL: SELECT created_dt, meta FROM fdw_schema.table WHERE (is_active)
Planning time: 0.834 ms
Execution time: 19064.534 ms

เชœเซ‡เชฎ เชคเชฎเซ‡ เชœเซ‹เชˆ เชถเช•เซ‹ เช›เซ‹, เชซเชฟเชฒเซเชŸเชฐ เชฐเชฟเชฎเซ‹เชŸ เชธเชฐเซเชตเชฐ เชชเชฐ เช‰เชกเชพเชจ เชญเชฐเซ€, เช…เชจเซ‡ เชเช•เซเชเซ‡เช•เซเชฏเซเชถเชจเชจเซ‹ เชธเชฎเชฏ 27 เชฅเซ€ 19 เชธเซ‡เช•เช‚เชก เชธเซเชงเซ€ เช˜เชŸเชพเชกเซ€ เชฆเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹.

เชจเซ‹เช‚เชงเชจเซ€เชฏ เช›เซ‡ เช•เซ‡ เช“เชชเชฐเซ‡เชŸเชฐ is เช“เชชเชฐเซ‡เชŸเชฐเชฅเซ€ เช…เชฒเช— = เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡ เชจเชฒ เชตเซ‡เชฒเซเชฏเซ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡. เชคเซ‡เชจเซ‹ เช…เชฐเซเชฅ เช เช›เซ‡ เช•เซ‡ เชธเชพเชšเซเช‚ เชจเชฅเซ€ เชซเชฟเชฒเซเชŸเชฐเชฎเชพเช‚ False เช…เชจเซ‡ Null เชฎเซ‚เชฒเซเชฏเซ‹ เช›เซ‹เชกเซ€ เชฆเซ‡เชถเซ‡, เชœเซเชฏเชพเชฐเซ‡ != เชธเชพเชšเซเช‚ เชฎเชพเชคเซเชฐ เช–เซ‹เชŸเชพ เชฎเซ‚เชฒเซเชฏเซ‹ เชœ เช›เซ‹เชกเชถเซ‡. เชคเซ‡เชฅเซ€, เชœเซเชฏเชพเชฐเซ‡ เช“เชชเชฐเซ‡เชŸเชฐเชจเซ‡ เชฌเชฆเชฒเซ€ เชฐเชนเซเชฏเชพ เชนเซ‹เชฏ เชจเชฅเซ€ OR เช“เชชเชฐเซ‡เชŸเชฐ เชธเชพเชฅเซ‡เชจเซ€ เชฌเซ‡ เชถเชฐเชคเซ‹ เชซเชฟเชฒเซเชŸเชฐเชจเซ‡ เชชเชธเชพเชฐ เช•เชฐเชตเซ€ เชœเซ‹เชˆเช, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, WHERE (col != True) เช…เชฅเชตเชพ (col null เช›เซ‡).

เช…เชฎเซ‡ เชฌเซเชฒเชฟเชฏเชจ เชธเชพเชฅเซ‡ เชตเซเชฏเชตเชนเชพเชฐ เช•เชฐเซเชฏเซ‹ เช›เซ‡, เชšเชพเชฒเซ‹ เช†เช—เชณ เชตเชงเซ€เช. เชนเชฎเชฃเชพเช‚ เชฎเชพเชŸเซ‡, เชšเชพเชฒเซ‹ เช…เชจเซเชฏ เชซเซ‡เชฐเชซเชพเชฐเซ‹เชจเซ€ เช…เชธเชฐเชจเซ‡ เชธเซเชตเชคเช‚เชคเซเชฐ เชฐเซ€เชคเซ‡ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเซ‡เชตเชพ เชฎเชพเชŸเซ‡ เชฌเซเชฒเชฟเชฏเชจ เชซเชฟเชฒเซเชŸเชฐเชจเซ‡ เชคเซ‡เชจเชพ เชฎเซ‚เชณ เชธเซเชตเชฐเซ‚เชชเชฎเชพเช‚ เชชเชฐเชค เช•เชฐเซ€เช.

เชŸเชพเช‡เชฎเชธเซเชŸเซ‡เชฎเซเชชเชŸเซเช? hz

เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡, เชคเชฎเชพเชฐเซ‡ เชตเชพเชฐเช‚เชตเชพเชฐ เชชเซเชฐเชฏเซ‹เช— เช•เชฐเชตเซ‹ เชชเชกเซ‡ เช›เซ‡ เช•เซ‡ เชฐเชฟเชฎเซ‹เชŸ เชธเชฐเซเชตเชฐ เชถเชพเชฎเซ‡เชฒ เชนเซ‹เชฏ เชคเซ‡เชตเซ€ เชตเชฟเชจเช‚เชคเซ€ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฏเซ‹เช—เซเชฏ เชฐเซ€เชคเซ‡ เชฒเช–เชตเซ€, เช…เชจเซ‡ เชคเซ‡ เชชเช›เซ€ เชœ เช†เชตเซเช‚ เชถเชพ เชฎเชพเชŸเซ‡ เชฅเชพเชฏ เช›เซ‡ เชคเซ‡เชจเซ€ เชธเชฎเชœเซ‚เชคเซ€ เชถเซ‹เชงเซ‹. เช‡เชจเซเชŸเชฐเชจเซ‡เชŸ เชชเชฐ เช† เชตเชฟเชถเซ‡ เชฌเชนเซ เช“เช›เซ€ เชฎเชพเชนเชฟเชคเซ€ เชฎเชณเซ€ เชถเช•เซ‡ เช›เซ‡. เชคเซ‡เชฅเซ€, เชชเซเชฐเชฏเซ‹เช—เซ‹เชฎเชพเช‚ เช…เชฎเชจเซ‡ เชœเชพเชฃเชตเชพ เชฎเชณเซเชฏเซเช‚ เช•เซ‡ เชเช• เชจเชฟเชถเซเชšเชฟเชค เชคเชพเชฐเซ€เช– เชซเชฟเชฒเซเชŸเชฐ เชงเชกเชพเช•เชพ เชธเชพเชฅเซ‡ เชฐเชฟเชฎเซ‹เชŸ เชธเชฐเซเชตเชฐ เชชเชฐ เช‰เชกเซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ เชœเซเชฏเชพเชฐเซ‡ เช†เชชเชฃเซ‡ เชคเชพเชฐเซ€เช–เชจเซ‡ เช—เชคเชฟเชถเซ€เชฒ เชฐเซ€เชคเซ‡ เชธเซ‡เชŸ เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ€เช เช›เซ€เช, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, now() เช…เชฅเชตเชพ CURRENT_DATE, เชคเซ‹ เช†เชตเซเช‚ เชฅเชคเซเช‚ เชจเชฅเซ€. เช…เชฎเชพเชฐเชพ เช‰เชฆเชพเชนเชฐเชฃเชฎเชพเช‚, เช…เชฎเซ‡ เชเช• เชซเชฟเชฒเซเชŸเชฐ เช‰เชฎเซ‡เชฐเซเชฏเซเช‚ เชœเซ‡เชฅเซ€ เช•เชฐเซ€เชจเซ‡ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒ เช•เซ‰เชฒเชฎเชฎเชพเช‚ เชญเซ‚เชคเช•เชพเชณเชฎเชพเช‚ เชฌเชฐเชพเชฌเชฐ 1 เชฎเชนเชฟเชจเชพเชจเซ‹ เชกเซ‡เชŸเชพ เชนเซ‹เชฏ (CURRENT_DATE - INTERVAL '7 เชฎเชนเชฟเชจเซ‹' เช…เชจเซ‡ CURRENT_DATE - INTERVAL '6 เชฎเชนเชฟเชจเซ‹' เชตเชšเซเชšเซ‡). เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ เช…เชฎเซ‡ เชถเซเช‚ เช•เชฐเซเชฏเซเช‚?

explain analyze verbose
SELECT count(1)
FROM fdw_schema.table 
WHERE is_active is True
AND created_dt >= (SELECT CURRENT_DATE::timestamptz - INTERVAL '7 month') 
AND created_dt <(SELECT CURRENT_DATE::timestamptz - INTERVAL '6 month')
AND meta->>'source' = 'test';

Aggregate  (cost=306875.17..306875.18 rows=1 width=8) (actual time=4789.114..4789.115 rows=1 loops=1)
  Output: count(1)
  InitPlan 1 (returns $0)
    ->  Result  (cost=0.00..0.02 rows=1 width=8) (actual time=0.007..0.008 rows=1 loops=1)
          Output: ((('now'::cstring)::date)::timestamp with time zone - '7 mons'::interval)
  InitPlan 2 (returns $1)
    ->  Result  (cost=0.00..0.02 rows=1 width=8) (actual time=0.002..0.002 rows=1 loops=1)
          Output: ((('now'::cstring)::date)::timestamp with time zone - '6 mons'::interval)
  ->  Foreign Scan on fdw_schema."table"  (cost=100.02..306874.86 rows=105 width=0) (actual time=23.475..4681.419 rows=1360025 loops=1)
        Output: "table".id, "table".is_active, "table".meta, "table".created_dt
        Filter: (("table".is_active IS TRUE) AND (("table".meta ->> 'source'::text) = 'test'::text))
        Rows Removed by Filter: 76934
        Remote SQL: SELECT is_active, meta FROM fdw_schema.table WHERE ((created_dt >= $1::timestamp with time zone)) AND ((created_dt < $2::timestamp with time zone))
Planning time: 0.703 ms
Execution time: 4789.379 ms

เช…เชฎเซ‡ เช†เชฏเซ‹เชœเช•เชจเซ‡ เช…เช—เชพเช‰เชฅเซ€ เชธเชฌเช•เซเชตเซ‡เชฐเซ€เชฎเชพเช‚ เชคเชพเชฐเซ€เช–เชจเซ€ เช—เชฃเชคเชฐเซ€ เช•เชฐเชตเชพ เช…เชจเซ‡ เชคเซˆเชฏเชพเชฐ เชตเซ‡เชฐเซ€เชเชฌเชฒเชจเซ‡ เชซเชฟเชฒเซเชŸเชฐเชฎเชพเช‚ เชชเชพเชธ เช•เชฐเชตเชพเชจเซเช‚ เช•เชนเซเชฏเซเช‚. เช…เชจเซ‡ เช† เชธเช‚เช•เซ‡เชคเซ‡ เช…เชฎเชจเซ‡ เชเช• เช‰เชคเซเชคเชฎ เชชเชฐเชฟเชฃเชพเชฎ เช†เชชเซเชฏเซเช‚, เชตเชฟเชจเช‚เชคเซ€ เชฒเช—เชญเช— 6 เช—เชฃเซ€ เชเชกเชชเซ€ เชฌเชจเซ€!

เชซเชฐเซ€เชฅเซ€, เช…เชนเซ€เช‚ เชธเชพเชตเชšเซ‡เชคเซ€ เชฐเชพเช–เชตเซ€ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡: เชธเชฌเช•เซเชตเซ‡เชฐเซ€เชจเซ‹ เชกเซ‡เชŸเชพ เชชเซเชฐเช•เชพเชฐ เช เชซเซ€เชฒเซเชก เชœเซ‡เชตเซ‹ เชœ เชนเซ‹เชตเซ‹ เชœเซ‹เชˆเช เช•เซ‡ เชœเซ‡เชจเชพ เชชเชฐ เช†เชชเชฃเซ‡ เชซเชฟเชฒเซเชŸเชฐ เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช, เช…เชจเซเชฏเชฅเชพ เชชเซเชฒเชพเชจเชฐ เชจเช•เซเช•เซ€ เช•เชฐเชถเซ‡ เช•เซ‡ เชชเซเชฐเช•เชพเชฐเซ‹ เช…เชฒเช— เชนเซ‹เชตเชพเชจเซ‡ เช•เชพเชฐเชฃเซ‡, เชธเซŒเชชเซเชฐเชฅเชฎ เชฌเชงเซเช‚ เชฎเซ‡เชณเชตเชตเซเช‚ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡. เชกเซ‡เชŸเชพ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชธเซเชฅเชพเชจเชฟเช• เชฐเซ€เชคเซ‡ เชซเชฟเชฒเซเชŸเชฐ เช•เชฐเซ‹.

เชšเชพเชฒเซ‹ เชคเชพเชฐเซ€เช– เชซเชฟเชฒเซเชŸเชฐเชจเซ‡ เชคเซ‡เชจเชพ เชฎเซ‚เชณ เชฎเซ‚เชฒเซเชฏเชฎเชพเช‚ เชชเชฐเชค เช•เชฐเซ€เช.

เชซเซเชฐเซ‡เชกเซ€ เชตเชฟ. เชœเซ‡เชธเซ‹เชจเชฌ

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

explain analyze verbose
SELECT count(1)
FROM fdw_schema.table 
WHERE is_active is True
AND created_dt BETWEEN CURRENT_DATE - INTERVAL '7 month' 
AND CURRENT_DATE - INTERVAL '6 month'
AND meta @> '{"source":"test"}'::jsonb;

Aggregate  (cost=245463.60..245463.61 rows=1 width=8) (actual time=6727.589..6727.590 rows=1 loops=1)
  Output: count(1)
  ->  Foreign Scan on fdw_schema."table"  (cost=1100.00..245459.90 rows=1478 width=0) (actual time=16.213..6634.794 rows=1360025 loops=1)
        Output: "table".id, "table".is_active, "table".meta, "table".created_dt
        Filter: (("table".is_active IS TRUE) AND ("table".created_dt >= (('now'::cstring)::date - '7 mons'::interval)) AND ("table".created_dt <= ((('now'::cstring)::date)::timestamp with time zone - '6 mons'::interval)))
        Rows Removed by Filter: 619961
        Remote SQL: SELECT created_dt, is_active FROM fdw_schema.table WHERE ((meta @> '{"source": "test"}'::jsonb))
Planning time: 0.747 ms
Execution time: 6727.815 ms

เช“เชชเชฐเซ‡เชŸเชฐเซ‹เชจเซ‡ เชซเชฟเชฒเซเชŸเชฐ เช•เชฐเชตเชพเชจเซ‡ เชฌเชฆเชฒเซ‡, เชคเชฎเชพเชฐเซ‡ เชเช• เช“เชชเชฐเซ‡เชŸเชฐเชจเซ€ เชนเชพเชœเชฐเซ€เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹ เช†เชตเชถเซเชฏเช• เช›เซ‡ jsonb เชเช• เช…เชฒเช— เชฎเชพเช‚. เชฎเซ‚เชณ 7 เชจเซ‡ เชฌเชฆเชฒเซ‡ 29 เชธเซ‡เช•เช‚เชก jsonb เชฐเชฟเชฎเซ‹เชŸ เชธเชฐเซเชตเชฐ เชชเชฐ, เชชเชฐเช‚เชคเซ เช…เชนเซ€เช‚ เชเช• เชฎเชฐเซเชฏเชพเชฆเชพ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเซ‡เชตเซ€ เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เช›เซ‡: เช…เชฎเซ‡ เชกเซ‡เชŸเชพเชฌเซ‡เชเชจเชพ เชธเช‚เชธเซเช•เชฐเชฃ 9.6 เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช, เชชเชฐเช‚เชคเซ เชเชชเซเชฐเชฟเชฒเชจเชพ เช…เช‚เชค เชธเซเชงเซ€เชฎเชพเช‚ เช…เชฎเซ‡ เช›เซ‡เชฒเซเชฒเซ€ เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เชชเซ‚เชฐเซเชฃ เช•เชฐเชตเชพเชจเซ€ เช…เชจเซ‡ เชธเช‚เชธเซเช•เชฐเชฃ 12 เชชเชฐ เชœเชตเชพเชจเซ€ เชฏเซ‹เชœเชจเชพ เชฌเชจเชพเชตเซ€เช เช›เซ€เช. เชเช•เชตเชพเชฐ เช…เชฎเซ‡ เช…เชชเชกเซ‡เชŸ เช•เชฐเซ€เช, เชชเช›เซ€ เช…เชฎเซ‡ เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช…เชธเชฐ เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡ เชตเชฟเชถเซ‡ เชฒเช–เซ€เชถเซเช‚, เช•เชพเชฐเชฃ เช•เซ‡ เชคเซเชฏเชพเช‚ เช˜เชฃเชพ เชฌเชงเชพ เชซเซ‡เชฐเชซเชพเชฐเซ‹ เช›เซ‡ เชœเซ‡เชจเชพ เชฎเชพเชŸเซ‡ เช˜เชฃเซ€ เช†เชถเชพ เช›เซ‡: json_path, เชจเชตเซเช‚ CTE เชตเชฐเซเชคเชจ, เชฆเชฌเชพเชฃ เชกเชพเช‰เชจ (เชธเช‚เชธเซเช•เชฐเชฃ 10 เชฅเซ€ เช…เชธเซเชคเชฟเชคเซเชตเชฎเชพเช‚ เช›เซ‡). เชนเซเช‚ เช–เชฐเซ‡เช–เชฐ เชคเซ‡เชจเซ‡ เชœเชฒเซเชฆเซ€ เช…เชœเชฎเชพเชตเชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚.

เชคเซ‡เชจเซ‡ เชชเซ‚เชฐเซ‹ เช•เชฐเซ€ เชจเชพเช–

เช…เชฎเซ‡ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเซเชฏเซเช‚ เช›เซ‡ เช•เซ‡ เชฆเชฐเซ‡เช• เชซเซ‡เชฐเชซเชพเชฐ เชตเชฟเชจเช‚เชคเซ€เชจเซ€ เชเชกเชชเชจเซ‡ เชตเซเชฏเช•เซเชคเชฟเช—เชค เชฐเซ€เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช…เชธเชฐ เช•เชฐเซ‡ เช›เซ‡. เชšเชพเชฒเซ‹ เชนเชตเซ‡ เชœเซ‹เชˆเช เช•เซ‡ เชœเซเชฏเชพเชฐเซ‡ เชคเซเชฐเชฃเซ‡เชฏ เชซเชฟเชฒเซเชŸเชฐ เชฏเซ‹เช—เซเชฏ เชฐเซ€เชคเซ‡ เชฒเช–เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เชคเซเชฏเชพเชฐเซ‡ เชถเซเช‚ เชฅเชพเชฏ เช›เซ‡.

explain analyze verbose
SELECT count(1)
FROM fdw_schema.table 
WHERE is_active = True
AND created_dt >= (SELECT CURRENT_DATE::timestamptz - INTERVAL '7 month') 
AND created_dt <(SELECT CURRENT_DATE::timestamptz - INTERVAL '6 month')
AND meta @> '{"source":"test"}'::jsonb;

Aggregate  (cost=322041.51..322041.52 rows=1 width=8) (actual time=2278.867..2278.867 rows=1 loops=1)
  Output: count(1)
  InitPlan 1 (returns $0)
    ->  Result  (cost=0.00..0.02 rows=1 width=8) (actual time=0.010..0.010 rows=1 loops=1)
          Output: ((('now'::cstring)::date)::timestamp with time zone - '7 mons'::interval)
  InitPlan 2 (returns $1)
    ->  Result  (cost=0.00..0.02 rows=1 width=8) (actual time=0.003..0.003 rows=1 loops=1)
          Output: ((('now'::cstring)::date)::timestamp with time zone - '6 mons'::interval)
  ->  Foreign Scan on fdw_schema."table"  (cost=100.02..322041.41 rows=25 width=0) (actual time=8.597..2153.809 rows=1360025 loops=1)
        Output: "table".id, "table".is_active, "table".meta, "table".created_dt
        Remote SQL: SELECT NULL FROM fdw_schema.table WHERE (is_active) AND ((created_dt >= $1::timestamp with time zone)) AND ((created_dt < $2::timestamp with time zone)) AND ((meta @> '{"source": "test"}'::jsonb))
Planning time: 0.820 ms
Execution time: 2279.087 ms

เชนเชพ, เชตเชฟเชจเช‚เชคเซ€ เชตเชงเซ เชœเชŸเชฟเชฒ เชฒเชพเช—เซ‡ เช›เซ‡, เช† เชซเชฐเชœเชฟเชฏเชพเชค เชซเซ€ เช›เซ‡, เชชเชฐเช‚เชคเซ เช…เชฎเชฒเชจเซ€ เชเชกเชช 2 เชธเซ‡เช•เชจเซเชก เช›เซ‡, เชœเซ‡ 10 เช—เชฃเชพ เช•เชฐเชคเชพเช‚ เชตเชงเซ เชเชกเชชเซ€ เช›เซ‡! เช…เชจเซ‡ เช…เชฎเซ‡ เชชเซเชฐเชฎเชพเชฃเชฎเชพเช‚ เชจเชพเชจเชพ เชกเซ‡เชŸเชพ เชธเซ‡เชŸ เชธเชพเชฎเซ‡ เชเช• เชธเชฐเชณ เช•เซเชตเซ‡เชฐเซ€ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช. เชตเชพเชธเซเชคเชตเชฟเช• เชตเชฟเชจเช‚เชคเซ€เช“ เชชเชฐ, เช…เชฎเชจเซ‡ เช•เซ‡เชŸเชฒเชพเช• เชธเซ‹ เช—เชฃเซ‹ เชตเชงเชพเชฐเซ‹ เชฎเชณเซเชฏเซ‹ เช›เซ‡.

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

เชคเชฎเชพเชฐเชพ เชงเซเชฏเชพเชจ เชฌเชฆเชฒ เช†เชญเชพเชฐ! เชฎเชจเซ‡ เชŸเชฟเชชเซเชชเชฃเซ€เช“เชฎเชพเช‚ เชคเชฎเชพเชฐเชพ เช…เชจเซเชญเชตเซ‹ เชตเชฟเชถเซ‡ เชชเซเชฐเชถเซเชจเซ‹, เชŸเชฟเชชเซเชชเชฃเซ€เช“ เช…เชจเซ‡ เชตเชพเชฐเซเชคเชพเช“ เชธเชพเช‚เชญเชณเชตเซ€ เช—เชฎเชถเซ‡.

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

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