แž€แžถแžšแžŸแžถแž€แž›แŸ’แž”แž„แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž“แŸƒแžŸแŸ†แžŽแžฝแžšแžœแžทแž—แžถแž‚แž“แŸ…แž€แŸ’แž“แžปแž„ PostgreSQL, ClickHouse แž“แžทแž„ clickhousedb_fdw (PostgreSQL)

แž“แŸ…แž€แŸ’แž“แžปแž„แž€แžถแžšแžŸแžทแž€แŸ’แžŸแžถแž“แŸแŸ‡ แžแŸ’แž‰แžปแŸ†แž…แž„แŸ‹แžƒแžพแž‰แž€แžถแžšแž€แŸ‚แž›แž˜แŸ’แžขแž€แžถแžšแžขแž“แžปแžœแžแŸ’แžแžŠแŸ‚แž›แžขแžถแž…แžŸแž˜แŸ’แžšแŸแž…แž”แžถแž“แžŠแŸ„แž™แž”แŸ’แžšแžพแž”แŸ’แžšแž—แž–แž‘แžทแž“แŸ’แž“แž“แŸแž™ ClickHouse แž‡แžถแž‡แžถแž„ PostgreSQL แŸ” แžแŸ’แž‰แžปแŸ†แžŠแžนแž„แž–แžธแžขแžแŸ’แžแž”แŸ’แžšแž™แŸ„แž‡แž“แŸแž•แž›แžทแžแž—แžถแž–แžŠแŸ‚แž›แžแŸ’แž‰แžปแŸ†แž‘แž‘แžฝแž›แž”แžถแž“แž–แžธแž€แžถแžšแž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹ ClickHouse แŸ” แžแžพแžขแžแŸ’แžแž”แŸ’แžšแž™แŸ„แž‡แž“แŸแž‘แžถแŸ†แž„แž“แŸแŸ‡แž“แžนแž„แž”แž“แŸ’แžแžŠแŸ‚แžšแžฌแž‘แŸ แž”แŸ’แžšแžŸแžทแž“แž”แžพแžแŸ’แž‰แžปแŸ†แž…แžผแž›แž”แŸ’แžšแžพ ClickHouse แž–แžธ PostgreSQL แžŠแŸ„แž™แž”แŸ’แžšแžพ Foreign Data Wrapper (FDW)?

แž”แžšแžทแžŸแŸ’แžแžถแž“แž˜แžผแž›แžŠแŸ’แž‹แžถแž“แž‘แžทแž“แŸ’แž“แž“แŸแž™แžŠแŸ‚แž›แž”แžถแž“แžŸแžทแž€แŸ’แžŸแžถแž‚แžบ PostgreSQL v11, clickhousedb_fdw แž“แžทแž„แž˜แžผแž›แžŠแŸ’แž‹แžถแž“แž‘แžทแž“แŸ’แž“แž“แŸแž™ ClickHouse แŸ” แž‘แžธแž”แŸ†แž•แžปแž แž–แžธ PostgreSQL v11 แž™แžพแž„แž“แžนแž„แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžŸแŸ†แžŽแžฝแžš SQL แž•แŸ’แžŸแŸแž„แŸ—แžŠแŸ‚แž›แž”แž‰แŸ’แž‡แžผแž“แžแžถแž˜แžšแž™แŸˆ clickhousedb_fdw แžšแž”แžŸแŸ‹แž™แžพแž„แž‘แŸ…แž€แžถแž“แŸ‹แž˜แžผแž›แžŠแŸ’แž‹แžถแž“แž‘แžทแž“แŸ’แž“แž“แŸแž™ ClickHouse แŸ” แž”แž“แŸ’แž‘แžถแž”แŸ‹แž˜แž€แž™แžพแž„แž“แžนแž„แžƒแžพแž‰แž–แžธแžšแž”แŸ€แž”แžŠแŸ‚แž›แž€แžถแžšแžขแž“แžปแžœแžแŸ’แžแžšแž”แžŸแŸ‹ FDW แž”แŸ’แžšแŸ€แž”แž’แŸ€แž”แž‘แŸ…แž“แžนแž„แžŸแŸ†แžŽแžฝแžšแžŠแžผแž…แž‚แŸ’แž“แžถแžŠแŸ‚แž›แž€แŸ†แž–แžปแž„แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž“แŸ…แž€แŸ’แž“แžปแž„ PostgreSQL แžŠแžพแž˜ แž“แžทแž„ ClickHouse แžŠแžพแž˜แŸ”

แž˜แžผแž›แžŠแŸ’แž‹แžถแž“แž‘แžทแž“แŸ’แž“แž“แŸแž™ Clickhouse

