UniqueIdentifiers存在问题
我们有一个现有的数据库,它广泛地使用uniqueidentifiers(不幸的是!)作为主键和一些表的一些可空列.我们遇到了这样一种情况,即在这些表上运行的某些报告会对这些uniqueidentifier进行排序,因为表中没有其他列可以进行有意义的排序(这不具有讽刺意味!).目的是排序,以便按照插入顺序显示项目,但不使用NewSequentialId()插入它们 - 因此浪费时间.
有关排序算法的事实
无论如何,考虑到SQL Server根据从结束的第5个字节组(6个字节)开始的字节组排序uniqueidentifier并向第1个字节组(4个字节)移动,从右到左反转第3个字节组(2个字节)的顺序到左右,
我的问题
我很想知道是否有任何真实的生活情况,这种情况有点帮助.
SQL Server如何在内部存储uniqueidentifier,这可能会提供有关它为何具有这种糟糕的排序算法的见解?
参考:
Alberto Ferrari发现了SQL Server GUID排序
例
当您在具有以下数据的uniqueidentifier列上使用Order By时,Uniqueidentifier按如下所示排序.
请注意,以下数据按升序排序,最高排序首选项是从第5个字节组到第1个字节组(向后).
-- 1st byte group of 4 bytes sorted in the reverse (left-to-right) order below --
01000000-0000-0000-0000-000000000000
10000000-0000-0000-0000-000000000000
00010000-0000-0000-0000-000000000000
00100000-0000-0000-0000-000000000000
00000100-0000-0000-0000-000000000000
00001000-0000-0000-0000-000000000000
00000001-0000-0000-0000-000000000000
00000010-0000-0000-0000-000000000000
-- 2nd byte group of 2 bytes sorted in the reverse (left-to-right) order below --
00000000-0100-0000-0000-000000000000
00000000-1000-0000-0000-000000000000
00000000-0001-0000-0000-000000000000
00000000-0010-0000-0000-000000000000
-- 3rd byte group of 2 bytes sorted in the reverse (left-to-right) order below --
00000000-0000-0100-0000-000000000000
00000000-0000-1000-0000-000000000000
00000000-0000-0001-0000-000000000000 …Run Code Online (Sandbox Code Playgroud) 我使用UUID v1作为主键.我想排序UUID v1时间戳.现在,如果我做的事情
select id, title
from table
order by id desc
Run Code Online (Sandbox Code Playgroud)
Postgresql不按UUID时间戳对记录进行排序,而是按UUID字符串表示形式排序,在我的情况下最终会出现意外的排序结果.
我错过了什么,或者在Postgresql中没有内置方法可以做到这一点?