Postgresql

Postgres 是否在 MS SQL Server 中提供類似“NEWSEQUENTIALID”的功能以使 UUID 作為主鍵更有效

  • August 20, 2020

Microsoft SQL Server 提供了NEWID生成新 GUID(UUID的 Microsoft 版本)值的命令,該值可用作主鍵值(在其uniqueidentifier數據類型中)。這些本質上不是順序的,因此更新索引可能效率低下。

或者,MS SQL Server 提供該NEWSEQUENTIALID命令。引用他們的文件:

創建一個 GUID,該 GUID 大於自 Windows 啟動以來此函式先前在指定電腦上生成的任何 GUID。重新啟動 Windows 後,GUID 可以從較低的範圍再次啟動,但仍然是全域唯一的。當 GUID 列用作行標識符時,使用 NEWSEQUENTIALID 可能比使用 NEWID 函式更快。這是因為 NEWID 函式會導致隨機活動並使用較少的記憶體數據頁。使用 NEWSEQUENTIALID 還有助於完全填充數據和索引頁。

有沒有辦法在 Postgres 中獲得更有效索引的 UUID?

uuid-ossp模組

PostgreSQL 使用ITU-T Rec. 提供的標準化 UUID 生成算法。X.667ISO/IEC 9834-8:2005RFC 4122。上的文件uuid-ossp

uuid-ossp 模組提供了使用幾種標準算法之一生成通用唯一標識符 (UUID) 的功能。還有一些函式可以生成某些特殊的 UUID 常量。

uuid_generate_v1()此函式生成版本 1 UUID。這涉及到電腦的 MAC 地址和時間戳。請注意,此類 UUID 揭示了創建標識符的電腦的身份以及創建標識符的時間,這可能使其不適合某些對安全敏感的應用程序。

只要MAC地址不改變,你就是金子。

綜上所述,我同意@a_horse_with_no_name,

據我了解,這僅在 SQL Server 中是必需的,因為表儲存在聚集索引中,這使得隨機插入比堆表慢。Postgres 沒有這樣的概念,所以我認為這不會對 Postgres 產生影響

事實上,考慮到更少的碰撞和更高的安全性,我會接受。我會用uuid_generate_v4()

uuid_generate_v4()此函式生成一個完全從隨機數派生的版本 4 UUID。

是的,Tomas Vondra 基於 MSSQL newsequentialid 為 PostgreSQL 創建了一個順序 uuid 擴展,但可預測性較差。

索引使用主鍵來更快地查找數據,因為它們是順序的,因此通過使用完全隨機的 UUID,它們會失去優勢。

使用完全順序的 UUID 變得可預測,並且與使用 UUID 的原始想法背道而馳,因為它們是全域唯一的。

Vondra 的擴展使用了兩個世界的位:“……而不是生成一個完美的順序前綴,該值在一段時間內是連續的,但也會偶爾環繞一次。環繞消除了可預測性……”

如何將其安裝到您的 PostgreSQL:Ubuntu 上的先決條件:

postgresql-server-dev-11

安裝:

git clone https://github.com/tvondra/sequential-uuids.git
cd sequential-uuids/
make
sudo make install

在 PostgreSQL 內部:

CREATE EXTENSION sequential-uuids;

通過範例使其工作:

DROP SEQUENCE IF EXISTS tablename_names_seq;
DROP TABLE IF EXISTS names;
CREATE SEQUENCE tablename_names_seq AS integer;
CREATE TABLE names(id uuid NOT NULL DEFAULT uuid_sequence_nextval('tablename_names_seq'::regclass),name varchar(40));
INSERT INTO names (name) VALUES ('William McKinley'),('Theodore Roosevelt'),('William Taft'),('Woodrow Wilson'),('Warren Harding'),('Calvin Coolidge'),('Herbert C. Hoover'),('Franklin Delano Roosevelt'),('Harry S Truman'),('Dwight David Eisenhower'),('John Fitzgerald Kennedy'),('Lyndon Baines Johnson'),('Richard Milhous Nixon'),('Gerald R. Ford'),('James (Jimmy) Earl Carter, Jr.'),('Ronald Wilson Reagan'),('George H. W. Bush'),('William (Bill) Jefferson Clinton'),('George W. Bush'),('Barack Obama'),('Donald Trump');

…將在我的情況下創建:

db=# select * from names;
id | name
--------------------------------------+----------------------------------
00005b41-8b07-3daa-216e-30b3e8177705 | William McKinley
00004ce4-1183-7689-47a0-a56d7e8e987c | Theodore Roosevelt
...
000042a0-2e72-c92b-6d61-7a79a5bf3b7e | Barack Obama
00002d51-34c3-a682-12ab-0d6287394899 | Donald Trump

來源: https ://github.com/tvondra/sequential-uuids https://www.2ndquadrant.com/en/blog/sequential-uuid-generators/

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