ClickHouse แž‚แžบแž‡แžถแž”แŸ’แžšแž–แŸแž“แŸ’แž’แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„แž˜แžผแž›แžŠแŸ’แž‹แžถแž“แž‘แžทแž“แŸ’แž“แž“แŸแž™ columnar แž”แŸ’แžšแž—แž–แž”แžพแž€แž…แŸ†แž  แžŠแŸ‚แž›แžขแžถแž…แžŸแž˜แŸ’แžšแŸแž…แž”แžถแž“แž“แžผแžœแž€แžถแžšแžขแž“แžปแžœแžแŸ’แž 100-1000 แžŠแž„แž›แžฟแž“แž‡แžถแž„แžœแžทแž’แžธแžŸแžถแžŸแŸ’แžšแŸ’แžแž˜แžผแž›แžŠแŸ’แž‹แžถแž“แž‘แžทแž“แŸ’แž“แž“แŸแž™แž”แŸ’แžšแž–แŸƒแžŽแžธ แžŠแŸ‚แž›แž˜แžถแž“แžŸแž˜แžแŸ’แžแž—แžถแž–แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž›แžพแž‡แžฝแžšแž˜แžฝแž™แž–แžถแž“แŸ‹แž›แžถแž“แž€แŸ’แž“แžปแž„แžšแž™แŸˆแž–แŸแž›แžแžทแž…แž‡แžถแž„แž˜แžฝแž™แžœแžทแž“แžถแž‘แžธแŸ”

Clickhousedb_fdw

clickhousedb_fdw - แž€แž‰แŸ’แž…แž”แŸ‹แž‘แžทแž“แŸ’แž“แž“แŸแž™แžแžถแž„แž€แŸ’แžšแŸ…แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž˜แžผแž›แžŠแŸ’แž‹แžถแž“แž‘แžทแž“แŸ’แž“แž“แŸแž™ ClickHouse แžฌ FDW แž‚แžบแž‡แžถแž‚แž˜แŸ’แžšแŸ„แž„แž”แŸ’แžšแž—แž–แž”แžพแž€แž…แŸ†แž แž–แžธ Percona แŸ” แž“แŸแŸ‡แž‚แžบแž‡แžถแžแŸ†แžŽแž—แŸ’แž‡แžถแž”แŸ‹แž‘แŸ…แž€แžถแž“แŸ‹แžƒแŸ’แž›แžถแŸ†แž„ GitHub แžšแž”แžŸแŸ‹แž‚แž˜แŸ’แžšแŸ„แž„.

แž“แŸ…แžแŸ‚แž˜แžธแž“แžถแžแŸ’แž‰แžปแŸ†แž”แžถแž“แžŸแžšแžŸแŸแžšแž”แŸ’แž›แž€แŸ‹แž˜แžฝแž™แžŠแŸ‚แž›แž”แŸ’แžšแžถแž”แŸ‹แžขแŸ’แž“แž€แž”แž“แŸ’แžแŸ‚แž˜แžขแŸ†แž–แžธ FDW แžšแž”แžŸแŸ‹แž™แžพแž„แŸ”.

แžŠแžผแž…แžŠแŸ‚แž›แžขแŸ’แž“แž€แž“แžนแž„แžƒแžพแž‰ แžœแžถแž•แŸ’แžแž›แŸ‹แž“แžผแžœ FDW แžŸแž˜แŸ’แžšแžถแž”แŸ‹ ClickHouse แžŠแŸ‚แž›แžขแž“แžปแž‰แŸ’แž‰แžถแžแžฑแŸ’แž™ SELECT แž–แžธ แž“แžทแž„แž”แž‰แŸ’แž…แžผแž›แž‘แŸ…แž€แŸ’แž“แžปแž„แž˜แžผแž›แžŠแŸ’แž‹แžถแž“แž‘แžทแž“แŸ’แž“แž“แŸแž™ ClickHouse แž–แžธแž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸ PostgreSQL v11 แŸ”

FDW แž‚แžถแŸ†แž‘แŸ’แžšแž˜แžปแžแž„แžถแžšแž€แž˜แŸ’แžšแžทแžแžแŸ’แž–แžŸแŸ‹แžŠแžผแž…แž‡แžถ แžŸแžšแžปแž” แž“แžทแž„แž…แžผแž›แžšแžฝแž˜แŸ” แž“แŸแŸ‡แž’แŸ’แžœแžพแžขแŸ„แž™แž”แŸ’แžšแžŸแžพแžšแžกแžพแž„แž™แŸ‰แžถแž„แžแŸ’แž›แžถแŸ†แž„แž“แžผแžœแž€แžถแžšแžขแž“แžปแžœแžแŸ’แžแžŠแŸ„แž™แž”แŸ’แžšแžพแž’แž“แž’แžถแž“แž“แŸƒแž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸแž–แžธแž…แž˜แŸ’แž„แžถแž™แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžถแžšแžŠแŸ‚แž›แž–แžนแž„แž•แŸ’แžขแŸ‚แž€แž›แžพแž’แž“แž’แžถแž“แž‘แžถแŸ†แž„แž“แŸแŸ‡แŸ”

