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`` という名前を使用します。

.. code:: console

   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
で完全に実行できるようにすることが難しい場合は、サポート
チケットを開いてください。
