Extensions Reference

Extension Management

-- Install an extension
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

-- List installed extensions
SELECT name, default_version, installed_version
FROM pg_available_extensions
WHERE installed_version IS NOT NULL;

-- Update an extension
ALTER EXTENSION pg_stat_statements UPDATE;

-- Remove an extension
DROP EXTENSION IF EXISTS pg_trgm;

-- Extensions available (not yet installed)
SELECT name FROM pg_available_extensions
WHERE installed_version IS NULL
ORDER BY name;

pg_stat_statements

Track execution statistics of all SQL statements for performance analysis.

-- Enable in postgresql.conf:
-- shared_preload_libraries = 'pg_stat_statements'
-- pg_stat_statements.track = all

CREATE EXTENSION pg_stat_statements;

-- Top 10 slowest queries
SELECT
  query,
  calls,
  total_exec_time / calls AS avg_ms,
  rows / calls AS avg_rows
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10;

-- Reset statistics
SELECT pg_stat_statements_reset();

uuid-ossp & pgcrypto

-- uuid-ossp: generate UUIDs
CREATE EXTENSION "uuid-ossp";
SELECT uuid_generate_v4();   -- random UUID
SELECT uuid_generate_v1();   -- time-based UUID

-- Use as default column value
CREATE TABLE sessions (
  id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
  user_id INT,
  created_at TIMESTAMPTZ DEFAULT NOW()
);

-- pgcrypto: hashing and encryption
CREATE EXTENSION pgcrypto;

-- Password hashing (bcrypt)
SELECT crypt('mypassword', gen_salt('bf', 10));
SELECT crypt('mypassword', stored_hash) = stored_hash AS valid
FROM users WHERE id = 1;

-- Random bytes / UUID via pgcrypto
SELECT encode(gen_random_bytes(16), 'hex');
SELECT gen_random_uuid();

pg_trgm

Trigram-based similarity search โ€” great for fuzzy matching and LIKE acceleration.

CREATE EXTENSION pg_trgm;

-- Similarity score (0โ€“1)
SELECT similarity('postgres', 'postgresql');

-- GIN index for LIKE / ILIKE
CREATE INDEX idx_products_name_trgm
  ON products USING GIN (name gin_trgm_ops);

-- Fast LIKE query using the index
SELECT * FROM products WHERE name ILIKE '%postgr%';

-- Find similar strings
SELECT name, similarity(name, 'posgres') AS sim
FROM products
WHERE name % 'posgres'       -- % operator: similarity > threshold
ORDER BY sim DESC
LIMIT 5;

-- Adjust similarity threshold (default 0.3)
SET pg_trgm.similarity_threshold = 0.4;

PostGIS & TimescaleDB Highlights

-- PostGIS: geographic/spatial types
CREATE EXTENSION postgis;

CREATE TABLE locations (
  id    SERIAL PRIMARY KEY,
  name  TEXT,
  geom  GEOMETRY(Point, 4326)
);
INSERT INTO locations (name, geom)
  VALUES ('Office', ST_SetSRID(ST_MakePoint(116.4, 39.9), 4326));

-- Distance query (meters)
SELECT name,
  ST_DistanceSphere(geom, ST_MakePoint(116.4, 39.9)::geography) AS meters
FROM locations
ORDER BY meters;

-- GiST spatial index
CREATE INDEX idx_locations_geom ON locations USING GIST (geom);

-- TimescaleDB: time-series extension
CREATE EXTENSION IF NOT EXISTS timescaledb;

-- Convert regular table to hypertable
SELECT create_hypertable('metrics', 'time');

-- Continuous aggregate (materialized view refreshed automatically)
CREATE MATERIALIZED VIEW metrics_hourly
WITH (timescaledb.continuous) AS
  SELECT time_bucket('1 hour', time) AS bucket,
         avg(value) AS avg_val
  FROM metrics GROUP BY bucket;