แž”แžšแžทแžŸแŸ’แžแžถแž“แžŸแŸ’แžแž„แŸ‹แžŠแžถแžš

  • แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸ SupermicroแŸ–
    • แžŸแŸŠแžธแž—แžธแž™แžผ Intelยฎ Xeonยฎ E5-2683 v3 @ 2.00GHz
    • 2 แžšแž“แŸ’แž’ / 28 แžŸแŸ’แž“แžผแž› / 56 แžแŸ’แžŸแŸ‚แžŸแŸ’แžšแžกแžถแž™
    • แž˜แŸแž˜แŸ‰แžผแžšแžธแŸ– แžšแŸ‰แŸแž˜แž‘แŸ†แž แŸ† แŸจ แž‡แžธแž€แžถแž”แŸƒ
    • แž‘แŸ†แž แŸ†แž•แŸ’แž‘แžปแž€แŸ– Samsung SM863 1.9TB Enterprise SSD
    • แž”แŸ’แžšแž–แŸแž“แŸ’แž’แžฏแž€แžŸแžถแžšแŸ– ext4/xfs
  • แž”แŸ’แžšแž–แŸแž“แŸ’แž’แž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžถแžšแŸ– Linux smblade01 4.15.0-42-generic #45~16.04.1-ubuntu
  • PostgreSQLแŸ– แž€แŸ†แžŽแŸ‚ แŸกแŸก

แž€แžถแžšแž’แŸ’แžœแžพแžแŸแžŸแŸ’แžแž‚แŸ„แž›

แž‡แŸ†แž“แžฝแžŸแžฑแŸ’แž™แž€แžถแžšแž”แŸ’แžšแžพแžŸแŸ†แžŽแžปแŸ†แž‘แžทแž“แŸ’แž“แž“แŸแž™แžŠแŸ‚แž›แž”แž„แŸ’แž€แžพแžแžŠแŸ„แž™แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แžฝแž™แž…แŸ†แž“แžฝแž“แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแž’แŸ’แžœแžพแžแŸแžŸแŸ’แžแž“แŸแŸ‡ แž™แžพแž„แž”แžถแž“แž”แŸ’แžšแžพแž‘แžทแž“แŸ’แž“แž“แŸแž™ "แž•แž›แžทแžแž—แžถแž–แžแžถแž˜แž–แŸแž›แžœแŸแž›แžถแžŠแŸ‚แž›แž”แžถแž“แžšแžถแž™แž€แžถแžšแžŽแŸแž–แžธแž˜แŸ‰แŸ„แž„แž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžถแžš" แž–แžธแž†แŸ’แž“แžถแŸ† 1987 แžŠแž›แŸ‹แž†แŸ’แž“แžถแŸ† 2018 แŸ” แžขแŸ’แž“แž€แžขแžถแž…แž…แžผแž›แž”แŸ’แžšแžพแž‘แžทแž“แŸ’แž“แž“แŸแž™ แžŠแŸ„แž™แž”แŸ’แžšแžพแžŸแŸ’แž‚แŸ’แžšแžธแž”แžšแž”แžŸแŸ‹แž™แžพแž„แžŠแŸ‚แž›แž˜แžถแž“แž“แŸ…แž‘แžธแž“แŸแŸ‡.

แž‘แŸ†แž แŸ†โ€‹แž˜แžผแž›แžŠแŸ’แž‹แžถแž“โ€‹แž‘แžทแž“แŸ’แž“แž“แŸแž™โ€‹แž‚แžบ 85 GB แžŠแŸ‚แž›โ€‹แž•แŸ’แžแž›แŸ‹โ€‹แžแžถแžšแžถแž„โ€‹แž˜แžฝแž™โ€‹แž“แŸƒ 109 แž‡แžฝแžšโ€‹แžˆแžšแŸ”

แžŸแŸ†แžŽแžฝแžšแž‚แŸ„แž›

แž“แŸแŸ‡แž‚แžบแž‡แžถแžŸแŸ†แžŽแžฝแžšแžŠแŸ‚แž›แžแŸ’แž‰แžปแŸ†แž”แžถแž“แž”แŸ’แžšแžพแžŠแžพแž˜แŸ’แž”แžธแž”แŸ’แžšแŸ€แž”แž’แŸ€แž” ClickHouse, clickhousedb_fdw แž“แžทแž„ PostgreSQL แŸ”

Q#
แžŸแŸ†แžŽแžฝแžšแž˜แžถแž“แžŸแžšแžปแž” แž“แžทแž„แž€แŸ’แžšแžปแž˜แžŠแŸ„แž™

Q1
แž‡แŸ’แžšแžพแžŸแžšแžพแžŸ DayOfWeek, แžšแžถแž”แŸ‹(*) แž‡แžถ c แž–แžธแž˜แŸ‰แŸ„แž„แžŽแžถแžŠแŸ‚แž›แž†แŸ’แž“แžถแŸ† >= 2000 แž“แžทแž„แž†แŸ’แž“แžถแŸ† <= 2008 แž€แŸ’แžšแžปแž˜แžแžถแž˜ DayOfWeek แž”แž‰แŸ’แž‡แžถแžŠแŸ„แž™ c DESC;

Q2
แž‡แŸ’แžšแžพแžŸแžšแžพแžŸ DayOfWeek, แžšแžถแž”แŸ‹(*) แž‡แžถ c แž–แžธแž˜แŸ‰แŸ„แž„แž’แŸ’แžœแžพแž€แžถแžš แžŠแŸ‚แž› DepDelay>10 แž“แžทแž„แž†แŸ’แž“แžถแŸ†>= 2000 แž“แžทแž„แž†แŸ’แž“แžถแŸ† <= 2008 แž€แŸ’แžšแžปแž˜แžแžถแž˜แžแŸ’แž„แŸƒแž“แŸƒแžŸแž”แŸ’แžแžถแž แŸ แž”แž‰แŸ’แž‡แžถแžŠแŸ„แž™ c DESC;

