Microservice Architecture ááẠá€ááá¹áá¬ááŸá á¡áá¬á¡á¬ážáá¯á¶ážáá²á·ááá¯á·ááẠáááºážá á¡á¬ážáá¬áá»áẠá¡á¬ážáááºážáá»ááºáá»á¬ážááŸááááºá á¡áá»áá¯á·áá±á¬ áá¯ááºáááºážá ááºáá»á¬ážááẠáááºážááŸáá·áºá¡áá° ááá¯ááá¯ááœááºáá°áá¬ááŒá®áž á¡áá»áá¯á·áá±á¬ áá¯ááºáááºážá ááºáá»á¬ážááẠááá¯ááá¯áááºáá²áááºá á¡ááŒá±á¬ááºážá¡áá²á á¡ááŸáááºá¡áá¯ááºááŸáá·áº ááá¯ááá¯áá±á¬ááºážááœááºáá±á¬ áá»á²á·ááœááºááá¯ááºá á±áááºá¡ááœááºá áááºááẠá¡áá áºáá¬áá¶ááŸá¯áá»á¬áž ááŒá¯áá¯ááºááẠááá¯á¡ááºáá«áááºá áááºážááá¯á·áá²ááŸáá áºáá¯ááŸá¬ ááœá²ááŒááºážá áááºááŒá¬ááŸá¯á ááŸá¯ááºááœá±ážááŸá¯ ááá¯ážáá¬ááŒááºážááŒá áºáááºá á¡áááºá monolith ááœáẠáá¯ááºáááºážáá±á¬ááºááœááºááŸá¯ááá¯ááºáᬠááœá²ááŒááºážá áááºááŒá¬ááŸá¯á¡á¬ážáá¯á¶ážááᯠááœá²ááŒááºážá áááºááŒá¬áá¯á¶áá°áá áºáá¯ááá¯á· SQL queries áá»á¬ážá¡ááŒá áºááá¯á· áá»áŸá±á¬á·áá»ááá¯ááºáá«áá ááá¯á·áá±á¬áẠmultiservice áááá¯áá¬áá áºáá¯ááœáẠáááºáá±á¬ááºááŸá¯áá áºáá¯á á®ááœáẠáááºážáááá¯ááºááá¯ááºáá±áá¬áá±á·á áºááŸáááŒá®áž query áá áºáá¯áá¯ááºáá±á¬ááºáááááá¯ááºááŒá±á¬ááºáž áááºáááẠ(ááá¯á·ááá¯áẠááŒá áºááá¯ááºáá«ááá¬ážá) áá»áœááºá¯ááºááá¯á·ááá¯áá¹ááá®ááœáẠáá¯ááºáááºážáááºáááºááŸá¯ááá¯ááºáᬠááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááŒá¿áá¬ááᯠáá»áœááºá¯ááºááá¯á·ááŒá±ááŸááºážáá¯á¶ááŸáá·áº á€ááŒá±ááŸááºážáááºážááŒáá·áº áá»áœááºá¯ááºááá¯á· áááºááá¯á·áá±ááá¯ááºáááºáá¬áááºááᯠá áááºáááºá á¬ážáá°áá»á¬ážá¡ááœáẠ- ááŒáá¯ááá¯áá«áááºá
áá»áœááºá¯ááºáá¡áááºááŸá¬ Pavel Sivash ááŒá
áºááŒá®ážá DomClick ááœáẠáá»áœááºá¯ááºááẠááœá²ááŒááºážá
áááºááŒá¬ááŸá¯áá±áá¬ááá¯áá±á«ááºááᯠááááºážááááºážááẠáá¬áááºááŸááá±á¬á¡ááœá²á·ááœáẠá¡áá¯ááºáá¯ááºáá«áááºá ááááá¯ážáá»á¡á¬ážááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááá¯ááºáá±á¬ááºááŸá¯áá»á¬ážááᯠáá±áá¬á¡ááºáá»ááºáá®áá¬á¡ááŒá
Ạááœá²ááŒá¬ážáááºááŸááºááá¯ááºáá±á¬áºáááºážá ááááºáááºážááœááºá áá¯ááºáááºážáá±á¬ááºáá¬áá»á¬ážááẠááá¯ááá¯áá»ááºááŒáá·áºáá«áááºá áá±áá¬á¡ááºáá»ááºáá®áá¬á áááºáááá¯ááºááá¯ááºáááááá¬áá»á¬ážá áá±áá¬ááœá²ááŒááºážá
áááºááŒá¬ááŸá¯ááŸáá·áº ááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯á¡ááœáẠáááááá¬áá»á¬ážá áá¶á·ááá¯ážááŸá¯ááŸáá·áº ááá¯ááºáá»á±á¬áá®ááœá±ááŒá
áºá
á±áááºá¡ááœáẠETL/ELT á
á¶ááŸá¯ááºážááŸááá«áááºá á¡áá°ážáááŒáá·áºá áá¯ááºáááºážáááºáááºááŸá¯á¡á
á®áááºáá¶ááŒááºážá¡ááœááºá áá»áœááºá¯ááºááá¯á·ááœáẠmonolith áá
áºáá¯ááŸááááºááᯠ"áááºáá±á¬ááº" ááẠáá¯á¶ážááŒááºáá²á·ááŒá®áž áááºážá
á
áºáá°áá»á¬ážá¡á¬áž áááºážááá¯á·ááá¯á¡ááºáá±á¬áá±áá¬á¡á¬ážáá¯á¶ážáá«ááŸááá±á¬ áá±áá¬áá±á·á
áºáá
áºáá¯áá±ážááá¯ááºáá«á
áá±áá°áá»á¡á¬ážááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠááá°áá®áá±á¬ááœá±ážáá»ááºááŸá¯áá»á¬ážááᯠááá·áºááœááºážá ááºážá á¬ážáááºá ááŒáá·áºá á¯á¶áá±á¬ááºážááœááºáá±á¬ repository áá áºáá¯ááᯠáááºáá±á¬ááºááẠááŒá áºááá¯ááºááẠ- áá»áœááºá¯ááºááá¯á·ááẠááŒáá¯ážá á¬ážáá²á·ááŒáá±á¬áºáááºáž ááá¯ážááá¯ážáá¬ážáá¬áž ááŒá±á¬ááá»áŸáẠááá¯ááŸá±á¬ááºáá¯á¶áá áºáᯠáááºáá±á¬ááºááŒááºáž ááŸá±ážááœá±ážáá±á¬ áá¯ááºáááºážá ááºáá»á¬ážááŸáá·áº áááŒá¬áá áá¯áá¹áááá±áááá¯ááºáᬠá¡ááŒá±á¬ááºážá¡áá²áá»á¬ážááᯠáá±á«ááºážá ááºá áááºážááᯠááŒá±á¬ááºážáá²ááŸá¯áá»á¬áž ááŒá¯áá¯ááºááá¯ááºááŒááºáž áááŸááá« (áá áºá á¯á¶áá áºáŠáž á¡á±á¬ááºááŒááºáá«áá á áá¯ááºáááºážááᯠcomment ááŸá¬áá±ážáá«á âáá±á¬ááºá»á¬ážáá±ážááœá±á á áá«ážá¡á¯á¶ážááœá±ááᯠáá±á·áá¬ááŒá®áž ááœá²ááŒááºážá áááºááŒá¬áá¯á¶áá°ááœá±áá® ááœá¬ážáá«â ááá¯á· áá±á·áá¬áá°ááœá±ááᯠááŒá±á¬ááá¯á·ááŒá áºááá¯ááºáá±ááá·áº áá«áᬠá á¯áá±á¬ááºážááŸá¯á¡ááœáẠáá±á¬ááºáááºááá¯á¡ááºáá»ááºáá áºáá¯ááŒá áºááŒá®áž ááŒá áºááá¯ááºááẠáá«ááᯠááŸá±á¬ááºááŸá¬ážááá·áºáááºááá¯á· áááºááá«áááºá áá»áœááºá¯ááºááá¯á·ááẠFDW (Foreign Data Wrapper) áááºážááá¬ááᯠá¡áá¯á¶ážááŒá¯ááẠáá¯á¶ážááŒááºáá²á·áááº- á¡ááŒá±áá¶á¡á¬ážááŒáá·áºá áááºážááẠSQL á á¶ááŸá¯ááºážááœááºááŸááá±á¬ á á¶áááºááŸááºáá»ááºáá áºáá¯ááŒá áºááŒá®áž áááºážáááá¯ááºááá¯ááºá¡ááºáá¬áá±á·á áºááẠááá¯ááá¯á¡áááºááŒá±á á±áá«áááºá á¡á²áá«ááᯠá¡ááŒá±áá¶ááŒá®áž ááŒá±ááŸááºážáá»ááºáá áºáᯠáá¯ááºáá²á·ááŒá®áž áá±á¬ááºáá¯á¶ážááŸá¬ ááŒá±áááºááœá¬ážáá²á·ááŒá®áž á¡á²áá«ááᯠááŒá±ááŸááºážáá²á·áá«áááºá áááºážáá¡áá±ážá áááºá¡áá»ááºáá»á¬ážááẠáá®ážááŒá¬ážáá±á¬ááºážáá«ážáá áºáá¯á áá±á«ááºážá ááºááŒá áºáááºá áá»á¬ážá áœá¬á¡ááŒá±á¬ááºážááŒá±á¬áá»ááºáá±á¬ááŒá±á¬áá·áºááŒá áºáááº- áá±áá¬áá±á·á áºá¡á á®á¡á ááºáá»á¬ážááᯠáá áºááŒáá¯ááºáááºážáá¯ááºáá±á¬ááºááŒááºážá០ááá¯ááºáá±ážááá¯ááºáá¬á¡áá»ááºá¡áááºáá»á¬ážááᯠááááºážáá»á¯ááºááŒááºážááŸáá·áº áá°áá áºáŠážáá»ááºážá á®á០ááœá²áá¯ááºááŒááºážá¡ááá á€ááŒá±ááŸááºážáá»ááºááẠá á áºááŸááºáá±á¬ ááœá²ááŒááºážá áááºááŒá¬áá±á¬áá±áá¬áá±á·á áºáá»á¬ážááŸáá·áº ááá¯ááŸá±á¬ááºáá¬áá±áá¬áá»á¬ážá¡ááœáẠá¡á á¬ážááá¯ážááŒááºážááá¯ááºáá«á áááºážááẠáá®ážááŒá¬ážááŒá¿áá¬áá áºáá¯áᬠááŒá±ááŸááºážáá±ážááŒá±á¬ááºážááá¯áááºáž ááŒáá¯áááºá á¬áááºážááœááºážáá¬ážááẠááá¯á¡ááºáá«áááºá
ááááºáááºážá¡ááá·áºááœááºáááºážáááºá€áá²á·ááá¯á·áá±á¬áá¯á¶ááááºá
á¡áá¯á¶ážááŒá¯áá°áá»á¬ážááẠáááºážááá¯á·á á¡áá¯ááºáá±áá¬ááᯠááááºážáááºážááá¯ááºááá·áº PostgreSQL áá±áá¬áá±á·á
áºáá
áºáᯠááŸáááŒá®áž á¡áá±ážá¡ááŒá®ážáá¯á¶ážááŸá¬ áááºáá±á¬ááºááŸá¯á¡á¬ážáá¯á¶ážá ááœá²ááŒááºážá
áááºááŒá¬áá¯á¶áá°áá»á¬ážááᯠFDW ááŸáá
áºááá·áº á€áá±áá¬áá±á·á
áºááá¯á· áá»áááºáááºáá¬ážáááºá áááºážááẠáá»á¬ážá
áœá¬áá±á¬áá±áá¬áá±á·á
áºáá»á¬ážááá¯á· á
á¯á¶á
ááºážáá±ážááŒááºážááŸá¯áá
áºáá¯ááᯠáá±ážáá¬ážááá¯ááºá
á±áááºá áááºážááẠáááºááá·áºá¡áá¬ááŒá
áºáááºááᯠá¡áá±ážáááŒá®ážáá« - PostgreSQLá MySQLá MongoDB ááá¯á·ááá¯áẠá¡ááŒá¬ážá¡áá¬áá»á¬áž (ááá¯ááºá APIá ááá·áºáá»á±á¬áºáá±á¬ wrapper áá¯ááºááááºáááŸááá«áá áááºááá¯ááºááá¯ááºáá±ážááá¯ááºáááº)á áá±á¬ááºážááŒá®á á¡áá¬á¡á¬ážáá¯á¶ážáá±á¬ááºážáá¯á¶ááááºá áá«ááá¯á· áááºážááœá²áá±áá¬áá¬ážá
á¡áá¬á¡á¬ážáá¯á¶áž ááŒááºááŒááºáááºáááºáá²á· ááŒá®ážáá¯á¶ážááœá¬ážáá²á·ááẠáá±á¬ááºážáá«ážáá áºáá¯ááºááŸáááŸá¬ ááá¯ááºáá°ážá
Postgres ááẠá¡áá±ážááááºážáá¬áá¬áá»á¬ážááá¯á· áá±á¬ááºážááá¯ááŸá¯áá»á¬ážááᯠáááºááá¯á·áá¯ááºáá±á¬ááºáááºááŸáá·áº áááºáááºá ááŸááºážáááºážááẠá¡áá±ážááŒá®ážáááºá áá«á áá¯áá¹ááááŸááá¯á¶ááááºá áá«áá±ááá·áº áááŒá¬áá áá°ááœá±á ááá¯áá áá¯ááºááŒáá°áž- Postgres á áá±á¬ááºážááá¯áá»ááºááᯠá¡áá±ážááááºážáá¬áá¬ááœá±ááŸá¬ áá®ážááŒá¬ážáá¯ááºáá±á¬ááºáá²á· á¡ááá¯ááºážááœá±á¡ááŒá Ạááá¯ááºážááŒá¬ážááŒá®ážá áá®áá±áá¬ááᯠá á¯áá±á¬ááºážááŒá®áž áá±á¬ááºáá¯á¶ážááœááºáá»ááºááŸá¯ááœá±ááᯠááá¯ááºááá¯ááºáá¯ááºáá±á¬ááºáá²á·á¡ááœááºá query execution áá²á· á¡ááŒááºááŸá¯ááºážáá±á«áºááŸá¬ á¡áá»á¬ážááŒá®ážáá°áááºáá«áááºá áááºááá¯áá±ážáá¬ážáá²á áááºážááá¯áááááŒá¯ááá·áºáááº- áá±áá¬ááẠá¡áá±ážááááºážáá¬áá¬áá áºáá¯ááŸáá±á¬ááºááŸááá¬áá±á¬á¡áá«á áááºážááœáẠá¡ááœáŸááºážáá»á¬ážáááŸááá±á¬á·áá«á á¡á á®á¡á ááºááœá²áá°ááá¯áá°áá®ááá·áºá¡áá¬áááŸááá±á¬ááŒá±á¬áá·áº áá»áœááºá¯ááºááá¯á·ááá¯ááºááá¯ááºááᬠáá°á·ááá¯áá°áá®ááŒá®áž á¡ááŒá¶áá±ážááá¯ááºáá«áááºá ááŒá®ážáá±á¬á· áá«á á¡áá±ážá áááºááᯠáá»áœááºáá±á¬áºááŒá±á¬áá»ááºáᬠá¡ááá¡áá»áá«áá²á
ááá¯ážááŸááºážáá±á¬áá±ážááœááºážááŸáá·áº áááºážááŸáá·áºá¡áá° á¡á á®á¡á ááºáá áºáá¯
Postgres ááẠá¡áá±ážááááºážáá¬áá¬áá áºáá¯áá±á«áºááœáẠá¡áááºážááá¬áž 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
VERBOSE ááŒá±áá¬áá»ááºááᯠá¡áá¯á¶ážááŒá¯ááŒááºážááŒáá·áº á¡áá±ážááááºážáá¬áá¬ááá¯á· áá±ážááá¯á·ááá·áº query ááŸáá·áº áááºáá¶áá¯ááºáá±á¬ááºááŒááºážá¡ááœáẠáá»áœááºá¯ááºááá¯á· áááŸáááá·áºááááºáá»á¬áž (RemoteSQL line) ááᯠááŒáá·áºááŸá¯ááá¯ááºá á±áá«áááºá
áá±á¬ááºáááºáááºážáááºážááœá¬ážááŒáá·áºáá¡á±á¬ááºá áá»áœááºá¯ááºááá¯á·ááá±á¬ááºážááá¯ááŸá¯ááœáẠá á áºáá¯ááºááŸá¯áá»á¬ážá áœá¬ááá·áºáá«- áá áºáá¯á¡ááœáẠáá±áá¶áá»á±á¬ááºáž á¡ááœááºá áá áºáá¯ááŒá®ážáá áºáᯠTimestamp ááŒá¬ážáá¬á ááŸáá·áº áá áºáá¯ááŒá®ážáá áºáᯠ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
á€áááºááŸá¬ áá±ážááœááºážáá»á¬ážáá±ážáá¬ážááá·áºá¡áá« á¡á¬áá¯á¶á áá¯ááºáááá·áºá¡áá»ááºááŒá áºáááºá á á áºáá¯ááºááŸá¯áá»á¬ážááᯠáá±ážáá¶áá±á«ááºáá®áá±á¬áá¬áá¬ááá¯á· ááœáŸá²ááŒá±á¬ááºážááá±ážáá²á·áá«á ááá¯ááá¯áááºááŸá¬ áááºážááá¯áá¯ááºáá±á¬ááºáááºá¡ááœáẠPostgres ááẠá ááºááœááºážááŸá á á áºáá¯ááºááŒááºáž (Filter row) ááŸáá·áº áá±á«ááºážá ááºáá¯ááºáá±á¬ááºáááºá¡ááœáẠá¡áááºážáá±á«ááºáž 6 áááºážááᯠááœá²áá¯ááºáá«áááºá á¡á±á¬ááºááŒááºááŸá¯ááá±á¬á·áá»ááºááŸá¬ á á áºáá¯ááºááŸá¯áá»á¬ážááᯠá¡áá±ážááááºážá ááºááá¯á· ááœáŸá²ááŒá±á¬ááºážááá¯ááºááẠquery áá áºáá¯áá±ážáááºááŒá áºááŒá®áž ááá¯á¡ááºáá±á¬á¡áááºážáá»á¬ážááá¯áᬠáááºáá¶á á á¯á ááºážáá¬ážááŒááºážááŒá áºáááºá
á¡á²áá« booleanshit áá áºáá»áá¯á·áá«á
boolean fields ááŒáá·áº á¡áá¬á¡á¬ážáá¯á¶ážááẠááá¯ážááŸááºážáá«áááºá áá°ááá±á¬ááºážááá¯áá»ááºááœáẠááŒá¿áá¬ááŸá¬ á¡á±á¬áºááá±áá¬ááŒá±á¬áá·áºááŒá áºáááºá 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 operator áá²á· ááá°áá«áá°ážá = Null value áá²á· á¡áá¯ááºáá¯ááºááá¯ááºááá¯á·áá«á ááá¯ááá¯áá¬á áááŸááºáá«á False ááŸáá·áº Null áááºááá¯ážáá»á¬ážááᯠfilter ááœááºáá¬ážáá²á·áá«áááºá != ááŸááºáá«áááºá False values ââááœá±áá²áá»ááºáááá·áºáááºá ááá¯á·ááŒá±á¬áá·áº á¡á±á¬áºááá±áᬠá¡á á¬ážááá¯ážááá·áºá¡áá«á áááŒá ẠOR á¡á±á¬áºááá±áá¬ááŸáá·áºá¡áá° á¡ááŒá±á¡áá±ááŸá áºáá¯ááᯠfilter ááá¯á· áá°ážááœá¬ážááá·áºáááºá á¥ááá¬á WHERE (col != True) OR (col ááẠnull).
áá»áœááºá¯ááºááá¯á·ááẠáá°áá®áá¶ááᯠááá¯ááºááœááºááŒá®ážááŒá®á áááºááœá¬ážááŒáá«á áá¯á·á ááá¯á¡áá»áááºááœááºá á¡ááŒá¬ážááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážáá¡áá»áá¯ážáááºáá±á¬ááºááŸá¯ááᯠááœááºáááºá áœá¬áá¯á¶ážáááºááá¯ááºááẠBoolean á á áºáá¯ááºááŸá¯ááᯠáááºážááá°áááºážáá¯á¶á á¶ááá¯á· ááŒááºááŒáá«á áá¯á·á
á¡áá»áááºáá¶ááááºáá¯á¶áž? hz
áá±áá°áá»á¡á¬ážááŒáá·áºá áááºááẠá¡áá±ážááááºážáá¬áá¬áá»á¬ážáá«áááºááá·áº áá±á¬ááºážááá¯áá»ááºáá áºáá¯ááᯠááŸááºáááºá áœá¬áá±ážáááºážááŒáá·áº áááŒá¬áá á ááºážáááºááẠááá¯á¡ááºááŒá®áž áááºážá០áá¬ááŒá±á¬áá·áº ááá¯ááá¯á·ááŒá áºáááŒááºážá ááŸááºážáááºážáá»ááºááᯠááŸá¬ááœá±áá«á áááºážááŸáá·áºáááºáááºááá·áº á¡áá»ááºá¡áááºá¡áááºážáááºáᬠá¡ááºáá¬áááºáá±á«áºááœáẠááœá±á·ááŸáááá¯ááºáááºá ááá¯á·ááŒá±á¬áá·áºá á ááºážáááºááŸá¯áá»á¬ážááœáẠáááºááŸááºáá¬ážáá±á¬ áááºá áœá²á á áºáá¯ááºááŸá¯ááẠá¡áá±ážááŸáá¬áá¬ááá¯á· áá±á«ááºááœá²áá¶ááŒá®ážááŒáá·áº áá»á¶ááœá¬ážáááºááᯠáá»áœááºá¯ááºááá¯á·ááœá±á·ááŸááá²á·áá±á¬áºáááºážá áá»áœááºá¯ááºááá¯á·ááẠáááºá áœá²ááᯠááá¯ááºážááá áºááŒáá·áº áááºááŸááºááá¯áá±á¬á¡áá«ááœááºá á¥ááá¬á ááá¯() ááá¯á·ááá¯áẠCURRENT_DATEá ááá¯ááá¯á·áááŒá áºáá«á áá»áœááºá¯ááºááá¯á·áááá°áá¬ááœááºá áááºáá®ážáá¬ážáá±á¬_at áá±á¬áºáá¶ááœáẠááœááºáá²á·áá±á¬ 1 ááááá áá±áá¬áá«áááºááẠ(CURRENT_DATE - ááŒá¬ážáá¬á '7 á' ááŸáá·áº CURRENT_DATE - ááŒá¬ážáá¬á '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 ááá®ážáá«áž ááá¯ááŒááºáá¬áááºá
á€áá±áá¬ááœáẠááááá¬ážááẠá¡áá±ážááŒá®ážááŒááºáááº- áá±ážááœááºážááœá²ááŸá áá±áá¬á¡áá»áá¯ážá¡á á¬ážááẠáá»áœááºá¯ááºááá¯á· á á áºáá¯ááºáá±ááá·áº á¡ááœááºááŸáá·áº á¡áá°áá°ááẠááŒá áºááááºá ááá¯ááºáá«á á¡áá»áá¯ážá¡á á¬ážáá»á¬áž ááœá²ááŒá¬ážáá±á¬ááŒá±á¬áá·áº á á®á ááºáá°á០áá¯á¶ážááŒááºáááºá á¡á¬ážáá¯á¶ážááᯠáŠážá áœá¬ ááá°ááẠááá¯á¡ááºáá«áááºá data ááœá±ááᯠlocally filter áá¯ááºáá«á
áááºá áœá²á á áºáá¯ááºááŸá¯ááᯠáááºážááá°áááºážáááºááá¯ážááá¯á· ááŒááºááŒáá«á áá¯á·á
Freddy vs. Jsonb
áá±áá¯áá»á¡á¬ážááŒáá·áºá Boolean á¡ááœááºáá»á¬ážááŸáá·áº áááºá áœá²áá»á¬ážááẠáá»áœááºá¯ááºááá¯á·ááá±ážááŒááºážáá»ááºááᯠáá¯á¶áá±á¬ááºá áœá¬ á¡ááŸáááºááŒáŸáá·áºááŒá®ážááŒá áºáá±á¬áºáááºáž áá±á¬ááºáááºáá±áá¬á¡áá»áá¯ážá¡á á¬ážáá áºáᯠáá»ááºááŸááá±ážáááºá ááá¯ážáá¬ážá áœá¬ ááŒá±á¬ááá»áŸáẠá€áá±áá¬ááœáẠá¡á±á¬ááºááŒááºááŸá¯ ááŸááá±á¬áºáááºáž á á áºáá¯ááºááŒááºáž ááŸáá·áº ááá¯ááºááœá²ááẠáááŒá®ážáá¯á¶ážáá±ážáá«á ááá¯á·ááŒá±á¬áá·áºá á€áááºážááŒáá·áº áá»áœááºá¯ááºááá¯á·ááẠá á áºáá¯ááºááŸá¯ááᯠáá»á±á¬áºááŒááºááá¯ááºáá²á·áááºá 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 ááááºážá ááŸáááŒá®ážáá¬áž)á áá«ááááºá ááºážááŒáá·áºáá»ááºáááºááœá¬á
áá°á·ááᯠááŒá®ážá¡á±á¬ááºáá¯ááºáá«á
ááŒá±á¬ááºážáá²ááŸá¯áá áºáá¯á á®ááẠáá±á¬ááºážááá¯ááŸá¯á¡ááŒááºááŸá¯ááºážááᯠáá áºáŠážáá»ááºážá¡áá±á«áº áááºááá¯á·á¡áá»áá¯ážáááºáá±á¬ááºá á±áááºááᯠáá»áœááºá¯ááºááá¯á· á ááºážáááºáá²á·áááºá Filter áá¯á¶ážáá¯á áá¯á¶ážááᯠááŸááºááŸááºáááºáááºáá±ážáá²á·á¡áá« áá¬ááŒá áºááœá¬ážááá²ááá¯áᬠááŒáá·áºáá¡á±á¬ááºá
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 á ááá¯ááŒááºáááºá ááŒá®ážáá±á¬á· á¡áá±á¬áºáá±ážáá±ážáááºáá²á· áá±áá¬á¡á á¯á¶áá²á· áááºáááºáá²á· ááá¯ážááŸááºážáá²á· áá±ážááŒááºážáá»ááºáá áºáá¯á¡ááŒá±á¬ááºáž ááŒá±á¬áá±áᬠááŒá áºáá«áááºá á¡ááŸááºáááẠáá±á¬ááºážááá¯áá»ááºáá»á¬ážá¡áá áá»áœááºá¯ááºááá¯á·ááẠá¡ááŒáááºáá¬áá±á«ááºážáá»á¬ážá áœá¬á¡áá ááá¯ážáá¬áá²á·áá«áááºá
á¡ááŸá áºáá»á¯ááºááááº- á¡áááºá áááºááẠPostgreSQL ááᯠFDW ááŒáá·áº á¡áá¯á¶ážááŒá¯áá«áá á á áºáá¯ááºááŸá¯áá»á¬ážá¡á¬ážáá¯á¶ážááᯠá¡áá±ážááááºážáá¬áá¬ááá¯á· áá±ážááá¯á·ááŒá±á¬ááºáž á¡ááŒá²á á áºáá±ážáá«á ááẠáá»á±á¬áºááœáŸááºáááá·áºáááº... á¡áááºážáá¯á¶áž áááºááẠááá°áá®áá±á¬ áá¬áá¬áá»á¬ážá០ááá¬ážáá»á¬ážááŒá¬ážááœáẠááá«áááºááá»ááºážá áá«áá±ááá·áº áá«á áááŒá¬ážáá±á¬ááºážáá«ážáá áºáá¯ááºá¡ááœáẠáá¬ááºáááºážáá áºáá¯ááºáá«á
ááá¯á
áá¯ááºáá²á·á¡ááœááºáá»á±ážáá°ážáááºáá«áááº! áááºážáá²á·á¡ááœá±á·á¡ááŒá¯á¶ááœá±á¡ááŒá±á¬ááºáž áá±ážááœááºážááœá±á ááŸááºáá»ááºááœá±á áá¬ááºáááºážááœá±ááᯠááŸááºáá»ááºááœá±ááŸá¬ ááŒá¬ážáá»ááºáá«áááºá
source: www.habr.com