forked from docs/doc-exports
Reviewed-by: Wagner, Fabian <fabian.wagner@t-systems.com> Co-authored-by: wangdengke2 <wangdengke2@huawei.com> Co-committed-by: wangdengke2 <wangdengke2@huawei.com>
383 lines
51 KiB
HTML
383 lines
51 KiB
HTML
<a name="EN-US_TOPIC_0000002124277309"></a><a name="EN-US_TOPIC_0000002124277309"></a>
|
|
|
|
<h1 class="topictitle1">Tuning Statement Pushdown</h1>
|
|
<div id="body0000001161785126"><div class="section" id="EN-US_TOPIC_0000002124277309__section15355mcpsimp"><h4 class="sectiontitle">Statement Pushdown</h4><p id="EN-US_TOPIC_0000002124277309__p15357mcpsimp">Currently, the <span id="EN-US_TOPIC_0000002124277309__text11615162742619">GaussDB</span> optimizer can use three methods to develop statement execution policies in the distributed framework: generating a statement pushdown plan, a distributed execution plan, or a distributed execution plan for sending statements.</p>
|
|
<ul id="EN-US_TOPIC_0000002124277309__ul15358mcpsimp"><li id="EN-US_TOPIC_0000002124277309__li15359mcpsimp">A statement pushdown plan pushes query statements from a CN down to DNs for execution and returns the execution results to the CN.</li><li id="EN-US_TOPIC_0000002124277309__li15360mcpsimp">In a distributed execution plan, a CN compiles and optimizes query statements, generates a plan tree, and then sends the plan tree to DNs for execution. After the statements have been executed, execution results will be returned to the CN.</li><li id="EN-US_TOPIC_0000002124277309__li15361mcpsimp">A distributed execution plan for sending statements pushes queries that can be pushed down (mostly base table scanning statements) to DNs for execution. Then, the plan obtains the intermediate results and sends them to the CN, on which the remaining queries are to be executed.</li></ul>
|
|
<p id="EN-US_TOPIC_0000002124277309__p15362mcpsimp">The third method sends many intermediate results from DNs to the CN for further execution. In this case, the CN performance bottleneck (in bandwidth, storage, and compute) is caused by statements that cannot be pushed down to DNs. Therefore, you are not advised to use the query statements where only the third method applies.</p>
|
|
<p id="EN-US_TOPIC_0000002124277309__p15363mcpsimp">Statements cannot be pushed down if they have <a href="#EN-US_TOPIC_0000002124277309__section15430mcpsimp">functions that do not support pushdown</a> or <a href="#EN-US_TOPIC_0000002124277309__section15454mcpsimp">syntax that does not support pushdown</a>. In this case, you can rewrite these execution statements.</p>
|
|
</div>
|
|
<div class="section" id="EN-US_TOPIC_0000002124277309__section15366mcpsimp"><h4 class="sectiontitle">Typical Scenarios of Statement Pushdown</h4><p id="EN-US_TOPIC_0000002124277309__p15368mcpsimp">Generally, no execution plan operator is displayed after the <strong id="EN-US_TOPIC_0000002124277309__b554212060113018">EXPLAIN</strong> statement. If the keyword similar to "Data Node Scan on" exists, statements have been pushed down to DNs for execution. The following describes statement pushdown and its supported scope from three scenarios.</p>
|
|
<p id="EN-US_TOPIC_0000002124277309__p15370mcpsimp"><strong id="EN-US_TOPIC_0000002124277309__b15371mcpsimp">1. Pushdown of single-table query statements</strong></p>
|
|
<p id="EN-US_TOPIC_0000002124277309__p15372mcpsimp">In a distributed database, to query a single table, whether the current statement can be pushed down depends on whether the CN needs to participate in calculation instead of simply collecting data. If the CN needs to further calculate the DN results, the statement cannot be pushed down. Generally, statements with keywords, such as <strong id="EN-US_TOPIC_0000002124277309__b548578096113018">agg</strong>, <strong id="EN-US_TOPIC_0000002124277309__b969553428113018">windows function</strong>, <strong id="EN-US_TOPIC_0000002124277309__b2060608466113018">limit/offset</strong>, <strong id="EN-US_TOPIC_0000002124277309__b855075956113018">sort</strong>, or <strong id="EN-US_TOPIC_0000002124277309__b132768313113018">distinct</strong>, cannot be pushed down.</p>
|
|
<ul id="EN-US_TOPIC_0000002124277309__ul15373mcpsimp"><li id="EN-US_TOPIC_0000002124277309__li15374mcpsimp">Pushdown: Simple queries can be pushed down without further calculation on the CN.<pre class="screen" id="EN-US_TOPIC_0000002124277309__screen1834918923116">postgres=# explain select * from t where c1 > 1;
|
|
QUERY PLAN
|
|
----------------------------------------------------------------------------
|
|
Data Node Scan on "__REMOTE_FQS_QUERY__" (cost=0.00..0.00 rows=0 width=0)
|
|
Node/s: All datanodes
|
|
(2 rows)</pre>
|
|
</li><li id="EN-US_TOPIC_0000002124277309__li15376mcpsimp">Non-pushdown: A CN with the <strong id="EN-US_TOPIC_0000002124277309__b716365467113018">limit</strong> clause cannot simply send statements to DNs and collect data, which is inconsistent with the semantics of the <strong id="EN-US_TOPIC_0000002124277309__b407569190113018">limit</strong> clause.<pre class="screen" id="EN-US_TOPIC_0000002124277309__screen14299710173313">postgres=# explain select * from t limit 1;
|
|
QUERY PLAN
|
|
-------------------------------------------------------------------------------------
|
|
Limit (cost=0.00..0.00 rows=1 width=12)
|
|
-> Data Node Scan on "__REMOTE_LIMIT_QUERY__" (cost=0.00..0.00 rows=1 width=12)
|
|
Node/s: All datanodes
|
|
(3 rows)</pre>
|
|
</li><li id="EN-US_TOPIC_0000002124277309__li15378mcpsimp">Non-pushdown: A CN with the <strong id="EN-US_TOPIC_0000002124277309__b49511248143819">aggregate</strong> function cannot simply push down statements. Instead, it needs to further aggregate the results collected from DNs.<pre class="screen" id="EN-US_TOPIC_0000002124277309__screen9104113233613">postgres=# explain select sum(c1), count(*) from t;
|
|
QUERY PLAN
|
|
-------------------------------------------------------------------------------------
|
|
Aggregate (cost=0.10..0.11 rows=1 width=20)
|
|
-> Data Node Scan on "__REMOTE_GROUP_QUERY__" (cost=0.00..0.00 rows=20 width=4)
|
|
Node/s: All datanodes
|
|
(3 rows)</pre>
|
|
</li></ul>
|
|
<p id="EN-US_TOPIC_0000002124277309__p15380mcpsimp"><strong id="EN-US_TOPIC_0000002124277309__b15381mcpsimp">2. Pushdown of multi-table query statements</strong></p>
|
|
<p id="EN-US_TOPIC_0000002124277309__p15382mcpsimp">In a multi-table query, whether a statement can be pushed down depends on the <strong id="EN-US_TOPIC_0000002124277309__b1053692592113018">join</strong> condition and distribution columns. If the <strong id="EN-US_TOPIC_0000002124277309__b1736028956113018">join</strong> condition matches the distribution columns of the table, the statement can be pushed down. Otherwise, the statement cannot be pushed down. Generally, replication tables can be pushed down.</p>
|
|
<ul id="EN-US_TOPIC_0000002124277309__ul15383mcpsimp"><li id="EN-US_TOPIC_0000002124277309__li15384mcpsimp">Create two hash distribution tables.<pre class="screen" id="EN-US_TOPIC_0000002124277309__screen1499055624217">postgres=# create table t(c1 int, c2 int, c3 int)distribute by hash(c1);
|
|
CREATE TABLE
|
|
postgres=# create table t1(c1 int, c2 int, c3 int)distribute by hash(c1);
|
|
CREATE TABLE</pre>
|
|
</li><li id="EN-US_TOPIC_0000002124277309__li15386mcpsimp">Pushdown: The <strong id="EN-US_TOPIC_0000002124277309__b188478057113018">join</strong> condition meets the hash distribution column attributes of two tables.<pre class="screen" id="EN-US_TOPIC_0000002124277309__screen16358165119445">postgres=# explain select * from t1 join t on t.c1 = t1.c1;
|
|
QUERY PLAN
|
|
----------------------------------------------------------------------------
|
|
Data Node Scan on "__REMOTE_FQS_QUERY__" (cost=0.00..0.00 rows=0 width=0)
|
|
Node/s: All datanodes
|
|
(2 rows)</pre>
|
|
</li><li id="EN-US_TOPIC_0000002124277309__li15388mcpsimp">Non-pushdown: The <strong id="EN-US_TOPIC_0000002124277309__b2056207874113018">join</strong> condition does not meet the hash distribution column attribute. <strong id="EN-US_TOPIC_0000002124277309__b1320274182113018">t1.c2</strong> is not the distribution column of <strong id="EN-US_TOPIC_0000002124277309__b1749377199113018">t1</strong>.<pre class="screen" id="EN-US_TOPIC_0000002124277309__screen2490192616465">postgres=# explain select * from t1 join t on t.c1 = t1.c2;
|
|
QUERY PLAN
|
|
--------------------------------------------------------------------------------------------
|
|
Hash Join (cost=0.25..0.53 rows=20 width=24)
|
|
Hash Cond: (t1.c2 = t.c1)
|
|
-> Data Node Scan on t1 "_REMOTE_TABLE_QUERY_" (cost=0.00..0.00 rows=20 width=12)
|
|
Node/s: All datanodes
|
|
-> Hash (cost=0.00..0.00 rows=20 width=12)
|
|
-> Data Node Scan on t "_REMOTE_TABLE_QUERY_" (cost=0.00..0.00 rows=20 width=12)
|
|
Node/s: All datanodes
|
|
(7 rows)</pre>
|
|
</li></ul>
|
|
<p id="EN-US_TOPIC_0000002124277309__p15390mcpsimp"><strong id="EN-US_TOPIC_0000002124277309__b15391mcpsimp">3. Special scenarios</strong></p>
|
|
<p id="EN-US_TOPIC_0000002124277309__p15392mcpsimp">In some special scenarios, for example, a statement containing the <strong id="EN-US_TOPIC_0000002124277309__b1793008793113018">with recursive</strong> clause or a column-store table cannot be pushed down.</p>
|
|
</div>
|
|
<div class="section" id="EN-US_TOPIC_0000002124277309__section15413mcpsimp"><h4 class="sectiontitle">Example: User-Defined Functions</h4><p id="EN-US_TOPIC_0000002124277309__p15415mcpsimp">Define a user-defined function that generates fixed output for a certain input as the <strong id="EN-US_TOPIC_0000002124277309__b8423527069275">immutable</strong> type.</p>
|
|
<p id="EN-US_TOPIC_0000002124277309__p15416mcpsimp">Take the sales information of TPCDS as an example. If you want to create a function to calculate the discount of a product, you can define the function as follows:</p>
|
|
<pre class="screen" id="EN-US_TOPIC_0000002124277309__screen15417mcpsimp">CREATE FUNCTION func_percent_2 (NUMERIC, NUMERIC) RETURNS NUMERIC
|
|
AS 'SELECT $1 / $2 WHERE $2 > 0.01'
|
|
LANGUAGE SQL
|
|
VOLATILE;</pre>
|
|
<p id="EN-US_TOPIC_0000002124277309__p15418mcpsimp">Run the following statements:</p>
|
|
<pre class="screen" id="EN-US_TOPIC_0000002124277309__screen15419mcpsimp">SELECT func_percent_2(ss_sales_price, ss_list_price)
|
|
FROM store_sales;</pre>
|
|
<p id="EN-US_TOPIC_0000002124277309__p15420mcpsimp">The execution plan is as follows.</p>
|
|
<p class="msonormal" id="EN-US_TOPIC_0000002124277309__p15421mcpsimp"><span><img id="EN-US_TOPIC_0000002124277309__image402" src="figure/en-us_image_0000002124197333.png" height="47.88" width="522.69" title="Click to enlarge" class="imgResize"></span></p>
|
|
<p id="EN-US_TOPIC_0000002124277309__p15422mcpsimp"><strong id="EN-US_TOPIC_0000002124277309__b13516115317498">func_percent_2</strong> is not pushed down, and <strong id="EN-US_TOPIC_0000002124277309__b852315316491">ss_sales_price</strong> and <strong id="EN-US_TOPIC_0000002124277309__b13523653194918">ss_list_price</strong> are executed on the CN. As a result, a large number of resources on the CN are consumed and the performance deteriorates.</p>
|
|
<p id="EN-US_TOPIC_0000002124277309__p15423mcpsimp">In this example, the function generates the same output when the same input is provided. You can modify the function to the following one:</p>
|
|
<pre class="screen" id="EN-US_TOPIC_0000002124277309__screen15424mcpsimp">CREATE FUNCTION func_percent_1 (NUMERIC, NUMERIC) RETURNS NUMERIC
|
|
AS 'SELECT $1 / $2 WHERE $2 > 0.01'
|
|
LANGUAGE SQL
|
|
IMMUTABLE;</pre>
|
|
<p id="EN-US_TOPIC_0000002124277309__p15425mcpsimp">Run the following statements:</p>
|
|
<pre class="screen" id="EN-US_TOPIC_0000002124277309__screen15426mcpsimp">SELECT func_percent_1(ss_sales_price, ss_list_price)
|
|
FROM store_sales;</pre>
|
|
<p id="EN-US_TOPIC_0000002124277309__p15427mcpsimp">The execution plan is as follows.</p>
|
|
<p class="msonormal" id="EN-US_TOPIC_0000002124277309__p15428mcpsimp"><span><img id="EN-US_TOPIC_0000002124277309__image403" src="figure/en-us_image_0000002124197337.png" height="39.900000000000006" width="522.69" title="Click to enlarge" class="imgResize"></span></p>
|
|
<p id="EN-US_TOPIC_0000002124277309__p15429mcpsimp"><strong id="EN-US_TOPIC_0000002124277309__b109876167527">func_percent_1</strong> is pushed down to DNs for quicker execution. (In TPC-DS 1000X, where three CNs and 18 DNs are used, the query efficiency is improved by over 100 times).</p>
|
|
</div>
|
|
<div class="section" id="EN-US_TOPIC_0000002124277309__section15430mcpsimp"><a name="EN-US_TOPIC_0000002124277309__section15430mcpsimp"></a><a name="section15430mcpsimp"></a><h4 class="sectiontitle">Functions That Do Not Support Pushdown</h4><p id="EN-US_TOPIC_0000002124277309__p15431mcpsimp">The following describes the volatility of functions. The function volatility in <span id="EN-US_TOPIC_0000002124277309__text15457410124113">GaussDB</span> is as follows:</p>
|
|
<ul id="EN-US_TOPIC_0000002124277309__ul15432mcpsimp"><li id="EN-US_TOPIC_0000002124277309__li15433mcpsimp"><strong id="EN-US_TOPIC_0000002124277309__b15434mcpsimp">IMMUTABLE</strong><p id="EN-US_TOPIC_0000002124277309__p15435mcpsimp">Specifies that the function always returns the same result if the parameter values are the same.</p>
|
|
</li><li id="EN-US_TOPIC_0000002124277309__li15436mcpsimp"><strong id="EN-US_TOPIC_0000002124277309__b15437mcpsimp">STABLE</strong><p id="EN-US_TOPIC_0000002124277309__p15438mcpsimp">Specifies that the function cannot modify the database, and that within a single table scan, it will consistently return the same result for the same parameter value, but its result varies by SQL statements.</p>
|
|
</li><li id="EN-US_TOPIC_0000002124277309__li15439mcpsimp"><strong id="EN-US_TOPIC_0000002124277309__b15440mcpsimp">VOLATILE</strong><p id="EN-US_TOPIC_0000002124277309__p15441mcpsimp">Specifies that the function value can change in a single table scan and no optimization is performed.</p>
|
|
</li></ul>
|
|
<p id="EN-US_TOPIC_0000002124277309__p15442mcpsimp">The volatility of a function can be obtained by querying its <strong id="EN-US_TOPIC_0000002124277309__b169012161807">provolatile</strong> column in <strong id="EN-US_TOPIC_0000002124277309__b46908161809">pg_proc</strong>. The value <strong id="EN-US_TOPIC_0000002124277309__b469051616014">i</strong> indicates <strong id="EN-US_TOPIC_0000002124277309__b198262004116">IMMUTABLE</strong>, <strong id="EN-US_TOPIC_0000002124277309__b1169020161808">s</strong> indicates <strong id="EN-US_TOPIC_0000002124277309__b113799121117">STABLE</strong> and <strong id="EN-US_TOPIC_0000002124277309__b769191612018">v</strong> indicates <strong id="EN-US_TOPIC_0000002124277309__b17317152310116">VOLATILE</strong>. The valid values of the <strong id="EN-US_TOPIC_0000002124277309__b193502915115">proshippable</strong> column in <strong id="EN-US_TOPIC_0000002124277309__b39406292016">pg_proc</strong> are <strong id="EN-US_TOPIC_0000002124277309__b0941329311">t</strong>, <strong id="EN-US_TOPIC_0000002124277309__b594110291218">f</strong>, and <strong id="EN-US_TOPIC_0000002124277309__b12941162919115">NULL</strong>. This column and the <strong id="EN-US_TOPIC_0000002124277309__b994115298113">provolatile</strong> column together describe whether a function is pushed down.</p>
|
|
<ul id="EN-US_TOPIC_0000002124277309__ul15443mcpsimp"><li id="EN-US_TOPIC_0000002124277309__li15444mcpsimp">If <strong id="EN-US_TOPIC_0000002124277309__b981651842113018">provolatile</strong> of a function is <strong id="EN-US_TOPIC_0000002124277309__b2073826260113018">i</strong>, the function can be pushed down regardless of whether <strong id="EN-US_TOPIC_0000002124277309__b1709906235113018">proshippable</strong> is <strong id="EN-US_TOPIC_0000002124277309__b536415546217">t</strong>.</li><li id="EN-US_TOPIC_0000002124277309__li15445mcpsimp">If <strong id="EN-US_TOPIC_0000002124277309__b1110112877113018">provolatile</strong> of a function is <strong id="EN-US_TOPIC_0000002124277309__b791589131113018">s</strong> or <strong id="EN-US_TOPIC_0000002124277309__b541633463113018">v</strong>, the function can be pushed only if <strong id="EN-US_TOPIC_0000002124277309__b1041169463113018">proshippable</strong> is <strong id="EN-US_TOPIC_0000002124277309__b736264201113018">t</strong>.</li><li id="EN-US_TOPIC_0000002124277309__li15446mcpsimp">CTEs containing <strong id="EN-US_TOPIC_0000002124277309__b110991717413">random</strong>, <strong id="EN-US_TOPIC_0000002124277309__b1611018179413">exec_hadoop_sql</strong>, or <strong id="EN-US_TOPIC_0000002124277309__b511011717417">exec_on_extension</strong> are not pushed down, because pushdown may lead to incorrect results.</li></ul>
|
|
<p id="EN-US_TOPIC_0000002124277309__p15447mcpsimp">For a user-defined function, you can specify the values of <strong id="EN-US_TOPIC_0000002124277309__b35457511341">provolatile</strong> and <strong id="EN-US_TOPIC_0000002124277309__b1551651347">proshippable</strong> during its creation. For details, see CREATE FUNCTION.</p>
|
|
<p id="EN-US_TOPIC_0000002124277309__p15450mcpsimp">For a function that does not support pushdown, you are advised to optimize it in the following ways:</p>
|
|
<ul id="EN-US_TOPIC_0000002124277309__ul15451mcpsimp"><li id="EN-US_TOPIC_0000002124277309__li15452mcpsimp">If it is a system function, replace it with a functionally equivalent one.</li><li id="EN-US_TOPIC_0000002124277309__li15453mcpsimp">If it is a user-defined function, check whether its <strong id="EN-US_TOPIC_0000002124277309__b311204811113018">provolatile</strong> and <strong id="EN-US_TOPIC_0000002124277309__b659723775113018">proshippable</strong> are correctly defined.</li></ul>
|
|
</div>
|
|
<div class="section" id="EN-US_TOPIC_0000002124277309__section15454mcpsimp"><a name="EN-US_TOPIC_0000002124277309__section15454mcpsimp"></a><a name="section15454mcpsimp"></a><h4 class="sectiontitle">Syntax That Does Not Support Pushdown</h4><p id="EN-US_TOPIC_0000002124277309__p15455mcpsimp">SQL syntax that does not support pushdown is described using the following table definition examples:</p>
|
|
<pre class="screen" id="EN-US_TOPIC_0000002124277309__screen15456mcpsimp">postgres=# CREATE TABLE CUSTOMER1
|
|
(
|
|
C_CUSTKEY BIGINT NOT NULL
|
|
, C_NAME VARCHAR(25) NOT NULL
|
|
, C_ADDRESS VARCHAR(40) NOT NULL
|
|
, C_NATIONKEY INT NOT NULL
|
|
, C_PHONE CHAR(15) NOT NULL
|
|
, C_ACCTBAL DECIMAL(15,2) NOT NULL
|
|
, C_MKTSEGMENT CHAR(10) NOT NULL
|
|
, C_COMMENT VARCHAR(117) NOT NULL
|
|
)
|
|
DISTRIBUTE BY hash(C_CUSTKEY);
|
|
postgres=# CREATE TABLE test_stream(a int,b float); --float does not support redistribution.
|
|
postgres=# CREATE TABLE sal_emp ( c1 integer[] ) DISTRIBUTE BY replication;</pre>
|
|
<ul id="EN-US_TOPIC_0000002124277309__ul15457mcpsimp"><li id="EN-US_TOPIC_0000002124277309__li15458mcpsimp">The <strong id="EN-US_TOPIC_0000002124277309__b1573316419119">RETURNING</strong> statement cannot be pushed down.<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000002124277309__en-us_topic_0073253801_screen50165520102824"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
|
|
<span class="normal">2</span>
|
|
<span class="normal">3</span>
|
|
<span class="normal">4</span>
|
|
<span class="normal">5</span>
|
|
<span class="normal">6</span>
|
|
<span class="normal">7</span>
|
|
<span class="normal">8</span>
|
|
<span class="normal">9</span></pre></div></td><td class="code"><div><pre><span></span><span class="n">postgres</span><span class="o">=#</span><span class="w"> </span><span class="k">explain</span><span class="w"> </span><span class="k">update</span><span class="w"> </span><span class="n">customer1</span><span class="w"> </span><span class="k">set</span><span class="w"> </span><span class="n">C_NAME</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'a'</span><span class="w"> </span><span class="n">returning</span><span class="w"> </span><span class="n">c_name</span><span class="p">;</span>
|
|
<span class="w"> </span><span class="n">QUERY</span><span class="w"> </span><span class="n">PLAN</span><span class="w"> </span>
|
|
<span class="c1">------------------------------------------------------------------</span>
|
|
<span class="w"> </span><span class="k">Update</span><span class="w"> </span><span class="k">on</span><span class="w"> </span><span class="n">customer1</span><span class="w"> </span><span class="p">(</span><span class="n">cost</span><span class="o">=</span><span class="mi">0</span><span class="p">.</span><span class="mi">00</span><span class="p">..</span><span class="mi">0</span><span class="p">.</span><span class="mi">00</span><span class="w"> </span><span class="k">rows</span><span class="o">=</span><span class="mi">30</span><span class="w"> </span><span class="n">width</span><span class="o">=</span><span class="mi">187</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="n">Node</span><span class="o">/</span><span class="n">s</span><span class="p">:</span><span class="w"> </span><span class="k">All</span><span class="w"> </span><span class="n">datanodes</span>
|
|
<span class="w"> </span><span class="n">Node</span><span class="w"> </span><span class="n">expr</span><span class="p">:</span><span class="w"> </span><span class="n">c_custkey</span>
|
|
<span class="w"> </span><span class="o">-></span><span class="w"> </span><span class="k">Data</span><span class="w"> </span><span class="n">Node</span><span class="w"> </span><span class="n">Scan</span><span class="w"> </span><span class="k">on</span><span class="w"> </span><span class="n">customer1</span><span class="w"> </span><span class="ss">"_REMOTE_TABLE_QUERY_"</span><span class="w"> </span><span class="p">(</span><span class="n">cost</span><span class="o">=</span><span class="mi">0</span><span class="p">.</span><span class="mi">00</span><span class="p">..</span><span class="mi">0</span><span class="p">.</span><span class="mi">00</span><span class="w"> </span><span class="k">rows</span><span class="o">=</span><span class="mi">30</span><span class="w"> </span><span class="n">width</span><span class="o">=</span><span class="mi">187</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="n">Node</span><span class="o">/</span><span class="n">s</span><span class="p">:</span><span class="w"> </span><span class="k">All</span><span class="w"> </span><span class="n">datanodes</span>
|
|
<span class="p">(</span><span class="mi">5</span><span class="w"> </span><span class="k">rows</span><span class="p">)</span>
|
|
</pre></div></td></tr></table></div>
|
|
</div>
|
|
</li><li id="EN-US_TOPIC_0000002124277309__li15460mcpsimp">If a SQL statement contains the aggregate functions using <strong id="EN-US_TOPIC_0000002124277309__b1632686522113018">ORDER BY</strong>, this statement cannot be pushed down.<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000002124277309__en-us_topic_0073253801_screen11298172103024"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
|
|
<span class="normal"> 2</span>
|
|
<span class="normal"> 3</span>
|
|
<span class="normal"> 4</span>
|
|
<span class="normal"> 5</span>
|
|
<span class="normal"> 6</span>
|
|
<span class="normal"> 7</span>
|
|
<span class="normal"> 8</span>
|
|
<span class="normal"> 9</span>
|
|
<span class="normal">10</span></pre></div></td><td class="code"><div><pre><span></span><span class="n">postgres</span><span class="o">=#</span><span class="w"> </span><span class="k">explain</span><span class="w"> </span><span class="k">verbose</span><span class="w"> </span><span class="k">select</span><span class="w"> </span><span class="k">count</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="n">c_custkey</span><span class="w"> </span><span class="k">order</span><span class="w"> </span><span class="k">by</span><span class="w"> </span><span class="n">c_custkey</span><span class="p">)</span><span class="w"> </span><span class="k">from</span><span class="w"> </span><span class="n">customer1</span><span class="p">;</span>
|
|
|
|
<span class="w"> </span><span class="n">QUERY</span><span class="w"> </span><span class="n">PLAN</span><span class="w"> </span>
|
|
<span class="c1">------------------------------------------------------------------ Aggregate (cost=2.50..2.51 rows=1 width=8)</span>
|
|
<span class="w"> </span><span class="k">Output</span><span class="p">:</span><span class="w"> </span><span class="k">count</span><span class="p">(</span><span class="n">customer1</span><span class="p">.</span><span class="n">c_custkey</span><span class="w"> </span><span class="k">ORDER</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">customer1</span><span class="p">.</span><span class="n">c_custkey</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="o">-></span><span class="w"> </span><span class="k">Data</span><span class="w"> </span><span class="n">Node</span><span class="w"> </span><span class="n">Scan</span><span class="w"> </span><span class="k">on</span><span class="w"> </span><span class="n">customer1</span><span class="w"> </span><span class="ss">"_REMOTE_TABLE_QUERY_"</span><span class="w"> </span><span class="p">(</span><span class="n">cost</span><span class="o">=</span><span class="mi">0</span><span class="p">.</span><span class="mi">00</span><span class="p">..</span><span class="mi">0</span><span class="p">.</span><span class="mi">00</span><span class="w"> </span><span class="k">rows</span><span class="o">=</span><span class="mi">30</span><span class="w"> </span><span class="n">width</span><span class="o">=</span><span class="mi">8</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="k">Output</span><span class="p">:</span><span class="w"> </span><span class="n">customer1</span><span class="p">.</span><span class="n">c_custkey</span>
|
|
<span class="w"> </span><span class="n">Node</span><span class="o">/</span><span class="n">s</span><span class="p">:</span><span class="w"> </span><span class="k">All</span><span class="w"> </span><span class="n">datanodes</span>
|
|
<span class="w"> </span><span class="n">Remote</span><span class="w"> </span><span class="n">query</span><span class="p">:</span><span class="w"> </span><span class="k">SELECT</span><span class="w"> </span><span class="n">c_custkey</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="k">ONLY</span><span class="w"> </span><span class="k">public</span><span class="p">.</span><span class="n">customer1</span><span class="w"> </span><span class="k">WHERE</span><span class="w"> </span><span class="k">true</span>
|
|
<span class="p">(</span><span class="mi">6</span><span class="w"> </span><span class="k">rows</span><span class="p">)</span>
|
|
</pre></div></td></tr></table></div>
|
|
</div>
|
|
</li><li id="EN-US_TOPIC_0000002124277309__li15462mcpsimp">If a SQL statement contains <strong id="EN-US_TOPIC_0000002124277309__b928935549113018">COUNT(DISTINCT</strong> <em id="EN-US_TOPIC_0000002124277309__i851178177113018">expr</em><strong id="EN-US_TOPIC_0000002124277309__b199283243113018">)</strong> and columns in <strong id="EN-US_TOPIC_0000002124277309__b95073277113018">COUNT(DISTINCT</strong> <em id="EN-US_TOPIC_0000002124277309__i1103304883113018">expr</em><strong id="EN-US_TOPIC_0000002124277309__b746833840113018">)</strong> do not support redistribution, this statement cannot be pushed down.<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000002124277309__en-us_topic_0073253801_screen40480085114621"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
|
|
<span class="normal">2</span>
|
|
<span class="normal">3</span>
|
|
<span class="normal">4</span>
|
|
<span class="normal">5</span>
|
|
<span class="normal">6</span>
|
|
<span class="normal">7</span>
|
|
<span class="normal">8</span>
|
|
<span class="normal">9</span></pre></div></td><td class="code"><div><pre><span></span><span class="n">postgres</span><span class="o">=#</span><span class="w"> </span><span class="k">explain</span><span class="w"> </span><span class="k">verbose</span><span class="w"> </span><span class="k">select</span><span class="w"> </span><span class="k">count</span><span class="p">(</span><span class="k">distinct</span><span class="w"> </span><span class="n">b</span><span class="p">)</span><span class="w"> </span><span class="k">from</span><span class="w"> </span><span class="n">test_stream</span><span class="p">;</span>
|
|
<span class="w"> </span><span class="n">QUERY</span><span class="w"> </span><span class="n">PLAN</span><span class="w"> </span>
|
|
<span class="c1">------------------------------------------------------------------ Aggregate (cost=2.50..2.51 rows=1 width=8)</span>
|
|
<span class="w"> </span><span class="k">Output</span><span class="p">:</span><span class="w"> </span><span class="k">count</span><span class="p">(</span><span class="k">DISTINCT</span><span class="w"> </span><span class="n">test_stream</span><span class="p">.</span><span class="n">b</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="o">-></span><span class="w"> </span><span class="k">Data</span><span class="w"> </span><span class="n">Node</span><span class="w"> </span><span class="n">Scan</span><span class="w"> </span><span class="k">on</span><span class="w"> </span><span class="n">test_stream</span><span class="w"> </span><span class="ss">"_REMOTE_TABLE_QUERY_"</span><span class="w"> </span><span class="p">(</span><span class="n">cost</span><span class="o">=</span><span class="mi">0</span><span class="p">.</span><span class="mi">00</span><span class="p">..</span><span class="mi">0</span><span class="p">.</span><span class="mi">00</span><span class="w"> </span><span class="k">rows</span><span class="o">=</span><span class="mi">30</span><span class="w"> </span><span class="n">width</span><span class="o">=</span><span class="mi">8</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="k">Output</span><span class="p">:</span><span class="w"> </span><span class="n">test_stream</span><span class="p">.</span><span class="n">b</span>
|
|
<span class="w"> </span><span class="n">Node</span><span class="o">/</span><span class="n">s</span><span class="p">:</span><span class="w"> </span><span class="k">All</span><span class="w"> </span><span class="n">datanodes</span>
|
|
<span class="w"> </span><span class="n">Remote</span><span class="w"> </span><span class="n">query</span><span class="p">:</span><span class="w"> </span><span class="k">SELECT</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="k">ONLY</span><span class="w"> </span><span class="k">public</span><span class="p">.</span><span class="n">test_stream</span><span class="w"> </span><span class="k">WHERE</span><span class="w"> </span><span class="k">true</span>
|
|
<span class="p">(</span><span class="mi">6</span><span class="w"> </span><span class="k">rows</span><span class="p">)</span>
|
|
</pre></div></td></tr></table></div>
|
|
</div>
|
|
</li><li id="EN-US_TOPIC_0000002124277309__li15464mcpsimp">A statement containing <strong id="EN-US_TOPIC_0000002124277309__b996861878113018">DISTINCT ON</strong> cannot be pushed down.<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000002124277309__en-us_topic_0073253801_screen57079366143041"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
|
|
<span class="normal"> 2</span>
|
|
<span class="normal"> 3</span>
|
|
<span class="normal"> 4</span>
|
|
<span class="normal"> 5</span>
|
|
<span class="normal"> 6</span>
|
|
<span class="normal"> 7</span>
|
|
<span class="normal"> 8</span>
|
|
<span class="normal"> 9</span>
|
|
<span class="normal">10</span>
|
|
<span class="normal">11</span>
|
|
<span class="normal">12</span></pre></div></td><td class="code"><div><pre><span></span><span class="n">postgres</span><span class="o">=#</span><span class="w"> </span><span class="k">explain</span><span class="w"> </span><span class="k">verbose</span><span class="w"> </span><span class="k">select</span><span class="w"> </span><span class="k">distinct</span><span class="w"> </span><span class="k">on</span><span class="w"> </span><span class="p">(</span><span class="n">c_custkey</span><span class="p">)</span><span class="w"> </span><span class="n">c_custkey</span><span class="w"> </span><span class="k">from</span><span class="w"> </span><span class="n">customer1</span><span class="w"> </span><span class="k">order</span><span class="w"> </span><span class="k">by</span><span class="w"> </span><span class="n">c_custkey</span><span class="p">;</span>
|
|
<span class="w"> </span><span class="n">QUERY</span><span class="w"> </span><span class="n">PLAN</span><span class="w"> </span>
|
|
<span class="c1">------------------------------------------------------------------ Unique (cost=49.83..54.83 rows=30 width=8)</span>
|
|
<span class="w"> </span><span class="k">Output</span><span class="p">:</span><span class="w"> </span><span class="n">customer1</span><span class="p">.</span><span class="n">c_custkey</span>
|
|
<span class="w"> </span><span class="o">-></span><span class="w"> </span><span class="n">Sort</span><span class="w"> </span><span class="p">(</span><span class="n">cost</span><span class="o">=</span><span class="mi">49</span><span class="p">.</span><span class="mi">83</span><span class="p">..</span><span class="mi">52</span><span class="p">.</span><span class="mi">33</span><span class="w"> </span><span class="k">rows</span><span class="o">=</span><span class="mi">30</span><span class="w"> </span><span class="n">width</span><span class="o">=</span><span class="mi">8</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="k">Output</span><span class="p">:</span><span class="w"> </span><span class="n">customer1</span><span class="p">.</span><span class="n">c_custkey</span>
|
|
<span class="w"> </span><span class="n">Sort</span><span class="w"> </span><span class="k">Key</span><span class="p">:</span><span class="w"> </span><span class="n">customer1</span><span class="p">.</span><span class="n">c_custkey</span>
|
|
<span class="w"> </span><span class="o">-></span><span class="w"> </span><span class="k">Data</span><span class="w"> </span><span class="n">Node</span><span class="w"> </span><span class="n">Scan</span><span class="w"> </span><span class="k">on</span><span class="w"> </span><span class="n">customer1</span><span class="w"> </span><span class="ss">"_REMOTE_TABLE_QUERY_"</span><span class="w"> </span><span class="p">(</span><span class="n">cost</span><span class="o">=</span><span class="mi">0</span><span class="p">.</span><span class="mi">00</span><span class="p">..</span><span class="mi">0</span><span class="p">.</span><span class="mi">00</span><span class="w"> </span><span class="k">rows</span><span class="o">=</span><span class="mi">30</span><span class="w"> </span><span class="n">width</span><span class="o">=</span><span class="mi">8</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="k">Output</span><span class="p">:</span><span class="w"> </span><span class="n">customer1</span><span class="p">.</span><span class="n">c_custkey</span>
|
|
<span class="w"> </span><span class="n">Node</span><span class="o">/</span><span class="n">s</span><span class="p">:</span><span class="w"> </span><span class="k">All</span><span class="w"> </span><span class="n">datanodes</span>
|
|
<span class="w"> </span><span class="n">Remote</span><span class="w"> </span><span class="n">query</span><span class="p">:</span><span class="w"> </span><span class="k">SELECT</span><span class="w"> </span><span class="n">c_custkey</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="k">ONLY</span><span class="w"> </span><span class="k">public</span><span class="p">.</span><span class="n">customer1</span><span class="w"> </span><span class="k">WHERE</span><span class="w"> </span><span class="k">true</span>
|
|
<span class="p">(</span><span class="mi">9</span><span class="w"> </span><span class="k">rows</span><span class="p">)</span>
|
|
</pre></div></td></tr></table></div>
|
|
</div>
|
|
</li><li id="EN-US_TOPIC_0000002124277309__li15468mcpsimp">A statement containing array expressions cannot be pushed down.<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000002124277309__en-us_topic_0073253801_screen70090431515"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
|
|
<span class="normal"> 2</span>
|
|
<span class="normal"> 3</span>
|
|
<span class="normal"> 4</span>
|
|
<span class="normal"> 5</span>
|
|
<span class="normal"> 6</span>
|
|
<span class="normal"> 7</span>
|
|
<span class="normal"> 8</span>
|
|
<span class="normal"> 9</span>
|
|
<span class="normal">10</span>
|
|
<span class="normal">11</span></pre></div></td><td class="code"><div><pre><span></span><span class="n">postgres</span><span class="o">=#</span><span class="w"> </span><span class="k">explain</span><span class="w"> </span><span class="k">verbose</span><span class="w"> </span><span class="k">select</span><span class="w"> </span><span class="nb">array</span><span class="p">[</span><span class="n">c_custkey</span><span class="p">,</span><span class="mi">1</span><span class="p">]</span><span class="w"> </span><span class="k">from</span><span class="w"> </span><span class="n">customer1</span><span class="w"> </span><span class="k">order</span><span class="w"> </span><span class="k">by</span><span class="w"> </span><span class="n">c_custkey</span><span class="p">;</span>
|
|
|
|
<span class="w"> </span><span class="n">QUERY</span><span class="w"> </span><span class="n">PLAN</span><span class="w"> </span>
|
|
<span class="c1">------------------------------------------------------------------ Sort (cost=49.83..52.33 rows=30 width=8)</span>
|
|
<span class="w"> </span><span class="k">Output</span><span class="p">:</span><span class="w"> </span><span class="p">(</span><span class="nb">ARRAY</span><span class="p">[</span><span class="n">customer1</span><span class="p">.</span><span class="n">c_custkey</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">::</span><span class="nb">bigint</span><span class="p">]),</span><span class="w"> </span><span class="n">customer1</span><span class="p">.</span><span class="n">c_custkey</span>
|
|
<span class="w"> </span><span class="n">Sort</span><span class="w"> </span><span class="k">Key</span><span class="p">:</span><span class="w"> </span><span class="n">customer1</span><span class="p">.</span><span class="n">c_custkey</span>
|
|
<span class="w"> </span><span class="o">-></span><span class="w"> </span><span class="k">Data</span><span class="w"> </span><span class="n">Node</span><span class="w"> </span><span class="n">Scan</span><span class="w"> </span><span class="k">on</span><span class="w"> </span><span class="ss">"__REMOTE_SORT_QUERY__"</span><span class="w"> </span><span class="p">(</span><span class="n">cost</span><span class="o">=</span><span class="mi">0</span><span class="p">.</span><span class="mi">00</span><span class="p">..</span><span class="mi">0</span><span class="p">.</span><span class="mi">00</span><span class="w"> </span><span class="k">rows</span><span class="o">=</span><span class="mi">30</span><span class="w"> </span><span class="n">width</span><span class="o">=</span><span class="mi">8</span><span class="p">)</span>
|
|
<span class="w"> </span><span class="k">Output</span><span class="p">:</span><span class="w"> </span><span class="p">(</span><span class="nb">ARRAY</span><span class="p">[</span><span class="n">customer1</span><span class="p">.</span><span class="n">c_custkey</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">::</span><span class="nb">bigint</span><span class="p">]),</span><span class="w"> </span><span class="n">customer1</span><span class="p">.</span><span class="n">c_custkey</span>
|
|
<span class="w"> </span><span class="n">Node</span><span class="o">/</span><span class="n">s</span><span class="p">:</span><span class="w"> </span><span class="k">All</span><span class="w"> </span><span class="n">datanodes</span>
|
|
<span class="w"> </span><span class="n">Remote</span><span class="w"> </span><span class="n">query</span><span class="p">:</span><span class="w"> </span><span class="k">SELECT</span><span class="w"> </span><span class="nb">ARRAY</span><span class="p">[</span><span class="n">c_custkey</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">::</span><span class="nb">bigint</span><span class="p">],</span><span class="w"> </span><span class="n">c_custkey</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="k">ONLY</span><span class="w"> </span><span class="k">public</span><span class="p">.</span><span class="n">customer1</span><span class="w"> </span><span class="k">WHERE</span><span class="w"> </span><span class="k">true</span><span class="w"> </span><span class="k">ORDER</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="mi">2</span>
|
|
<span class="p">(</span><span class="mi">7</span><span class="w"> </span><span class="k">rows</span><span class="p">)</span>
|
|
</pre></div></td></tr></table></div>
|
|
</div>
|
|
</li><li id="EN-US_TOPIC_0000002124277309__li15470mcpsimp">Some statements containing <strong id="EN-US_TOPIC_0000002124277309__b511772961712">WITH RECURSIVE</strong> cannot be pushed down in the current version. The following table describes the specific scenarios and causes.</li></ul>
|
|
|
|
<div class="tablenoborder"><table cellpadding="4" cellspacing="0" summary="" id="EN-US_TOPIC_0000002124277309__table15471mcpsimp" frame="border" border="1" rules="all"><thead align="left"><tr id="EN-US_TOPIC_0000002124277309__row15477mcpsimp"><th align="left" class="cellrowborder" valign="top" width="11%" id="mcps1.3.5.5.1.4.1.1"><p id="EN-US_TOPIC_0000002124277309__p15479mcpsimp">No.</p>
|
|
</th>
|
|
<th align="left" class="cellrowborder" valign="top" width="44%" id="mcps1.3.5.5.1.4.1.2"><p id="EN-US_TOPIC_0000002124277309__p15482mcpsimp">Scenario</p>
|
|
</th>
|
|
<th align="left" class="cellrowborder" valign="top" width="45%" id="mcps1.3.5.5.1.4.1.3"><p id="EN-US_TOPIC_0000002124277309__p15485mcpsimp">Cause</p>
|
|
</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody><tr id="EN-US_TOPIC_0000002124277309__row15488mcpsimp"><td class="cellrowborder" valign="top" width="11%" headers="mcps1.3.5.5.1.4.1.1 "><p id="EN-US_TOPIC_0000002124277309__p15490mcpsimp">1</p>
|
|
</td>
|
|
<td class="cellrowborder" valign="top" width="44%" headers="mcps1.3.5.5.1.4.1.2 "><p id="EN-US_TOPIC_0000002124277309__p15492mcpsimp">The query contains foreign tables.</p>
|
|
</td>
|
|
<td class="cellrowborder" valign="top" width="45%" headers="mcps1.3.5.5.1.4.1.3 "><p id="EN-US_TOPIC_0000002124277309__p15494mcpsimp">LOG: SQL can't be shipped, reason: RecursiveUnion contains HDFS Table or ForeignScan is not shippable (In this table, <strong id="EN-US_TOPIC_0000002124277309__b13154110142310">LOG</strong> indicates the non-pushdown reason recorded in CN logs.)</p>
|
|
<p id="EN-US_TOPIC_0000002124277309__p15495mcpsimp">In the current version, queries containing foreign tables do not support pushdown.</p>
|
|
</td>
|
|
</tr>
|
|
<tr id="EN-US_TOPIC_0000002124277309__row15496mcpsimp"><td class="cellrowborder" valign="top" width="11%" headers="mcps1.3.5.5.1.4.1.1 "><p id="EN-US_TOPIC_0000002124277309__p15498mcpsimp">2</p>
|
|
</td>
|
|
<td class="cellrowborder" valign="top" width="44%" headers="mcps1.3.5.5.1.4.1.2 "><p id="EN-US_TOPIC_0000002124277309__p15500mcpsimp">Multiple node groups</p>
|
|
</td>
|
|
<td class="cellrowborder" valign="top" width="45%" headers="mcps1.3.5.5.1.4.1.3 "><p id="EN-US_TOPIC_0000002124277309__p15502mcpsimp">LOG: SQL can't be shipped, reason: With-Recursive under multi-nodegroup scenario is not shippable</p>
|
|
<p id="EN-US_TOPIC_0000002124277309__p15503mcpsimp">In the current version, pushdown is supported only when all base tables are stored and computed in the same Node Group.</p>
|
|
</td>
|
|
</tr>
|
|
<tr id="EN-US_TOPIC_0000002124277309__row15504mcpsimp"><td class="cellrowborder" valign="top" width="11%" headers="mcps1.3.5.5.1.4.1.1 "><p id="EN-US_TOPIC_0000002124277309__p15506mcpsimp">3</p>
|
|
</td>
|
|
<td class="cellrowborder" valign="top" width="44%" headers="mcps1.3.5.5.1.4.1.2 "><p id="EN-US_TOPIC_0000002124277309__p15508mcpsimp"><strong id="EN-US_TOPIC_0000002124277309__b1654193132920">ALL</strong> is not used for <strong id="EN-US_TOPIC_0000002124277309__b4661239299">UNION</strong>. In this case, the return result is deduplicated.</p>
|
|
</td>
|
|
<td class="cellrowborder" valign="top" width="45%" headers="mcps1.3.5.5.1.4.1.3 "><p id="EN-US_TOPIC_0000002124277309__p15510mcpsimp">LOG: SQL can't be shipped, reason: With-Recursive does not contain "ALL" to bind recursive & none-recursive branches</p>
|
|
<p id="EN-US_TOPIC_0000002124277309__p15511mcpsimp">Example:</p>
|
|
<pre class="screen" id="EN-US_TOPIC_0000002124277309__screen13211945706">WITH recursive t_result AS (
|
|
SELECT dm,sj_dm,name,1 as level
|
|
FROM test_rec_part
|
|
WHERE sj_dm > 10
|
|
UNION
|
|
SELECT t2.dm,t2.sj_dm,t2.name||' > '||t1.name,t1.level+1
|
|
FROM t_result t1
|
|
JOIN test_rec_part t2 ON t2.sj_dm = t1.dm
|
|
)
|
|
SELECT * FROM t_result t;</pre>
|
|
</td>
|
|
</tr>
|
|
<tr id="EN-US_TOPIC_0000002124277309__row15513mcpsimp"><td class="cellrowborder" valign="top" width="11%" headers="mcps1.3.5.5.1.4.1.1 "><p id="EN-US_TOPIC_0000002124277309__p15515mcpsimp">4</p>
|
|
</td>
|
|
<td class="cellrowborder" valign="top" width="44%" headers="mcps1.3.5.5.1.4.1.2 "><p id="EN-US_TOPIC_0000002124277309__p15517mcpsimp">A base table contains the system catalog.</p>
|
|
</td>
|
|
<td class="cellrowborder" valign="top" width="45%" headers="mcps1.3.5.5.1.4.1.3 "><p id="EN-US_TOPIC_0000002124277309__p15519mcpsimp">LOG: SQL can't be shipped, reason: With-Recursive contains system table is not shippable</p>
|
|
<p id="EN-US_TOPIC_0000002124277309__p15520mcpsimp">Example:</p>
|
|
<pre class="screen" id="EN-US_TOPIC_0000002124277309__screen59288170118">WITH RECURSIVE x(id) AS
|
|
(
|
|
select count(1) from pg_class where oid=1247
|
|
UNION ALL
|
|
SELECT id+1 FROM x WHERE id < 5
|
|
), y(id) AS
|
|
(
|
|
select count(1) from pg_class where oid=1247
|
|
UNION ALL
|
|
SELECT id+1 FROM x WHERE id < 10
|
|
)
|
|
SELECT y.*, x.* FROM y LEFT JOIN x USING (id) ORDER BY 1;</pre>
|
|
</td>
|
|
</tr>
|
|
<tr id="EN-US_TOPIC_0000002124277309__row15522mcpsimp"><td class="cellrowborder" valign="top" width="11%" headers="mcps1.3.5.5.1.4.1.1 "><p id="EN-US_TOPIC_0000002124277309__p15524mcpsimp">5</p>
|
|
</td>
|
|
<td class="cellrowborder" valign="top" width="44%" headers="mcps1.3.5.5.1.4.1.2 "><p id="EN-US_TOPIC_0000002124277309__p15526mcpsimp">Only <strong id="EN-US_TOPIC_0000002124277309__b534402966113019">VALUES</strong> is used for scanning base tables. In this case, the statement can be executed only on the CN.</p>
|
|
</td>
|
|
<td class="cellrowborder" valign="top" width="45%" headers="mcps1.3.5.5.1.4.1.3 "><p id="EN-US_TOPIC_0000002124277309__p15528mcpsimp">LOG: SQL can't be shipped, reason: With-Recursive contains only values rte is not shippable</p>
|
|
<p id="EN-US_TOPIC_0000002124277309__p15529mcpsimp">Example:</p>
|
|
<pre class="screen" id="EN-US_TOPIC_0000002124277309__screen2911155218114">WITH RECURSIVE t(n) AS (
|
|
VALUES (1)
|
|
UNION ALL
|
|
SELECT n+1 FROM t WHERE n < 100
|
|
)
|
|
SELECT sum(n) FROM t;</pre>
|
|
</td>
|
|
</tr>
|
|
<tr id="EN-US_TOPIC_0000002124277309__row15531mcpsimp"><td class="cellrowborder" valign="top" width="11%" headers="mcps1.3.5.5.1.4.1.1 "><p id="EN-US_TOPIC_0000002124277309__p19578165115537">6</p>
|
|
</td>
|
|
<td class="cellrowborder" valign="top" width="44%" headers="mcps1.3.5.5.1.4.1.2 "><p id="EN-US_TOPIC_0000002124277309__p1283015395118">The correlation conditions of correlated subqueries are only in the recursion part, and the non-recursion part has no correlation condition.</p>
|
|
</td>
|
|
<td class="cellrowborder" valign="top" width="45%" headers="mcps1.3.5.5.1.4.1.3 "><p id="EN-US_TOPIC_0000002124277309__p8578105116536">LOG: SQL can't be shipped, reason: With-Recursive recursive term correlated only is not shippable</p>
|
|
<p id="EN-US_TOPIC_0000002124277309__p6578151165311"></p>
|
|
<p id="EN-US_TOPIC_0000002124277309__p13843148821">Example:</p>
|
|
<pre class="screen" id="EN-US_TOPIC_0000002124277309__screen1767791817219">select a.ID,a.Name,
|
|
(
|
|
with recursive cte as (
|
|
select ID, PID, NAME from b where b.ID = 1
|
|
union all
|
|
select parent.ID,parent.PID,parent.NAME
|
|
from cte as child join b as parent on child.pid=parent.id
|
|
where child.ID = a.ID
|
|
)
|
|
select NAME from cte limit 1
|
|
) cName
|
|
from
|
|
(
|
|
select id, name, count(*) as cnt
|
|
from a group by id,name
|
|
) a order by 1,2;</pre>
|
|
</td>
|
|
</tr>
|
|
<tr id="EN-US_TOPIC_0000002124277309__row15540mcpsimp"><td class="cellrowborder" valign="top" width="11%" headers="mcps1.3.5.5.1.4.1.1 "><p id="EN-US_TOPIC_0000002124277309__p257812513534">7</p>
|
|
</td>
|
|
<td class="cellrowborder" valign="top" width="44%" headers="mcps1.3.5.5.1.4.1.2 "><p id="EN-US_TOPIC_0000002124277309__p36061331141118">The <strong id="EN-US_TOPIC_0000002124277309__b1112073581113019">replicate</strong> plan is used for <strong id="EN-US_TOPIC_0000002124277309__b928330388113019">limit</strong> in the non-recursion part but the <strong id="EN-US_TOPIC_0000002124277309__b1177890666113019">hash</strong> plan is used in the recursion part, resulting in conflicts.</p>
|
|
</td>
|
|
<td class="cellrowborder" valign="top" width="45%" headers="mcps1.3.5.5.1.4.1.3 "><p id="EN-US_TOPIC_0000002124277309__p1657895116533">LOG: SQL can't be shipped, reason: With-Recursive contains conflict distribution in none-recursive(Replicate) recursive(Hash)</p>
|
|
<p id="EN-US_TOPIC_0000002124277309__p125786515535"></p>
|
|
<p id="EN-US_TOPIC_0000002124277309__p357815111536">Example:</p>
|
|
<pre class="screen" id="EN-US_TOPIC_0000002124277309__screen121131533327">WITH recursive t_result AS (
|
|
select * from(
|
|
SELECT dm,sj_dm,name,1 as level
|
|
FROM test_rec_part
|
|
WHERE sj_dm < 10 order by dm limit 6 offset 2)
|
|
UNION all
|
|
SELECT t2.dm,t2.sj_dm,t2.name||' > '||t1.name,t1.level+1
|
|
FROM t_result t1
|
|
JOIN test_rec_part t2 ON t2.sj_dm = t1.dm
|
|
)
|
|
SELECT * FROM t_result t;</pre>
|
|
</td>
|
|
</tr>
|
|
<tr id="EN-US_TOPIC_0000002124277309__row15549mcpsimp"><td class="cellrowborder" valign="top" width="11%" headers="mcps1.3.5.5.1.4.1.1 "><p id="EN-US_TOPIC_0000002124277309__p1257825175312">8</p>
|
|
</td>
|
|
<td class="cellrowborder" valign="top" width="44%" headers="mcps1.3.5.5.1.4.1.2 "><p id="EN-US_TOPIC_0000002124277309__p7793145511117"><strong id="EN-US_TOPIC_0000002124277309__b161219251422">recursive</strong> of multiple layers are nested. A <strong id="EN-US_TOPIC_0000002124277309__b11121625154213">recursive</strong> is nested in the recursion part of another <strong id="EN-US_TOPIC_0000002124277309__b11221125104214">recursive</strong>.</p>
|
|
</td>
|
|
<td class="cellrowborder" valign="top" width="45%" headers="mcps1.3.5.5.1.4.1.3 "><p id="EN-US_TOPIC_0000002124277309__p1957918515536">LOG: SQL can't be shipped, reason: Recursive CTE references recursive CTE "cte"</p>
|
|
<p id="EN-US_TOPIC_0000002124277309__p1257975114534"></p>
|
|
<p id="EN-US_TOPIC_0000002124277309__p1087895814210">Example:</p>
|
|
<pre class="screen" id="EN-US_TOPIC_0000002124277309__screen18296165315211">with recursive cte as
|
|
(
|
|
select * from rec_tb4 where id<4
|
|
union all
|
|
select h.id,h.parentID,h.name from
|
|
(
|
|
with recursive cte as
|
|
(
|
|
select * from rec_tb4 where id<4
|
|
union all
|
|
select h.id,h.parentID,h.name from rec_tb4 h inner join cte c on h.id=c.parentID
|
|
)
|
|
SELECT id ,parentID,name from cte order by parentID
|
|
) h
|
|
inner join cte c on h.id=c.parentID
|
|
)
|
|
SELECT id ,parentID,name from cte order by parentID,1,2,3;</pre>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<div class="familylinks">
|
|
<div class="parentlink"><strong>Parent topic:</strong> <a href="opengauss_opti_0044.html">Typical SQL Tuning Advantages</a></div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<script language="JavaScript">
|
|
<!--
|
|
image_size('.imgResize');
|
|
var msg_imageMax = "view original image";
|
|
var msg_imageClose = "close";
|
|
//--></script> |