簡體   English   中英

為什么僅在FROM子句中再添加一個INNER JOIN會使我的SQL查詢這么慢?

[英]Why does adding just one more INNER JOIN to a FROM clause make my SQL query so slow?

我正在使用MS SQL 2008數據庫,該數據庫帶有一個稱為AcmeView的視圖。 當我編寫AcmeView腳本AcmeView ,我看到它將其他三個視圖連接在一起: View1View2View3 一位同事問我是否可以構成一個視圖,該視圖將AcmeView的內容與另一個視圖( NewView數據結合在一起。

AcmeView在三秒鍾內返回結果集; 它的構成視圖每個包含數萬行。

NewView是一個小得多的視圖; 每個返回大約兩千行; 並在不到一秒鍾的時間內返回結果集。

因此,令我失望的是,當我使用AcmeViewNewView修改為INNER JOIN時, NewView的結果視圖將花費近二十秒鍾的時間。 使它變慢的觀點可能有什么問題?

AcmeView的SELECT語句如下所示:

SELECT *
FROM
    View1
    INNER JOIN View2
        ON View2.foo = View1.foo
    INNER JOIN View3
        ON View3.bar = View2.bar    
    -- Executes in 3 seconds

SELECT *
FROM
    View1
    INNER JOIN View2
        ON View2.foo = View1.foo
    INNER JOIN View3
        ON View3.bar = View2.bar
    INNER JOIN NewView
        ON NewView.qwerty = View1.querty
    -- Executes in 20 seconds; why so long?

NewView到我的FROM子句中又怎么可能會減慢對爬網的查詢速度,我該怎么辦? 再次可以在NewView一秒鍾的時間內查詢NewView

一個JOIN做出如此大的改變並不難。

如果聯接鍵的排序方式不同(由於其中一個“表”是一組聯接的結果,則很有可能),它們將全部重新排序或僅在大型嵌套循環中完成。

正如@magnus所說,如果您為兩者都制定了執行計划,則可能會很容易地看到添加的內容。
我猜這是一個嵌套循環,其中一個表中的每一行都掃描另一表中的每一行。

如果您對執行計划不熟悉,請查看此備受好評的文章:
如何在SQL Server中讀取執行計划

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM