forked from docs/doc-exports
Reviewed-by: Pruthi, Vineet <vineet.pruthi@t-systems.com> Co-authored-by: Lu, Huayi <luhuayi@huawei.com> Co-committed-by: Lu, Huayi <luhuayi@huawei.com>
49 lines
11 KiB
HTML
49 lines
11 KiB
HTML
<a name="EN-US_TOPIC_0000001555477902"></a><a name="EN-US_TOPIC_0000001555477902"></a>
|
|
|
|
<h1 class="topictitle1">Case: Converting from NOT IN to NOT EXISTS</h1>
|
|
<div id="body0000001555477902"><p id="EN-US_TOPIC_0000001555477902__p129653446717"><strong id="EN-US_TOPIC_0000001555477902__b4281122811564">nestloop anti join</strong> must be used to implement <strong id="EN-US_TOPIC_0000001555477902__b96561932185617">NOT IN</strong>, while you can use <strong id="EN-US_TOPIC_0000001555477902__b878853635613">Hash anti join</strong> to implement <strong id="EN-US_TOPIC_0000001555477902__b14405164275610">NOT EXISTS</strong>. If no <strong id="EN-US_TOPIC_0000001555477902__b146754888794449">NULL</strong> value exists in the <strong id="EN-US_TOPIC_0000001555477902__b195743312794449">JOIN</strong> column, <strong id="EN-US_TOPIC_0000001555477902__b214266821394449">NOT IN</strong> is equivalent to <strong id="EN-US_TOPIC_0000001555477902__b97208142694449">NOT EXISTS</strong>. Therefore, if you are sure that no <strong id="EN-US_TOPIC_0000001555477902__b187370149294449">NULL</strong> value exists, you can convert <strong id="EN-US_TOPIC_0000001555477902__b12746891694449">NOT IN</strong> to <strong id="EN-US_TOPIC_0000001555477902__b37802943694449">NOT EXISTS</strong> to generate <strong id="EN-US_TOPIC_0000001555477902__b208653846994449">hash joins</strong> and to improve the query performance.</p>
|
|
<div class="section" id="EN-US_TOPIC_0000001555477902__section107679317810"><h4 class="sectiontitle">Before Optimization</h4><p id="EN-US_TOPIC_0000001555477902__p317410511881">Create two base tables <strong id="EN-US_TOPIC_0000001555477902__b19547016115719">t1</strong> and <strong id="EN-US_TOPIC_0000001555477902__b12481121811579">t2</strong>.</p>
|
|
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001555477902__screen116261491596"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
|
|
<span class="normal">2</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">t1</span><span class="p">(</span><span class="n">a</span><span class="w"> </span><span class="nb">int</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="nb">int</span><span class="p">,</span><span class="w"> </span><span class="k">c</span><span class="w"> </span><span class="nb">int</span><span class="w"> </span><span class="k">not</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="k">WITH</span><span class="p">(</span><span class="n">orientation</span><span class="o">=</span><span class="k">row</span><span class="p">);</span>
|
|
<span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">t2</span><span class="p">(</span><span class="n">a</span><span class="w"> </span><span class="nb">int</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="nb">int</span><span class="p">,</span><span class="w"> </span><span class="k">c</span><span class="w"> </span><span class="nb">int</span><span class="w"> </span><span class="k">not</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="k">WITH</span><span class="p">(</span><span class="n">orientation</span><span class="o">=</span><span class="k">row</span><span class="p">);</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
<p id="EN-US_TOPIC_0000001555477902__p15667193517101">Run the following SQL statement to query the <strong id="EN-US_TOPIC_0000001555477902__b1875211251577">NOT IN</strong> execution plan:</p>
|
|
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001555477902__screen1421974271019"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></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="o">*</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">t1</span><span class="w"> </span><span class="k">WHERE</span><span class="w"> </span><span class="n">t1</span><span class="p">.</span><span class="k">c</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">IN</span><span class="w"> </span><span class="p">(</span><span class="k">SELECT</span><span class="w"> </span><span class="n">t2</span><span class="p">.</span><span class="k">c</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">t2</span><span class="p">);</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
<p id="EN-US_TOPIC_0000001555477902__p450272612118">The following figure shows the statement output.</p>
|
|
<p id="EN-US_TOPIC_0000001555477902__p1455157171118"><span><img id="EN-US_TOPIC_0000001555477902__image1610898101116" src="figure/en-us_image_0000001555962590.png"></span></p>
|
|
<p id="EN-US_TOPIC_0000001555477902__p3231114161210">According to the returned result, nest loops are used. As the OR operation result of NULL and any value is NULL,</p>
|
|
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001555477902__screen1922302841210"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><span class="n">t1</span><span class="p">.</span><span class="k">c</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">IN</span><span class="w"> </span><span class="p">(</span><span class="k">SELECT</span><span class="w"> </span><span class="n">t2</span><span class="p">.</span><span class="k">c</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">t2</span><span class="p">)</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
<p id="EN-US_TOPIC_0000001555477902__p9988154218918">the preceding condition expression is equivalent to:</p>
|
|
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001555477902__screen786983214124"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><span class="n">t1</span><span class="p">.</span><span class="k">c</span><span class="w"> </span><span class="o"><></span><span class="w"> </span><span class="k">ANY</span><span class="p">(</span><span class="n">t2</span><span class="p">.</span><span class="k">c</span><span class="p">)</span><span class="w"> </span><span class="k">AND</span><span class="w"> </span><span class="n">t1</span><span class="p">.</span><span class="k">c</span><span class="w"> </span><span class="k">IS</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="w"> </span><span class="k">AND</span><span class="w"> </span><span class="k">ANY</span><span class="p">(</span><span class="n">t2</span><span class="p">.</span><span class="k">c</span><span class="p">)</span><span class="w"> </span><span class="k">IS</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="w"> </span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
</div>
|
|
<div class="section" id="EN-US_TOPIC_0000001555477902__section628523510154"><h4 class="sectiontitle">After Optimization</h4><p id="EN-US_TOPIC_0000001555477902__p18328165018153">The query can be modified as follows:</p>
|
|
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001555477902__screen1386254611619"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">SELECT</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">t1</span><span class="w"> </span><span class="k">WHERE</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">EXISTS</span><span class="w"> </span><span class="p">(</span><span class="k">SELECT</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">t2</span><span class="w"> </span><span class="k">WHERE</span><span class="w"> </span><span class="n">t2</span><span class="p">.</span><span class="k">c</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">t1</span><span class="p">.</span><span class="k">c</span><span class="p">);</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
<p id="EN-US_TOPIC_0000001555477902__p131916172322">Run the following statement to query the execution plan of <strong id="EN-US_TOPIC_0000001555477902__b158076597585">NOT EXISTS</strong>:</p>
|
|
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001555477902__screen19483811327"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></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="o">*</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">t1</span><span class="w"> </span><span class="k">WHERE</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">EXISTS</span><span class="w"> </span><span class="p">(</span><span class="k">SELECT</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">t2</span><span class="w"> </span><span class="k">WHERE</span><span class="w"> </span><span class="n">t2</span><span class="p">.</span><span class="k">c</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">t1</span><span class="p">.</span><span class="k">c</span><span class="p">);</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
<p id="EN-US_TOPIC_0000001555477902__p189045921617"><span><img id="EN-US_TOPIC_0000001555477902__image14698174873015" src="figure/en-us_image_0000001605933889.png"></span></p>
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<div class="familylinks">
|
|
<div class="parentlink"><strong>Parent topic:</strong> <a href="dws_04_0474.html">Optimization Cases</a></div>
|
|
</div>
|
|
</div>
|
|
|