Q3
แž‡แŸ’แžšแžพแžŸแžšแžพแžŸแž”แŸ’แžšแž—แž–แžŠแžพแž˜, แžšแžถแž”แŸ‹(*) แž‡แžถ c แž…แžถแž”แŸ‹แž–แžธแž–แŸแž›แž€แŸ†แžŽแžแŸ‹ แžŠแŸ‚แž› DepDelay>10 แž“แžทแž„แž†แŸ’แž“แžถแŸ†>= 2000 แž“แžทแž„แž†แŸ’แž“แžถแŸ† <= 2008 แž€แŸ’แžšแžปแž˜แžแžถแž˜แž›แŸ†แžŠแžถแž”แŸ‹แžŠแžพแž˜ BY c DESC LIMIT 10;

Q4
แž‡แŸ’แžšแžพแžŸแžšแžพแžŸแž€แŸ’แžšแžปแž˜แž แŸŠแžปแž“แžŠแžนแž€แž‡แž‰แŸ’แž‡แžผแž“ แžšแžถแž”แŸ‹() แž…แžถแž”แŸ‹แž–แžธแž˜แŸ‰แŸ„แž„แžŽแžถแžŠแŸ‚แž› DepDelay> 10 แž“แžทแž„แž†แŸ’แž“แžถแŸ† = 2007 แž€แŸ’แžšแžปแž˜แžŠแŸ„แž™แž€แŸ’แžšแžปแž˜แž แŸŠแžปแž“แžŠแžนแž€แž‡แž‰แŸ’แž‡แžผแž“ แž€แžถแžšแž”แž‰แŸ’แž‡แžถแž‘แžทแž‰แžŠแŸ„แž™แžšแžถแž”แŸ‹() DESC;

Q5
แž‡แŸ’แžšแžพแžŸแžšแžพแžŸ a.Carrier, c, c2, c1000/c2 แž‡แžถ c3 แž–แžธ ( SELECT แž€แŸ’แžšแžปแž˜แž แŸŠแžปแž“แžŠแžนแž€แž‡แž‰แŸ’แž‡แžผแž“ แžšแžถแž”แŸ‹() แž€แŸ’แž“แžปแž„แž“แžถแž˜แž‡แžถ c แž…แžถแž”แŸ‹แž–แžธแž–แŸแž›แž€แŸ†แžŽแžแŸ‹ WHERE DepDelay>10 AND Year=2007 GROUP BY Carrier) a Inner JOIN ( SELECT Carrier, count(*) AS c2 FROM ontime WHERE Year=2007 GROUP BY Carrier)b on a.Carrier=b.Carrier แžŠแŸ„แž™ c3 DESC;

Q6
แž‡แŸ’แžšแžพแžŸแžšแžพแžŸ a.Carrier, c, c2, c1000/c2 แž‡แžถ c3 แž–แžธ ( SELECT แž€แŸ’แžšแžปแž˜แž แŸŠแžปแž“แžŠแžนแž€แž‡แž‰แŸ’แž‡แžผแž“ แžšแžถแž”แŸ‹() แž€แŸ’แž“แžปแž„แž“แžถแž˜แž‡แžถ c แž–แžธแž–แŸแž›แžœแŸแž›แžถแžŠแŸ‚แž› DepDelay>10 แž“แžทแž„แž†แŸ’แž“แžถแŸ†>= 2000 แž“แžทแž„แž†แŸ’แž“แžถแŸ† <= 2008 แž‡แžถแž€แŸ’แžšแžปแž˜แžŠแŸ„แž™แž€แŸ’แžšแžปแž˜แž แŸŠแžปแž“แžŠแžนแž€แž‡แž‰แŸ’แž‡แžผแž“) แž€แžถแžšแž…แžผแž›แžšแžฝแž˜แžแžถแž„แž€แŸ’แž“แžปแž„ (แž‡แŸ’แžšแžพแžŸแžšแžพแžŸแž€แŸ’แžšแžปแž˜แž แŸŠแžปแž“แžŠแžนแž€แž‡แž‰แŸ’แž‡แžผแž“ แžšแžถแž”แŸ‹(*) แž‡แžถ c2 แž–แžธแž˜แŸ‰แŸ„แž„แž”แž“แŸ’แžแž”แž“แŸ’แž‘แžถแž”แŸ‹แž“แŸ…แžŽแžถแž†แŸ’แž“แžถแŸ†>= 2000 แž“แžทแž„แž†แŸ’แž“แžถแŸ† <= 2008 Carrier ) b on a.Carrier=b.Carrier ORDER BY c3 DESC;

Q7
SELECT Carrier, avg(DepDelay) * 1000 AS c3 แž…แžถแž”แŸ‹แž–แžธแž˜แŸ‰แŸ„แž„แžŽแžถแžŠแŸ‚แž›แž†แŸ’แž“แžถแŸ†>= 2000 แž“แžทแž„แž†แŸ’แž“แžถแŸ† <= 2008 GROUP BY Carrier;

