Liệu Postgres có cung cấp một tính năng giống như NEW NEWQUQUIALIALID trong MS SQL Server để biến UUID thành khóa chính hiệu quả hơn không


10

Microsoft SQL Server cung cấp NEWIDlệnh tạo giá trị GUID mới (phiên bản Microsoft của UUID ) có thể được sử dụng làm giá trị khóa chính (theo uniqueidentifierkiểu dữ liệu của chúng ). Đây không phải là tuần tự về bản chất, vì vậy việc cập nhật một chỉ mục có thể không hiệu quả.

Ngoài ra, MS SQL Server cung cấp NEWSEQUENTIALIDlệnh. Để trích dẫn tài liệu của họ:

Tạo GUID lớn hơn bất kỳ GUID nào được tạo bởi chức năng này trước đây trên một máy tính được chỉ định kể từ khi Windows được khởi động. Sau khi khởi động lại Windows, GUID có thể bắt đầu lại từ phạm vi thấp hơn, nhưng vẫn duy nhất trên toàn cầu. Khi một cột GUID được sử dụng làm định danh hàng, sử dụng NEWSEQUENTIALID có thể nhanh hơn sử dụng hàm NEWID. Điều này là do hàm NEWID gây ra hoạt động ngẫu nhiên và sử dụng ít trang dữ liệu được lưu trong bộ nhớ cache hơn. Sử dụng NEWSEQUENTIALID cũng giúp lấp đầy hoàn toàn các trang dữ liệu và chỉ mục.

Có cách nào để có được UUID được lập chỉ mục hiệu quả hơn trong Postgres không?


2
@a_horse_with_no_name phân mảnh chỉ mục vẫn xảy ra trong Postgres, vì vậy nó vẫn sẽ giúp ích cho việc đó.
Adam B

@AdamB - Tôi đề nghị rằng đó không phải là 'sự phân mảnh', mà là sự ngẫu nhiên của GUID 'tiếp theo' gây ra vấn đề về hiệu suất.
Rick James

@RickJames đó chính xác là những gì tôi muốn nói về 'phân mảnh'. Vì UUID là ngẫu nhiên, nó được chèn vào một trang ngẫu nhiên trong chỉ mục gây ra IO ngẫu nhiên, trái ngược với số nguyên luôn tăng sẽ luôn được đặt ở cuối chỉ mục.
Adam B

@AdamB - OK, có nhiều ý nghĩa của "phân mảnh". Vấn đề là tăng khả năng khối tiếp theo cần thiết không có trong bộ đệm. Điều đó dẫn đến một vấn đề hiệu suất đáng kể; 10 lần trong một số phép đo tôi đã thấy. Do đó, tôi khuyên chống lại UUID / GUID cho các bảng rất lớn. NEXSEQUENTIALIDdường như là một cách giải quyết cho như vậy. (Và còn nhiều kỹ thuật khác nữa.)
Rick James

Câu trả lời:


4

uuid-ossp mô-đun

PostgreSQL sử dụng các thuật toán tạo UUID được tiêu chuẩn hóa do ITU-T Rec cung cấp . X.667 , ISO / IEC 9834-8: 2005RFC 4122. Từ các tài liệu trên uuid-ossp,

Mô-đun uuid-ossp cung cấp các hàm để tạo các định danh duy nhất trên toàn cầu (UUID) bằng một trong một số thuật toán tiêu chuẩn. Ngoài ra còn có các chức năng để tạo ra các hằng số UUID đặc biệt.

uuid_generate_v1()Hàm này tạo ra UUID phiên bản 1. Điều này liên quan đến địa chỉ MAC của máy tính và dấu thời gian . Lưu ý rằng UUID loại này tiết lộ danh tính của máy tính đã tạo định danh và thời gian thực hiện, điều này có thể khiến nó không phù hợp với một số ứng dụng nhạy cảm bảo mật.

Miễn là địa chỉ MAC không thay đổi, bạn sẽ là vàng.

Như đã nói, tôi đồng ý với @a_horse_with_no_name,

Theo hiểu biết của tôi, điều này chỉ cần thiết trong SQL Server vì các bảng được lưu trữ trong một chỉ mục được nhóm, làm cho việc chèn ngẫu nhiên chậm hơn sau đó với bảng heap. Postgres không có khái niệm như vậy, vì vậy tôi không nghĩ rằng điều đó sẽ tạo ra sự khác biệt trong Postgres

Trong thực tế, với cơ hội ít va chạm hơn và bảo mật hơn, tôi sẽ nắm lấy nó. Và tôi sẽ sử dụng nóuuid_generate_v4()

uuid_generate_v4() Hàm này tạo ra một UUID phiên bản 4, được lấy hoàn toàn từ các số ngẫu nhiên.


1

Có, Tomas Vondra đã tạo ra một phần mở rộng uuid tuần tự cho PostgreSQL dựa trên MSSQL new resultentialid chỉ ít dự đoán được.

Khóa chính được sử dụng bởi các chỉ mục để tìm dữ liệu nhanh hơn vì chúng là tuần tự, do đó bằng cách sử dụng UUID hoàn toàn ngẫu nhiên, chúng bỏ lỡ lợi thế.

Việc sử dụng UUID tuần tự hoàn hảo trở nên có thể dự đoán được và hoạt động chống lại ý tưởng ban đầu về việc sử dụng UUID ở chỗ chúng là duy nhất trên toàn cầu.

Tiện ích mở rộng của Vondra đang sử dụng các bit của cả hai thế giới: "... Thay vì tạo tiền tố tuần tự hoàn hảo, giá trị này là tuần tự trong một thời gian, nhưng cũng bao bọc một lần trong một thời gian. Việc gói này loại bỏ khả năng dự đoán ..."

Cách cài đặt nó vào PostgreSQL của bạn: Điều kiện tiên quyết trên Ubuntu:

postgresql-server-dev-11

Tải về:

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

bên trong PostgreSQL:

CREATE EXTENSION sequential-uuids;

Làm cho nó hoạt động bằng ví dụ:

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');

... sẽ tạo trong trường hợp của tôi:

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

nguồn: https://github.com/tvondra/fterential-uuids https://www.2ndquadrant.com/en/blog/fterential-uuid-generators/

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.