簡體   English   中英

更改SQL查詢以顯式控制執行順序

[英]Change SQL query to explicitly control the execution sequence

說我有一個查詢:

SELECT * FROM tb1
WHERE col1 = 1
 AND col2 = 2

假設col1更具選擇性,引擎通常會首先執行col1 = 1以獲得更好的性能。 如果情況變得更加復雜,則發動機可能容易做出錯誤的決定。 所以我想顯式地控制執行順序,我該如何做呢?

我想一種方法可能有效。 首先查詢

SELECT * FROM tb1
WHERE col1 = 1

將結果選擇到臨時表中,然后按col2 = 2進行過濾,但是隨着條件的增長,當然不可能創建這么多臨時表。 有任何想法嗎?

更新1

人們說優化器總是對應該首先執行哪個過濾器以獲得更好的性能做出正確的決定,但是我仍然懷疑,隨着查詢變得越來越大和越來越復雜,它可以100%地工作。

另一個問題,我可以通過子查詢或CTE更改執行順序嗎? 喜歡:

SELECT * FROM 
(
   SELECT * FROM tb1 WHERE col1 = 1
)t
WHERE col2 = 2

通常,SQL Optimizer可以找到更好的計划,但是如果您要對其進行修復,則可以選擇...

您可以創建一個測試數據集,SQL引擎為其選擇正確的(所需)計划,然后可以將查詢計划提取到XML字符串(請參閱SET SHOWPLAN_XML ON),最后使用WITH PLAN選項(查詢提示)來修復該計划。

請記住,如果將來在不更新計划的情況下更改架構,查詢將失敗。

為此,您應該使用查詢提示。

  1. 您可以使用USE PLAN查詢提示。
  2. with(index(index_name))為特定行順序創建的with(index(index_name))使用。

首先,您必須通過首先執行查詢來獲得XML計划,在查詢中您將獲得所需的執行順序。 對於第二個,只需在按所需順序排列了列的那些列上創建索引。

暫無
暫無

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

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