Select

按 GETSORTED 排序

  • June 23, 2016

在我的 sybase 12 中,當我查看 select distinct 查詢的 showplan 時,我看到GETSORTED了 showplan 的輸出。

我已經搜尋了整個網際網路(是的!),我似乎無法找到一個連結來說明實際對數據進行排序的順序GETSORTED

我有理由相信它會對不同行的列中數據的大小進行排序,對於相同長度的行,它會按字母順序排序。

執行計劃:

W (5):     STEP 1
  W (6):         The type of query is INSERT.
  W (7):         The update mode is direct.
  W (8):         Worktable1 created, in allpages locking mode, for DISTINCT.
  W (9): 
  W (10):         FROM TABLE
  W (11):             tablename
  W (12):         Nested iteration.
  W (13):         Table Scan.
  W (14):         Forward scan.
  W (15):         Positioning at start of table.
  W (16):         Using I/O Size 2 Kbytes for data pages.
  W (17):         With LRU Buffer Replacement Strategy for data pages.
  W (18):         TO TABLE
  W (19):             Worktable1.
  W (20): 
  W (21):     STEP 2
  W (22):         The type of query is SELECT.
  W (23):         This step involves sorting.
  W (24): 
  W (25):         FROM TABLE
  W (26):             Worktable1.
  W (27):         Using GETSORTED
  W (28):         Table Scan.
  W (29):         Forward scan.
  W (30):         Positioning at start of table.
  W (31):         Using I/O Size 2 Kbytes for data pages.
  W (32):         With MRU Buffer Replacement Strategy for data pages.

詢問:

select distinct col_1 from tab_1

我正在將應用程序從 Sybase 12 遷移到 Sybase 15。我發現數據順序存在差異,這進一步導致下游差異。我不能使用 anORDER BY因為我不想接觸現有的應用程序。如果我能弄清楚在GETSORTED做什麼,我可能可以在我的新數據伺服器上執行相同的命令。

您在執行計劃中看到的是 Sybase 執行DISTINCT運算符。

當您SELECT DISTINCT在 Sybase 中執行 a 時,它首先建構一個工作表(如您在執行計劃的第 1 步中所見),然後它選擇已排序的數據,從該工作表中刪除重複項(您在第 2 步中看到的內容)。這是記錄在案的

排序算法似乎沒有公開,所以如果 Sybase 開發人員盡其智慧引入了一種優化,他們使用數據長度來確定值是否重複,這可能會產生您所描述的效果:

我有理由相信它對不同行的列中數據的大小進行排序,對於相同長度的行,它會按字母順序排序

這個故事的寓意是:

如果要對數據進行排序,請添加 ORDER BY 子句

至於你的問題

GETSORTED 實際上以什麼順序對數據進行排序?

按照算法可以最有效地刪除重複項的順序。

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