Q8
SELECT Year, avg(DepDelay) แž–แžธแž€แŸ’แžšแžปแž˜แžแžถแž˜แž–แŸแž›แžœแŸแž›แžถแžแžถแž˜แž†แŸ’แž“แžถแŸ†;

Q9
แž‡แŸ’แžšแžพแžŸแžšแžพแžŸแž†แŸ’แž“แžถแŸ† แžšแžถแž”แŸ‹(*) แž‡แžถ c1 แž–แžธแž€แŸ’แžšแžปแž˜แž‘แžถแž“แŸ‹แž–แŸแž›แžŠแŸ„แž™แž†แŸ’แž“แžถแŸ†;

Q10
SELECT avg(cnt) FROM (SELECT Year, Month, count(*) AS cnt FROM ontime WHERE DepDel15=1 GROUP BY Year, Month) a;

Q11
แž‡แŸ’แžšแžพแžŸแžšแžพแžŸ avg(c1) แž–แžธ (แž‡แŸ’แžšแžพแžŸแžšแžพแžŸแž†แŸ’แž“แžถแŸ† แžแŸ‚ แžšแžถแž”แŸ‹(*) แž‡แžถ c1 แž–แžธแž€แŸ’แžšแžปแž˜แž‘แžถแž“แŸ‹แž–แŸแž›แžŠแŸ„แž™แž†แŸ’แž“แžถแŸ† แžแŸ‚) a;

Q12
SELECT OriginCityName, DestCityName, count(*) แž‡แžถ c แž–แžธแž€แŸ’แžšแžปแž˜แž‘แžถแž“แŸ‹แž–แŸแž›แžŠแŸ„แž™ OriginCityName, DestCityName แž”แž‰แŸ’แž‡แžถแžŠแŸ„แž™ c DESC LIMIT 10;

Q13
แž‡แŸ’แžšแžพแžŸแžšแžพแžŸ OriginCityName, count(*) แž‡แžถ c แž–แžธแž€แŸ’แžšแžปแž˜แž‘แžถแž“แŸ‹แž–แŸแž›แžŠแŸ„แž™ OriginCityName แž”แž‰แŸ’แž‡แžถแžŠแŸ„แž™ c DESC LIMIT 10;

แžŸแŸ†แžŽแžฝแžšแž˜แžถแž“แž€แžถแžšแž…แžผแž›แžšแžฝแž˜

Q14
แž‡แŸ’แžšแžพแžŸแžšแžพแžŸ a.Year, c1/c2 FROM (แž‡แŸ’แžšแžพแžŸแžšแžพแžŸแž†แŸ’แž“แžถแŸ†, แžšแžถแž”แŸ‹()1000 แž‡แžถ c1 แž…แžถแž”แŸ‹แž–แžธแž–แŸแž›แž€แŸ†แžŽแžแŸ‹ WHERE DepDelay> 10 GROUP BY Year) a Inner JOIN (แž‡แŸ’แžšแžพแžŸแžšแžพแžŸ Year, count(*) as c2 from ontime GROUP BY Year) b on a.Year=b.Year ORDER BY a.Year;

Q15
แž‡แŸ’แžšแžพแžŸแžšแžพแžŸ โ€œแž†แŸ’แž“แžถแŸ†โ€, c1/c2 แž–แžธ (แž‡แŸ’แžšแžพแžŸแžšแžพแžŸ โ€œแž†แŸ’แž“แžถแŸ†โ€, แžšแžถแž”แŸ‹()1000 as c1 FROM fontime where โ€œDepDelayโ€> 10 GROUP BY โ€œYearโ€) a Inner JOIN (แž‡แŸ’แžšแžพแžŸแžšแžพแžŸ โ€œYearโ€ แžšแžถแž”แŸ‹(*) แž‡แžถ c2 แž–แžธ fontime GROUP BY โ€œYearโ€) b on a.โ€Yearโ€=b. "แž†แŸ’แž“แžถแŸ†";

แžแžถแžšแžถแž„-แŸกแŸ– แžŸแŸ†แžŽแžฝแžšแžŠแŸ‚แž›แž”แŸ’แžšแžพแž‡แžถแž‚แŸ„แž›

แž€แžถแžšแž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแžŸแŸ†แžŽแžฝแžš

แž“แŸแŸ‡แž‚แžบแž‡แžถแž›แž‘แŸ’แž’แž•แž›แž“แŸƒแžŸแŸ†แžŽแžฝแžšแž“แžธแž˜แžฝแž™แŸ— แž“แŸ…แž–แŸแž›แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž€แŸ’แž“แžปแž„แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แž˜แžผแž›แžŠแŸ’แž‹แžถแž“แž‘แžทแž“แŸ’แž“แž“แŸแž™แž•แŸ’แžŸแŸแž„แŸ—แž‚แŸ’แž“แžถแŸ– PostgreSQL แžŠแŸ‚แž›แž˜แžถแž“ แž“แžทแž„แž‚แŸ’แž˜แžถแž“แž›แžทแž”แžทแž€แŸ’แžšแž˜ แž”แŸ’แžšแž—แž–แžŠแžพแž˜ ClickHouse แž“แžทแž„ clickhousedb_fdw แŸ” แž–แŸแž›แžœแŸแž›แžถแžแŸ’แžšแžผแžœแž”แžถแž“แž”แž„แŸ’แž แžถแž‰แž‡แžถแž˜แžธแž›แžธแžœแžทแž“แžถแž‘แžธแŸ”

