按 GETSOTED 排序

Kra*_*ken 4 sybase order-by select

在我的 sybase 12 中,当我查看 select distinct 查询GETSORTED的 showplan 时,我看到了 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.
Run Code Online (Sandbox Code Playgroud)

询问:

select distinct col_1 from tab_1
Run Code Online (Sandbox Code Playgroud)

我正在将应用程序从 Sybase 12 迁移到 Sybase 15。我发现数据排序存在差异,这进一步导致了下游的差异。我不能使用 anORDER BY因为我不想接触现有的应用程序。如果我能弄清楚GETSORTED正在做什么,我可能可以在我的新数据服务器上执行相同的命令。

Tom*_*m V 6

您在执行计划中看到的是 Sybase 正在执行DISTINCT操作符。

当您SELECT DISTINCT在 Sybase 中执行 a 时,它首先构建一个工作表(如您在执行计划的第 1 步中看到的那样),然后它选择已排序的数据以从该工作表中删除重复项(这就是您在第 2 步中看到的)。这是记录在案的

排序算法似乎没有公开,所以如果 Sybase 开发人员尽其所能引入优化,他们使用数据长度来确定值是否重复,这可能会产生您所描述的效果:

我有理由相信它对不同行的列中数据的大小进行排序,而对于相同长度的行,它会按字母顺序排序

这个故事的寓意是:

如果您希望对数据进行排序,请添加 ORDER BY 子句

至于你的问题

GETSORTED 实际上以什么顺序对数据进行排序?

按照算法可以最有效地删除重复项的顺序。