天天看點

SQL查詢性能分析之(not in)、(and not)、()、(!=)性能比較

SQL查詢性能分析之(not in)、(and not)、()、(!=)性能比較

SQL Server Bruce 3年前 (2013-01-08) 3284浏覽 0評論

<:article class="article-content">

在與朋友讨論查詢時引出了not in 與and not兩種踢出方法,互相的口舌之争之後我決定動手來查檢視,他們到底有什麼差別,誰的執行效率更高,今後該如何選擇性能最優的查詢條件。由于本人能力有 限,肚子中的墨水有限,是以本文有什麼錯誤之處還望各位前輩指出。

      在使用sql中我們會有各種各樣的條件篩選,常見的就是要踢出一部分我們不需要的資料,在where後面的踢出方法常見的有 (not in  / and not / <> / !=) 這四種方法,既然存在這樣四種方法,那麼我們又該如果選擇最佳方法呢?下面我們就一起來測試下這四種篩選條件的執行效率。

為了測試資料,我建了一張零時表@index中有三個字段:ID ,iID, idate 。然後循環插入1000000條資料。建表的語句:

SQL查詢性能分析之(not in)、(and not)、()、(!=)性能比較
SQL查詢性能分析之(not in)、(and not)、()、(!=)性能比較

我們使用SET STATISTICS TIME ON ;SET STATISTICS TIME OFF來檢視sql耗時,在執行前先清空緩存DBCC DROPCLEANBUFFERS;查詢語句如下:

SQL查詢性能分析之(not in)、(and not)、()、(!=)性能比較
SQL查詢性能分析之(not in)、(and not)、()、(!=)性能比較

Execute下我們先看看sql執行計劃:

SQL查詢性能分析之(not in)、(and not)、()、(!=)性能比較
SQL查詢性能分析之(not in)、(and not)、()、(!=)性能比較

從sql執行計劃中我們看不到差別,表掃描的結果頁都一樣,這裡就不一一列出了,如果你們又懷疑可以自己試試!然後我們在看看執行結果中message消息中,我們對耗時的查詢:

SQL查詢性能分析之(not in)、(and not)、()、(!=)性能比較

當我們後面跟的篩選條件隻有一條時,not in 的查詢結果會有明顯的優勢,而其他的幾種查詢結果也都大同小異,not似乎耗時也稍稍多點。但是往往我們在做篩選的時候not in 後面的條件會不止一個,如果隻有這麼一個篩選是的不出什麼結果的,那麼我們就加大篩選的條件。

SQL查詢性能分析之(not in)、(and not)、()、(!=)性能比較
SQL查詢性能分析之(not in)、(and not)、()、(!=)性能比較

看看執行計劃:

SQL查詢性能分析之(not in)、(and not)、()、(!=)性能比較

執行計劃仍然相同,我們去看看耗時查詢:

SQL查詢性能分析之(not in)、(and not)、()、(!=)性能比較

到這裡我們已經清楚了這四種篩選方法各自的執行效率,不知道是不是由于我用的是表變量,對查詢結果造成了一定的影響,如果有興趣你們也可以試下,對于 sql查詢條件我們可以盡量選擇比較合适的方法來做,比較需要踢出的資料比較多我們就不可能去用後面的三種一個一個的踢出,本文demo中采用的資料量是 1000000條已經是比較大的資料量了,這裡看到這四種篩選條件執行消耗的時間并沒有多少優勢。

由于本文使用的是表變量,并沒有對實體掃描,是以并不能保證在做實體查詢時一緻!學術是需要嚴謹的論證的,不能因為片面的原因而得出結論,那麼我下面就來用實體表的掃描來檢視他們的執行性能。

建表的過程就不在贅述,我們直接來看看sql執行計劃,依然是上面的查詢語句,不過要注意我本次使用的是實體表的查詢:

SQL查詢性能分析之(not in)、(and not)、()、(!=)性能比較
SQL查詢性能分析之(not in)、(and not)、()、(!=)性能比較
SQL查詢性能分析之(not in)、(and not)、()、(!=)性能比較
SQL查詢性能分析之(not in)、(and not)、()、(!=)性能比較

看看耗時查詢結果:

SQL查詢性能分析之(not in)、(and not)、()、(!=)性能比較

程式是一門嚴謹的科學,很多事情都需要我們自己去做去了解,我曾不止一次看到有很多文章寫道not in 在查詢的時候對記憶體消耗嚴重,性能低下,在資料達到百萬級别的時候查詢會很慢,但是當資料量大的時候任何查詢都會很慢的,既然sql中給我們提供了這些方 法,自有他的用武之地,而不能片面的覺得誰比誰更好,我們要根據需求選擇,最終的目的是為了解決問題,給世界創造價值。

由于本人能力有限,文中有錯誤之處還望給我前輩不吝賜教!