DirectScan and fallback modes#
ダイレクトスキャン#
Postgres Lakehouse は、クエリ全体を DataFusion(可能な場合のクエリ処理に使用されるベクトル化クエリ)に「プッシュダウン」できる場合に最も高速になります。(今後、部分的なプッシュダウンのサポートが追加され、よりきめ細かな制御が可能になります。)
Postgres Lakehouseは、クエリを2つのモードで実行できます。まず、DataFusionベースの専用列指向データベースであるSeafowlを使用して、クエリ全体の実行を試みます。SeafowlがJSONなどのPostgreSQL固有の操作を使用しているなどの理由でクエリ全体を実行できない場合、Postgres LakehouseはPostgreSQLエグゼキュータにフォールバックし、Seafowlはテーブルの全内容をPostgreSQLエグゼキュータにストリーミングします。
クエリが非常に遅い場合は、それが原因である可能性があります。
EXPLAINを使用してクエリプランを確認する#
クエリに対してEXPLAIN
を実行し、最上位のクエリノードがDirectScan
であることを確認することで、どのモードが使用されているかを確認できます。例:
explain select count from (select count(*) from tpch_sf_1.lineitem);
QUERY PLAN
- -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Aggregate (cost=167.52..167.55 rows=1 width=8)
-> Append (cost=0.00..165.01 rows=1001 width=0)
-> CompatScan on "16529" lineitem_2 (cost=100.00..150.00 rows=1000 width=0)
SeafowlPlan: logical_plan
TableScan: tpch_sf_1.lineitem projection=[l_orderkey, l_partkey, l_suppkey, l_linenumber, l_quantity, l_extendedprice, l_discount, l_tax, l_returnflag, l_linestatus, l_shipdate, l_commitdate, l_receiptdate, l_shipinstruct, l_shipmode, l_comment]
(6 rows)
この場合、クエリはPostgreSQLによって実行され、Seafowlはテーブルをスキャンする際にのみ使用されます(下部のCompatScan
を参照)。この場合の修正方法は、内部のCOUNT( *)
列に明示的に名前を付けることです。Seafowlは暗黙的にcount(* )
という名前を付けますが、PostgreSQLはcount という名前を使用します。
edb_admin=> explain select count from (select count(*) as count from tpch_sf_1.lineitem);
QUERY PLAN
- -------------------------------------------------------------------
DirectScan: logical_plan
Projection: COUNT(*) AS count
Aggregate: groupBy=[[]], aggr=[[COUNT(UInt8(1)) AS COUNT(*)]]
TableScan: tpch_sf_1.lineitem projection=[]
(4 rows)
ここで、上部に DirectScan が表示されています。これは、Seafowl
がクエリ全体を実行していることを意味します。
クエリを言い換えて Seafowl で完全に実行できるようにすることが難しい場合は、サポート チケットを開いてください。