Q#
PostgreSQL
PostgreSQL (แž›แžทแž”แžทแž€แŸ’แžšแž˜)
แž…แžปแž…แž•แŸ’แž‘แŸ‡
clickhousedb_fdw

Q1
27920
19634
23
57

Q2
35124
17301
50
80

Q3
34046
15618
67
115

Q4
31632
7667
25
37

Q5
47220
8976
27
60

Q6
58233
24368
55
153

Q7
30566
13256
52
91

Q8
38309
60511
112
179

Q9
20674
37979
31
81

Q10
34990
20102
56
148

Q11
30489
51658
37
155

Q12
39357
33742
186
1333

Q13
29912
30709
101
384

Q14
54126
39913
124
1364212

Q15
97258
30211
245
259

Table-1: แž–แŸแž›แžœแŸแž›แžถแžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž™แž€แž‘แŸ…แž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแžŸแŸ†แžŽแžฝแžšแžŠแŸ‚แž›แž”แŸ’แžšแžพแž€แŸ’แž“แžปแž„แž‚แŸ„แž›

แž˜แžพแž›แž›แž‘แŸ’แž’แž•แž›

แž€แŸ’แžšแžถแž แŸ’แžœแž”แž„แŸ’แž แžถแž‰แž–แŸแž›แžœแŸแž›แžถแž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแžŸแŸ†แžŽแžฝแžšแž‚แžทแžแž‡แžถแž˜แžธแž›แžธแžœแžทแž“แžถแž‘แžธ แžขแŸแž€แŸ’แžŸ X แž”แž„แŸ’แž แžถแž‰แž›แŸแžแžŸแŸ†แžŽแžฝแžšแž–แžธแžแžถแžšแžถแž„แžแžถแž„แž›แžพ แž แžพแž™แžขแŸแž€แŸ’แžŸ Y แž”แž„แŸ’แž แžถแž‰แž–แŸแž›แžœแŸแž›แžถแž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž‚แžทแžแž‡แžถแž˜แžทแž›แŸ’แž›แžธแžœแžทแž“แžถแž‘แžธแŸ” แž›แž‘แŸ’แž’แž•แž› ClickHouse แž“แžทแž„แž‘แžทแž“แŸ’แž“แž“แŸแž™แžŠแŸ‚แž›แž”แžถแž“แž‘แžถแž‰แž™แž€แž–แžธ postgres แžŠแŸ„แž™แž”แŸ’แžšแžพ clickhousedb_fdw แžแŸ’แžšแžผแžœแž”แžถแž“แž”แž„แŸ’แž แžถแž‰แŸ” แž–แžธแžแžถแžšแžถแž„แžขแŸ’แž“แž€แžขแžถแž…แž˜แžพแž›แžƒแžพแž‰แžแžถแž˜แžถแž“แž—แžถแž–แžแžปแžŸแž‚แŸ’แž“แžถแž™แŸ‰แžถแž„แžแŸ’แž›แžถแŸ†แž„แžšแžœแžถแž„ PostgreSQL แž“แžทแž„ ClickHouse แž”แŸ‰แžปแž“แŸ’แžแŸ‚แž—แžถแž–แžแžปแžŸแž‚แŸ’แž“แžถแžแžทแž…แžแžฝแž…แžšแžœแžถแž„ ClickHouse แž“แžทแž„ clickhousedb_fdw แŸ”

แž€แžถแžšแžŸแžถแž€แž›แŸ’แž”แž„แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž“แŸƒแžŸแŸ†แžŽแžฝแžšแžœแžทแž—แžถแž‚แž“แŸ…แž€แŸ’แž“แžปแž„ PostgreSQL, ClickHouse แž“แžทแž„ clickhousedb_fdw (PostgreSQL)

แž€แŸ’แžšแžถแž แŸ’แžœแž“แŸแŸ‡แž”แž„แŸ’แž แžถแž‰แž–แžธแž—แžถแž–แžแžปแžŸแž‚แŸ’แž“แžถแžšแžœแžถแž„ ClickhouseDB แž“แžทแž„ clickhousedb_fdw แŸ” แž“แŸ…แž€แŸ’แž“แžปแž„แžŸแŸ†แžŽแžฝแžšแž—แžถแž‚แž…แŸ’แžšแžพแž“ แž€แžถแžšแž…แŸ†แžŽแžถแž™แž›แžพ FDW แž˜แžทแž“แžแŸ’แž–แžŸแŸ‹แž‘แŸ แž แžพแž™แžŸแŸ’แž‘แžพแžšแžแŸ‚แž˜แžทแž“แžŸแŸ†แžแžถแž“แŸ‹ แž›แžพแž€แž›แŸ‚แž„แžแŸ‚ Q12 แŸ” แžŸแŸ†แžŽแžฝแžšแž“แŸแŸ‡แžšแžฝแž˜แž”แž‰แŸ’แž…แžผแž›แž€แžถแžšแž—แŸ’แž‡แžถแž”แŸ‹ แž“แžทแž„แž€แžถแžšแž”แž‰แŸ’แž‡แžถแž‘แžทแž‰แžแžถแž˜แžƒแŸ’แž›แžถแŸ” แžŠแŸ„แž™แžŸแžถแžšแžแŸ‚ ORDER BY GROUP/BY clause, ORDER BY แž˜แžทแž“แž‘แž˜แŸ’แž›แžถแž€แŸ‹แž‘แŸ… ClickHouse แž‘แŸแŸ”

