Sybase
SQL 連接操作順序
我是 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 中的表溢出),它將創建工作表(內部臨時表;對使用者不可見)。否則,它將執行一對索引掃描(您確實在兩個表上都有索引
date
,symbol
對嗎?),然後是連接和輸出,所有這些都在記憶體中。注意事項:
- 如果索引(索引?)的選擇性不夠,它將預設為表掃描。我不確定“足夠”是什麼,但我認為大約是 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