forked from docs/doc-exports
Reviewed-by: Pruthi, Vineet <vineet.pruthi@t-systems.com> Co-authored-by: luhuayi <luhuayi@huawei.com> Co-committed-by: luhuayi <luhuayi@huawei.com>
43 lines
12 KiB
HTML
43 lines
12 KiB
HTML
<a name="EN-US_TOPIC_0000002088892897"></a><a name="EN-US_TOPIC_0000002088892897"></a>
|
|
|
|
<h1 class="topictitle1">Case: Converting from NOT IN to NOT EXISTS</h1>
|
|
<div id="body8662426"><p id="EN-US_TOPIC_0000002088892897__en-us_topic_0000001555477902_p129653446717"><strong id="EN-US_TOPIC_0000002088892897__en-us_topic_0000001555477902_b4281122811564">nestloop anti join</strong> must be used to implement <strong id="EN-US_TOPIC_0000002088892897__en-us_topic_0000001555477902_b96561932185617">NOT IN</strong>, while you can use <strong id="EN-US_TOPIC_0000002088892897__en-us_topic_0000001555477902_b878853635613">Hash anti join</strong> to implement <strong id="EN-US_TOPIC_0000002088892897__en-us_topic_0000001555477902_b14405164275610">NOT EXISTS</strong>. If no <strong id="EN-US_TOPIC_0000002088892897__en-us_topic_0000001555477902_b146754888794449">NULL</strong> value exists in the <strong id="EN-US_TOPIC_0000002088892897__en-us_topic_0000001555477902_b195743312794449">JOIN</strong> column, <strong id="EN-US_TOPIC_0000002088892897__en-us_topic_0000001555477902_b214266821394449">NOT IN</strong> is equivalent to <strong id="EN-US_TOPIC_0000002088892897__en-us_topic_0000001555477902_b97208142694449">NOT EXISTS</strong>. Therefore, if you are sure that no <strong id="EN-US_TOPIC_0000002088892897__en-us_topic_0000001555477902_b187370149294449">NULL</strong> value exists, you can convert <strong id="EN-US_TOPIC_0000002088892897__en-us_topic_0000001555477902_b12746891694449">NOT IN</strong> to <strong id="EN-US_TOPIC_0000002088892897__en-us_topic_0000001555477902_b37802943694449">NOT EXISTS</strong> to generate <strong id="EN-US_TOPIC_0000002088892897__en-us_topic_0000001555477902_b208653846994449">hash joins</strong> and to improve the query performance.</p>
|
|
<div class="section" id="EN-US_TOPIC_0000002088892897__en-us_topic_0000001555477902_section107679317810"><h4 class="sectiontitle">Before Optimization</h4><p id="EN-US_TOPIC_0000002088892897__en-us_topic_0000001555477902_p317410511881">Create two base tables <strong id="EN-US_TOPIC_0000002088892897__en-us_topic_0000001555477902_b19547016115719">t1</strong> and <strong id="EN-US_TOPIC_0000002088892897__en-us_topic_0000001555477902_b12481121811579">t2</strong>.</p>
|
|
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000002088892897__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_0000002088892897__en-us_topic_0000001555477902_p15667193517101">Run the following SQL statement to query the <strong id="EN-US_TOPIC_0000002088892897__en-us_topic_0000001555477902_b1875211251577">NOT IN</strong> execution plan:</p>
|
|
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000002088892897__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_0000002088892897__en-us_topic_0000001555477902_p450272612118">The following figure shows the statement output.</p>
|
|
<p id="EN-US_TOPIC_0000002088892897__en-us_topic_0000001555477902_p1455157171118"><span><img id="EN-US_TOPIC_0000002088892897__en-us_topic_0000001555477902_image1610898101116" src="figure/en-us_image_0000001555962590.png"></span></p>
|
|
<p id="EN-US_TOPIC_0000002088892897__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_0000002088892897__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_0000002088892897__en-us_topic_0000001555477902_p9988154218918">the preceding condition expression is equivalent to:</p>
|
|
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000002088892897__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_0000002088892897__en-us_topic_0000001555477902_section628523510154"><h4 class="sectiontitle">After Optimization</h4><p id="EN-US_TOPIC_0000002088892897__en-us_topic_0000001555477902_p18328165018153">The query can be modified as follows:</p>
|
|
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000002088892897__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_0000002088892897__en-us_topic_0000001555477902_p131916172322">Run the following statement to query the execution plan of <strong id="EN-US_TOPIC_0000002088892897__en-us_topic_0000001555477902_b158076597585">NOT EXISTS</strong>:</p>
|
|
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000002088892897__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_0000002088892897__en-us_topic_0000001555477902_p189045921617"><span><img id="EN-US_TOPIC_0000002088892897__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">SQL Tuning Examples</a></div>
|
|
</div>
|
|
</div>
|
|
|