DirectScan and fallback modes#
DirectScan#
Postgres Lakehouseは、クエリ全体をDataFusion、可能な場合にクエリを処理するために使用されるベクトル化クエリに「プッシュダウン」できる場合に最速です。将来的には、部分的なプッシュダウンのサポートを追加するため、より詳細な制御が可能になります。
Postgres Lakehouseは、2つのモードでクエリを実行できます。最初に、DataFusionに基づいた専用の列型データベースであるSeafowlを使用して、クエリ全体を実行しようとします。たとえば、JSONのようなPostgreSQL固有の操作を使用するためにSeafowlがクエリ全体を実行できない場合、Postgres LakehouseはPostgreSQLエグゼキュータの使用にフォールバックし、Seafowlは完全なテーブルコンテンツをストリーミングします。
クエリが非常に遅い場合、それが起こっている可能性があります。
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で完全に実行できるようにクエリを変更するのに問題がある場合は、サポートチケットをオープンしてください。