Sybase

SQL 連接操作順序

  • February 24, 2012

我是 SQL 新手,但碰巧正在處理幾個相當大的表(每個表大約有十億行)。

我想做一個內部連接,如下所示:

SELECT *
FROM XTABLE X
  INNER JOIN YTABLE Y
     ON Y.date=X.date 
     AND Y.symbol=X.symbol
WHERE X.date > 2011
  AND X.symbol in ('a','b','c')
  AND Y.symbol in ('a','b','c')
  AND Y.date > 2011

我的問題是:這樣的查詢的操作順序是什麼?SQL 會為每個表 X 和 Y 的符號{a,b,c} 和日期{>2011} 的行創建一個新結果集,然後進行內部連接嗎?

**簡短版:**視情況而定。不過,一般來說,Sybase SQL Server 足夠聰明,可以以最快的方式做事。

長版:

Sybase 的查詢處理器的核心與 MS SQL Server 中使用的處理器非常相似。

如果結果集大到足以溢出可用記憶體(類似於 SQL Server 中的表溢出),它將創建工作表(內部臨時表;對使用者不可見)。否則,它將執行一對索引掃描(您確實在兩個表上都有索引datesymbol對嗎?),然後是連接和輸出,所有這些都在記憶體中。

注意事項:

  • 如果索引(索引?)的選擇性不夠,它將預設為表掃描。我不確定“足夠”是什麼,但我認為大約是 30%(即,如果統計數據告訴優化器它將獲得表中 30% 以上的行,那麼直接掃描表將花費優化器少於索引掃描+查找)。
  • ORDER BY如果您有一個語句,或者如果優化器決定使用合併連接並且連接標準不是主鍵(因為合併連接需要排序的輸入),工作表也可以發揮作用。
  • 此外,任何非平凡計劃的任何展示計劃底部的成本估算都是沒有意義的,它是一個無量綱值(即只是一個數字),僅用於與該查詢的其他計劃進行比較。即,您不能比較兩個不同數據集上的兩個查詢(即使在同一台伺服器上)並說一個比另一個更昂貴,因為成本估算不能像那樣進行比較。在某些情況下,我還看到同一個查詢的成本估算已經大大偏離(例如,成本為 1000 的合併聯接需要幾個小時才能完成,SET MERGE_JOIN OFF它預設為成本為 10000 的 NL 聯接,但在分鐘)。優化 Sybase 的查詢處理器是另一本完全不同的書(實際上有四本書,我只是連結了高級 QP 的一本)。
  • 有一些很小的極端情況,查詢處理器會以明顯次優的方式做事,但在 99% 的情況下,您不會遇到這些情況。

也就是說,根據我所看到的查詢計劃看起來像這樣:(這已大大簡化, sp_showplan 的實際輸出更詳細)

|ROOT:EMIT (aka select)
|  
|  | NL JOIN (nested loop join)
|  |
|  |  | RESTRICT Table X
|  |  | 
|  |  |  | SCAN Table X (using index, forward scan)
|  | 
|  |  | RESTRICT Table Y
|  |  | 
|  |  |  | SCAN Table Y (using index, forward scan)

它顯示在RESTRICT之後的原因SCAN是因為SCAN沒有數據RESTRICT- 我有理由確定在這種情況下您可以有效地將它們視為一個操作(即限制條件將成為每個索引掃描的一部分,而不是索引掃描複製整個數據塊並限制丟棄大部分數據)。

您的查詢看起來不錯!它應該執行並得到答案!

您還可以檢查 SQL Query Cost Estimation,如果您覺得執行結果需要更多時間,那麼我會考慮這部分..

ON Y.date=X.date AND Y.symbol=X.symbol

引用自:https://dba.stackexchange.com/questions/11489