แž“แŸ…แž€แŸ’แž“แžปแž„แžแžถแžšแžถแž„แž‘แžธ 2 แž™แžพแž„แžƒแžพแž‰แž–แŸแž›แžœแŸแž›แžถแž›แŸ„แžแž€แŸ’แž“แžปแž„แžŸแŸ†แžŽแžฝแžš Q12 แž“แžทแž„ Q13 แŸ” แž‡แžถแžแŸ’แž˜แžธแž˜แŸ’แžแž„แž‘แŸ€แž แž“แŸแŸ‡แž‚แžบแž”แžŽแŸ’แžแžถแž›แž˜แž€แž–แžธ ORDER BY clauseแŸ” แžŠแžพแž˜แŸ’แž”แžธแž”แž‰แŸ’แž‡แžถแž€แŸ‹แžšแžฟแž„แž“แŸแŸ‡ แžแŸ’แž‰แžปแŸ†แž”แžถแž“แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžŸแŸ†แžŽแžฝแžš Q-14 แž“แžทแž„ Q-15 แžŠแŸ„แž™แž˜แžถแž“ แž“แžทแž„แž‚แŸ’แž˜แžถแž“ ORDER BY clauseแŸ” แž”แžพแž‚แŸ’แž˜แžถแž“ ORDER BY clause แž–แŸแž›แžœแŸแž›แžถแž”แž‰แŸ’แž…แž”แŸ‹แž‚แžบ 259ms แž แžพแž™แž‡แžถแž˜แžฝแž™แž“แžนแž„ ORDER BY clause แžœแžถแž‚แžบ 1364212แŸ” แžŠแžพแž˜แŸ’แž”แžธแž”แŸ†แž”แžถแžแŸ‹แž”แž‰แŸ’แž แžถแžŸแŸ†แžŽแžฝแžšแž“แŸแŸ‡ แžแŸ’แž‰แžปแŸ†แž€แŸ†แž–แžปแž„แž–แž“แŸ’แž™แž›แŸ‹แž‘แžถแŸ†แž„แžŸแŸ†แžŽแžฝแžš แž แžพแž™แž“แŸแŸ‡แž‚แžบแž‡แžถแž›แž‘แŸ’แž’แž•แž›แž“แŸƒแž€แžถแžšแž–แž“แŸ’แž™แž›แŸ‹แŸ”

แžŸแŸ†แžŽแžฝแžšแž‘แžธ 15: แžŠแŸ„แž™แž‚แŸ’แž˜แžถแž“แž€แžถแžšแž”แž‰แŸ’แž‡แžถแž‘แžทแž‰แžแžถแž˜แžƒแŸ’แž›แžถ

bm=# EXPLAIN VERBOSE SELECT a."Year", c1/c2 
     FROM (SELECT "Year", count(*)*1000 AS c1 FROM fontime WHERE "DepDelay" > 10 GROUP BY "Year") a
     INNER JOIN(SELECT "Year", count(*) AS c2 FROM fontime GROUP BY "Year") b ON a."Year"=b."Year";

แžŸแŸ†แžŽแžฝแžšแž‘แžธ 15: แžŸแŸ†แžŽแžฝแžšแžŠแŸ„แž™แž‚แŸ’แž˜แžถแž“แž€แžถแžšแž”แž‰แŸ’แž‡แžถแž‘แžทแž‰แžแžถแž˜แžƒแŸ’แž›แžถ

QUERY PLAN                                                      
Hash Join  (cost=2250.00..128516.06 rows=50000000 width=12)  
Output: fontime."Year", (((count(*) * 1000)) / b.c2)  
Inner Unique: true   Hash Cond: (fontime."Year" = b."Year")  
->  Foreign Scan  (cost=1.00..-1.00 rows=100000 width=12)        
Output: fontime."Year", ((count(*) * 1000))        
Relations: Aggregate on (fontime)        
Remote SQL: SELECT "Year", (count(*) * 1000) FROM "default".ontime WHERE (("DepDelay" > 10)) GROUP BY "Year"  
->  Hash  (cost=999.00..999.00 rows=100000 width=12)        
Output: b.c2, b."Year"        
->  Subquery Scan on b  (cost=1.00..999.00 rows=100000 width=12)              
Output: b.c2, b."Year"              
->  Foreign Scan  (cost=1.00..-1.00 rows=100000 width=12)                    
Output: fontime_1."Year", (count(*))                    
Relations: Aggregate on (fontime)                    
Remote SQL: SELECT "Year", count(*) FROM "default".ontime GROUP BY "Year"(16 rows)

แžŸแŸ†แžŽแžฝแžšแž‘แžธ 14: แžŸแŸ†แžŽแžฝแžšแž‡แžถแž˜แžฝแž™แž€แžถแžšแž”แž‰แŸ’แž‡แžถแž‘แžทแž‰แžแžถแž˜แžƒแŸ’แž›แžถ

