[英]Why does adding just one more INNER JOIN to a FROM clause make my SQL query so slow?
我正在使用MS SQL 2008數據庫,該數據庫帶有一個稱為AcmeView
的視圖。 當我編寫AcmeView
腳本AcmeView
,我看到它將其他三個視圖連接在一起: View1
, View2
和View3
。 一位同事問我是否可以構成一個視圖,該視圖將AcmeView
的內容與另一個視圖( NewView
數據結合在一起。
AcmeView
在三秒鍾內返回結果集; 它的構成視圖每個包含數萬行。
NewView
是一個小得多的視圖; 每個返回大約兩千行; 並在不到一秒鍾的時間內返回結果集。
因此,令我失望的是,當我使用AcmeView
將NewView
修改為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.