iT邦幫忙

0

MSSQL 多一個JOIN 變慢問題請教

  • 分享至 

  • xImage

您好:
如下1.原始: 這樣很快1秒就出來

SELECT * from (

	   SELECT 
	        20個欄位
		from (
				SELECT * FROM  區段1
				

		) m LEFT join 區段2  p on 
			left JOIN  區段3 s on 
			LEFT join ( 
			
			   SELECT ...
			   from     區段4
			   WHERE
			   
            ) 
			x on 


) z 
where 
    	 條件4個
Order by ...

----------------2.我另外內圈 JOIN一個新區段,結果變慢3秒出來

SELECT 
	        20個欄位
		from (
				SELECT * FROM  區段1
				

		) m LEFT join 區段2  p on 
			left JOIN  區段3 s on 
			LEFT join ( 
			
			   SELECT ...
			   from     區段4
			   WHERE
			   
            ) 
			x on 
            LEFR JOIN  新區段

------------------------3.我把它加到原始內圈,跑了一分多宗還跑不完

SELECT * from (

	   SELECT 
	        20個欄位
		from (
				SELECT * FROM  區段1
				

		) m LEFT join 區段2  p on 
			left JOIN  區段3 s on 
			LEFT join ( 
			
			   SELECT ...
			   from     區段4
			   WHERE
			   
            ) 			
          	x on 
            LEFR JOIN  新區段  

) z 
where 
    	 條件4個
Order by ...

------------------------------4.我把(1)的先寫到#tmp,再JOIN
這樣就很快2-3秒內出來

再用

#tmp LEFR JOIN  新區段

我看實際執行計畫,有沒出線索遺漏

請問 這大致什麼原因,有方式可以可循跡解決嗎?
謝謝

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
rain_yu
iT邦新手 1 級 ‧ 2023-11-22 11:34:02

根據您提供的資訊,這些查詢的效能問題可能是由於資料庫查詢計劃的優化不良或查詢語句結構的問題所導致。以下是針對每個情況的一些建議:

查詢效能快:如果第一個查詢效能較快,但後續的變更導致效能下降,可能是因為新增的 JOIN 操作或條件導致了更大的資料集合或較差的查詢計劃。您可以嘗試以下方法:

確保資料庫統計資訊最新:確保資料庫統計資訊是最新的,以保證查詢優化器能夠生成最佳的查詢計劃。
檢查索引:確保所有連接和篩選的欄位上都建立了適當的索引,以加快查詢的執行速度。
檢查查詢計劃:使用資料庫管理工具檢視查詢計劃,確認是否有任何缺失的索引、不必要的排序或其他效能問題。
內圈加入新區段導致效能下降:加入新的 JOIN 可能會增加查詢的複雜性和資料量。您可以考慮以下方法:

確保新增的 JOIN 操作使用了適當的索引。
檢查查詢計劃,確認是否有任何不必要的排序、資料量過大的中間結果或其他效能問題。
將新區段加入原始內圈導致效能極差:將新區段與原始內圈結合可能導致資料量巨大,查詢無法在合理的時間內完成。您可以考慮以下方法:

檢查是否有缺失的索引或需要優化的查詢計劃。
如果資料量太大,可以考慮分批處理資料或使用臨時表(如您提到的 #tmp)來減少資料量。
將結果先寫入臨時表再 JOIN:將結果寫入臨時表可以減少查詢的複雜性和資料量,從而提高效能。這種方法常用於處理大量資料或複雜的查詢。不過,使用臨時表也可能導致資料不是即時的,需要根據需求來平衡。

為了更好地優化和調試查詢,建議使用資料庫管理工具(如 SQL Server Management Studio、MySQL Workbench 等)來檢視和分析查詢計劃、索引和統計資訊。這些工具可以提供詳細的執行計劃和效能統計數據,以幫助您找到效能問題的根本原因。

0
shing_pascal
iT邦新手 2 級 ‧ 2023-11-23 08:11:50

因為執行時,
外圈 每讀一筆資料,內圈的SELECT 就要執行一次。
套的圈數越多,SELECT 執行的次數越多
可以用 WITH 的寫法來優化。
例 with a as (
select .....
from ...
) ,
b as (
select......
from ....
)
select ....
from a
left join b on .....

看更多先前的回應...收起先前的回應...
noway iT邦研究生 3 級 ‧ 2023-11-23 10:11:06 檢舉

您好:
CTE 我可以用
不過想確認一下,已下 那些 黑色區室內圈 嗎?
最後 的select 為外圈
但,這樣同屬內圈

若在內圈,
是否應該每一個 區塊查詢 自己查完,再去關連其他 已查完的查詢?
這樣應該是否關連到 新區段,問題?
謝謝

SELECT * from (

SELECT 
     20個欄位
 from (
         SELECT * FROM  區段1


 ) m LEFT join 區段2  p on 
     left JOIN  區段3 s on 
     LEFT join ( 

        SELECT ...
        from     區段4
        WHERE

     ) 			
     x on 
     LEFR JOIN  新區段  

) z
where
條件4個
Order by ...

我過去的經驗是這樣

假設 區段1 筆數 2
區段2 筆數 3
區段3 筆數 4

以下列程式為例

SELECT * FROM 區段1

) m LEFT join 區段2 p on
left JOIN 區段3 s on
LEFT join (

    SELECT ...
    from     區段4
    WHERE

 ) 

區段4 那個 SELECT 會執行 2x3x4 = 24 次

noway iT邦研究生 3 級 ‧ 2023-11-23 13:14:39 檢舉

感覺不是這樣

pilipala iT邦新手 2 級 ‧ 2023-11-24 21:30:11 檢舉

MS SQL Join 有三種演算法,分別是 Nested Loop、Merge Join 和 Hash Join,要看執行計畫才知道是執行哪一個

我要發表回答

立即登入回答