bm=# EXPLAIN VERBOSE SELECT a."Year", c1/c2 FROM(SELECT "Year", count(*)*1000 AS c1 FROM fontime WHERE "DepDelay" > 10 GROUP BY "Year") a 
     INNER JOIN(SELECT "Year", count(*) as c2 FROM fontime GROUP BY "Year") b  ON a."Year"= b."Year" 
     ORDER BY a."Year";

แžŸแŸ†แžŽแžฝแžšแž‘แžธ 14: แž•แŸ‚แž“แž€แžถแžšแžŸแŸ†แžŽแžฝแžšแž‡แžถแž˜แžฝแž™ ORDER BY Clause

QUERY PLAN 
Merge Join  (cost=2.00..628498.02 rows=50000000 width=12)   
Output: fontime."Year", (((count(*) * 1000)) / (count(*)))   
Inner Unique: true   Merge Cond: (fontime."Year" = fontime_1."Year")   
->  GroupAggregate  (cost=1.00..499.01 rows=1 width=12)        
Output: fontime."Year", (count(*) * 1000)         
Group Key: fontime."Year"         
->  Foreign Scan on public.fontime  (cost=1.00..-1.00 rows=100000 width=4)               
Remote SQL: SELECT "Year" FROM "default".ontime WHERE (("DepDelay" > 10)) 
            ORDER BY "Year" ASC   
->  GroupAggregate  (cost=1.00..499.01 rows=1 width=12)         
Output: fontime_1."Year", count(*)         Group Key: fontime_1."Year"         
->  Foreign Scan on public.fontime fontime_1  (cost=1.00..-1.00 rows=100000 width=4) 
              
Remote SQL: SELECT "Year" FROM "default".ontime ORDER BY "Year" ASC(16 rows)

แžŸแŸแž…แž€แŸ’แžแžธแžŸแž“แŸ’แž“แžทแžŠแŸ’แž‹แžถแž“

แž›แž‘แŸ’แž’แž•แž›แž“แŸƒแž€แžถแžšแž–แžทแžŸแŸ„แž’แž“แŸแž‘แžถแŸ†แž„แž“แŸแŸ‡แž”แž„แŸ’แž แžถแž‰แžแžถ ClickHouse แž•แŸ’แžแž›แŸ‹แž“แžผแžœแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž›แŸ’แžขแž˜แŸ‚แž“แž‘แŸ‚แž“ แž แžพแž™ clickhousedb_fdw แž•แŸ’แžแž›แŸ‹แž“แžผแžœแžขแžแŸ’แžแž”แŸ’แžšแž™แŸ„แž‡แž“แŸแž“แŸƒแžŠแŸ†แžŽแžพแžšแž€แžถแžš ClickHouse แž–แžธ PostgreSQL แŸ” แžแžŽแŸˆแž–แŸแž›แžŠแŸ‚แž›แž˜แžถแž“แž€แžถแžšแž…แŸ†แžŽแžถแž™แž›แžพแžŸแž˜แžฝแž™แž…แŸ†แž“แžฝแž“แž“แŸ…แž–แŸแž›แž”แŸ’แžšแžพ clickhousedb_fdw แžœแžถแž˜แžถแž“แžŸแŸแž…แž€แŸ’แžแžธแž’แŸ’แžœแŸแžŸแž”แŸ’แžšแž แŸ‚แžŸ แž“แžทแž„แžขแžถแž…แž”แŸ’แžšแŸ€แž”แž’แŸ€แž”แž‘แŸ…แž“แžนแž„แž€แžถแžšแžขแž“แžปแžœแžแŸ’แžแžŠแŸ‚แž›แžŸแž˜แŸ’แžšแŸแž…แž”แžถแž“แžŠแŸ„แž™แž€แžถแžšแžŠแŸ†แžŽแžพแžšแž€แžถแžšแžŠแžพแž˜แž“แŸ…แž›แžพแž˜แžผแž›แžŠแŸ’แž‹แžถแž“แž‘แžทแž“แŸ’แž“แž“แŸแž™ ClickHouse แŸ” แž“แŸแŸ‡แž€แŸแž”แž‰แŸ’แž‡แžถแž€แŸ‹แž•แž„แžŠแŸ‚แžšแžแžถ fdw แž“แŸ…แž€แŸ’แž“แžปแž„ PostgreSQL แž•แŸ’แžแž›แŸ‹แž“แžผแžœแž›แž‘แŸ’แž’แž•แž›แžŠแŸแž›แŸ’แžขแŸ”

แž€แžถแžšแž‡แž‡แŸ‚แž€แžแžถแž˜ Telegram แžแžถแž˜แžšแž™แŸˆ Clickhouse https://t.me/clickhouse_ru
แž€แžถแžšแž‡แž‡แŸ‚แž€แžแžถแž˜ Telegram แžŠแŸ„แž™แž”แŸ’แžšแžพ PostgreSQL https://t.me/pgsql

แž”แŸ’แžšแž—แž–: www.habr.com

แž”แž“แŸ’แžแŸ‚แž˜แž˜แžแžทแž™แŸ„แž”แž›แŸ‹