2014-12-02 98 views
-1

查詢,如:SQL order by,group by,distinct和aggregation函數的進程順序?

SELECT DISTINCT max(age), area FROM T_USER GROUP BY area ORDER BY area; 

那麼,什麼是秩序的過程ORDER BY,GROUP BY,DISTINCT和聚集功能?

也許不同的順序會得到相同的結果,但會導致不同的性能。我想合併多個結果,我得到了sql,並解析了。所以我想知道標準sql劑量的順序。

+0

不同只是 – 2014-12-02 04:36:26

+0

的一個特殊類羣如果指定了distinct,那麼沒有group by? – wener 2014-12-02 04:38:53

+0

它是多餘的。刪除它,你會得到相同的結果,因爲你已經按區域對它進行了分組。 – 2014-12-02 04:40:05

回答

1

這比僅由/ aggregation/order by組更大。您想了解查詢引擎如何創建結果集。在高層次上,這意味着創建一個執行計劃,從表中檢索數據到查詢的工作集中,操縱數據以匹配請求的結果集,然後將結果集返回給調用者。對於非常簡單的查詢或者與表設計匹配的查詢(或者爲需要運行的查詢設計的表格模式),這可能意味着將表或索引中的數據直接返回給調用者。更常見的是,這意味着思考更詳細的級別,在那裏你大致遵循這些步驟:

  1. 看看查詢來確定哪些表將需要。
  2. 查看連接和子查詢,以確定哪些表依賴於其他表。
  3. 查看連接和where子句中的條件,以及索引,以確定每個表需要多少空間,以及需要多少工作來提取每個表中的部分需要(查詢與您的索引或存儲在磁盤上的表匹配度如何)。
  4. 根據從步驟1到步驟3收集的信息,找出檢索選擇列表所需數據的最有效方法,而不管查詢中包含表的順序,也不管任何ORDER BY子句。對於這一步,「最有效」被定義爲儘可能長時間地保持工作集儘可能小的方法。
  5. 開始遍歷第4步指示的記錄。如果存在GROUP BY子句,則必須根據現有發現的組檢查每個記錄,然後引擎才能確定是否應在工作中生成新行組。通常,執行此操作的最有效方法是查詢引擎在此處執行有效的ORDER BY步驟,以便將結果的所有潛在行都物化爲工作集,然後由GROUP BY中的列進行排序子句,並壓縮,以便只有重複的行被刪除。當發現該組的記錄時,每個組的聚合函數結果是已更新
  6. 一旦所有指示的記錄都被實現了,這樣任何聚合函數的結果都是已知的,就可以評估HAVING子句。
  7. 現在,最後還可以考慮ORDER BY。
  8. 工作集中剩餘的記錄將返回給調用者。

複雜的,這只是一個開始。它沒有開始考慮窗口函數,公用表表達式,交叉應用,數據透視和等等。但是,希望足以讓您瞭解數據庫引擎需要執行哪些工作。