web-dev-qa-db-fra.com

Est-ce que Postgres propose une fonctionnalité comme "NewEntenexID" dans MS SQL Server pour rendre UUID comme clé primaire plus efficace

Le serveur Microsoft SQL offre la commande NEWID commande pour générer un nouveau GUID (la version Microsoft de UUID ) la valeur qui peut être utilisée comme une valeur de clé primaire (dans leur uniqueidentifier Type de données). Celles-ci ne sont pas de nature séquentielle, la mise à jour d'un index peut donc être inefficace.

Sinon, MS SQL Server offre la commande NEWSEQUENTIALID . Pour citer leur documentation:

Crée A GUID==== plus que tout GUID a précédemment généré par cette fonction sur un ordinateur spécifié puisque Windows a été démarré. Après le redémarrage des fenêtres, le GUID== Démarrer à nouveau à partir d'une plage inférieure, mais est toujours globalement unique. Quand un GUID est utilisé comme identifiant de ligne, à l'aide de la fonction NewID. . En effet, la fonction NewID entraîne une activité aléatoire et utilise moins de pages de données mis en cache. L'utilisation de la nouvelle suite aide également à remplir complètement les pages de données et d'index.

Existe-t-il un moyen d'obtenir l'UUID plus efficace à Postgres?

10
Basil Bourque

uuid-ossp module

PostgreSQL utilise les algorithmes de génération UUID normalisés fournis par IT-T Rec. X.667 , ISO/CEI 9834-8: 2005 et RFC 4122. de les documents sur uuid-ossp,

Le module UUID-OSPSP fournit des fonctions pour générer des identifiants universellement uniques (UUIDS) en utilisant l'un des algorithmes standard. Il existe également des fonctions pour produire certaines constantes UUID spéciales.

uuid_generate_v1() Cette fonction génère une version 1 UUID. Cela implique l'adresse MAC de l'ordinateur et un horodatage . Notez que les Uuids de ce type révèlent l'identité de l'ordinateur qui a créé l'identifiant et l'heure à laquelle il l'a fait, ce qui pourrait le rendre inapproprié pour certaines applications sensibles à la sécurité.

Tant que l'adresse MAC ne change pas, vous serez d'or.

C'est tout dit, je suis d'accord avec @a_horse_with_no_name,

De ma compréhension, cela n'est nécessaire que dans SQL Server car les tables sont stockées dans un index en cluster qui rend les insertions aléatoires plus lentement, puis avec une table de tas. Postgres n'a pas de tel concept , donc je ne pense pas que cela ferait une différence dans les postgres

En fait, étant donné la chance de moins de collisions et de plus de sécurité, je le prendrais. Et à cela, j'utiliserais uuid_generate_v4()

uuid_generate_v4() Cette fonction génère une UUID version 4, qui est entièrement dérivée de nombres aléatoires.

4
Evan Carroll

Oui, Tomas Vondra a créé une extension UUID séquentielle pour PostgreSQL basée sur le fichier MSSQLNENEnticidentialId uniquement moins prévisible.

Les index utilisées des clés primaires sont utilisées pour trouver des données plus rapides car elles sont séquentielles afin d'utiliser complètement les uuid aléatoires qu'ils manquent l'avantage.

L'utilisation de UUID parfaitement séquentielle devient prévisible et fonctionne contre l'idée originale d'utiliser les UUID en ce sens qu'ils sont globalement uniques.

L'extension de Vondra utilise des bits des deux mondes: "... au lieu de générer un préfixe parfaitement séquentiel, la valeur est séquentielle pendant un moment, mais elle enveloppe une fois de temps en temps. L'emballage élimine la prévisibilité ..."

Comment l'installer dans votre postgreSQL: Prérequires sur Ubuntu:

postgresql-server-dev-11

Installer:

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

inside PostgreSQL:

CREATE EXTENSION sequential-uuids;

Faites-le travailler par exemple:

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

... créera dans mon cas:

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

source: https://github.com/tvondra/Suite-UUUIDShttps://www.2ndquadrant.com/fr/blog/Suite-UUUID-Generators/

1
Bastiaan Wakkie