К основному содержанию
скилл CX Codex

find-hypertable-candidates — скилл для Claude Code: поиск таблиц

Разбирает схему PostgreSQL и подсказывает, какие таблицы стоит перевести в hypertable TimescaleDB. Нужен перед миграцией на Timescale.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add timescale/pg-aiguide --skill find-hypertable-candidates -a claude-code
Открыть на GitHub

Что делает find-hypertable-candidates

Скилл смотрит на статистику таблиц, индексы и шаблоны запросов, а потом ранжирует таблицы по пригодности для hypertable. Внутри — готовые SQL-запросы: по pg_stat_user_tables и pg_total_relation_size он собирает число вставок, обновлений и удалений, по pg_indexes ищет индексы с колонками времени, а через pg_stat_statements разбирает дорогие запросы. Есть и второй путь — анализ кода: скилл распознаёт вставки в логи событий и метрики, запросы с фильтром по времени и агрегации по дням.

Дальше идёт оценка. Таблица набирает баллы, и 8+ баллов означают хорошего кандидата. Отдельно разобраны таблицы с последовательным ID: их можно партиционировать по ID, если вставки преобладают, а обновления затрагивают только свежие записи — так устроены заказы, где статус меняется от оформления к доставке и после доставки уже не трогается. Для таких случаев скилл советует разреженные индексы по колонке времени.

Что нужно заранее: PostgreSQL 15+ с установленным TimescaleDB. Проверьте ограничения до миграции — первичный и уникальный ключи должны включать колонку партиционирования, а связь hypertable→hypertable не поддерживается, поэтому её придётся переделать. После отбора таблиц конфигурацию и саму миграцию берёт на себя парный скилл migrate-postgres-tables-to-hypertables.

Какие задачи решает

  • найти в схеме таблицы, которые выиграют от hypertable
  • отличить журнал событий от справочника, который трогать не надо
  • посчитать соотношение вставок и обновлений по таблице
  • проверить индексы на колонки времени перед миграцией
  • оценить, влезет ли таблица с последовательным ID в партиционирование

Примеры запросов агенту

  • проанализируй таблицы в моей базе PostgreSQL и скажи, какие стоит перевести в hypertable
  • посмотри индексы и статистику вставок в таблице orders — подходит ли она под TimescaleDB?
  • оцени таблицы events и metrics по баллам и покажи, кто набрал 8 и больше

Как установить find-hypertable-candidates

1Через Skills CLI (Vercel)

npx skills add timescale/pg-aiguide --skill find-hypertable-candidates -a claude-code

2Вручную: положить файлы

~/.claude/skills/find-hypertable-candidates/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/find-hypertable-candidates/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о find-hypertable-candidates

Как установить find-hypertable-candidates в Claude?

Выполните npx skills add timescale/pg-aiguide --skill find-hypertable-candidates -a claude-code. Скилл появится в ~/.claude/skills/find-hypertable-candidates/SKILL.md.

Что делает find-hypertable-candidates?

Анализирует существующую базу PostgreSQL и определяет, какие таблицы имеет смысл конвертировать в hypertable TimescaleDB. На выходе — список кандидатов с баллами.

Что нужно для работы скилла?

PostgreSQL 15+ с TimescaleDB. Для разбора запросов пригодится расширение pg_stat_statements, но скилл сначала проверяет, установлено ли оно.

Исходный текст

SKILL.md · Apache-2.0
---
name: find-hypertable-candidates
description: |
  Use this skill to analyze an existing PostgreSQL database and identify which tables should be converted to Timescale/TimescaleDB hypertables.

  **Trigger when user asks to:**
  - Analyze database tables for hypertable conversion potential
  - Identify time-series or event tables in an existing schema
  - Evaluate if a table would benefit from Timescale/TimescaleDB
  - Audit PostgreSQL tables for migration to Timescale/TimescaleDB/TigerData
  - Score or rank tables for hypertable candidacy


  **Keywords:** hypertable candidate, table analysis, migration assessment, Timescale, TimescaleDB, time-series detection, insert-heavy tables, event logs, audit tables

  Provides SQL queries to analyze table statistics, index patterns, and query patterns. Includes scoring criteria (8+ points = good candidate) and pattern recognition for IoT, events, transactions, and sequential data.
license: Apache-2.0
compatibility: Requires PostgreSQL 15+ with TimescaleDB
metadata:
  author: tigerdata
---

# PostgreSQL Hypertable Candidate Analysis

Identify tables that would benefit from TimescaleDB hypertable conversion. After identification, use the companion "migrate-postgres-tables-to-hypertables" skill for configuration and migration.

## TimescaleDB Benefits

**Performance gains:** 90%+ compression, fast time-based queries, improved insert performance, efficient aggregations, continuous aggregates for materialization (dashboards, reports, analytics), automatic data management (retention, compression).

**Best for insert-heavy patterns:**

- Time-series data (sensors, metrics, monitoring)
- Event logs (user events, audit trails, application logs)
- Transaction records (orders, payments, financial)
- Sequential data (auto-incrementing IDs with timestamps)
- Append-only datasets (immutable records, historical)

**Requirements:** Large volumes (1M+ rows), time-based queries, infrequent updates

## Step 1: Database Schema Analysis

### Option A: From Database Connection

#### Table statistics and size

```sql
-- Get all tables with row counts and insert/update patterns
WITH table_stats AS (
    SELECT
        schemaname, tablename,
        n_tup_ins as total_inserts,
        n_tup_upd as total_updates,
        n_tup_del as total_deletes,
        n_live_tup as live_rows,
        n_dead_tup as dead_rows
    FROM pg_stat_user_tables
),
table_sizes AS (
    SELECT
        schemaname, tablename,
        pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) as total_size,
        pg_total_relation_size(schemaname||'.'||tablename) as total_size_bytes
    FROM pg_tables
    WHERE schemaname NOT IN ('information_schema', 'pg_catalog')
)
SELECT
    ts.schemaname, ts.tablename, ts.live_rows,
    tsize.total_size, tsize.total_size_bytes,
    ts.total_inserts, ts.total_updates, ts.total_deletes,
    ROUND(CASE WHEN ts.live_rows > 0
          THEN (ts.total_inserts::float / ts.live_rows) * 100
          ELSE 0 END, 2) as insert_ratio_pct
FROM table_stats ts
JOIN table_sizes tsize ON ts.schemaname = tsize.schemaname AND ts.tablename = tsize.tablename
ORDER BY tsize.total_size_bytes DESC;
```

**Look for:**

- mostly insert-heavy patterns (less updates/deletes)
- big tables (1M+ rows or 100MB+)

#### Index patterns

```sql
-- Identify common query dimensions
SELECT schemaname, tablename, indexname, indexdef
FROM pg_indexes
WHERE schemaname NOT IN ('information_schema', 'pg_catalog')
ORDER BY tablename, indexname;
```

**Look for:**

- Multiple indexes with timestamp/created_at columns → time-based queries
- Composite (entity_id, timestamp) indexes → good candidates
- Time-only indexes → time range filtering common

#### Query patterns (if pg_stat_statements available)

```sql
-- Check availability
SELECT EXISTS (SELECT 1 FROM pg_extension WHERE extname = 'pg_stat_statements');

-- Analyze expensive queries for candidate tables
SELECT query, calls, mean_exec_time, total_exec_time
FROM pg_stat_statements
WHERE query ILIKE '%your_table_name%'
ORDER BY total_exec_time DESC LIMIT 20;
```

**✅ Good patterns:** Time-based WHERE, entity filtering combined with time-based qualifiers, GROUP BY time_bucket, range queries over time
**❌ Poor patterns:** Non-time lookups with no time-based qualifiers in same query (WHERE email = ...)

#### Constraints

```sql
-- Check migration compatibility
SELECT conname, contype, pg_get_constraintdef(oid) as definition
FROM pg_constraint
WHERE conrelid = 'your_table_name'::regclass;
```

**Compatibility:**

- Primary keys (p): Must include partition column or ask user if can be modified
- Foreign keys (f): Plain→Hypertable and Hypertable→Plain OK, Hypertable→Hypertable NOT supported
- Unique constraints (u): Must include partition column or ask user if can be modified
- Check constraints (c): Usually OK

### Option B: From Code Analysis

#### ✅ GOOD Patterns

```python
# Append-only logging
INSERT INTO events (user_id, event_time, data) VALUES (...);
# Time-series collection
INSERT INTO metrics (device_id, timestamp, value) VALUES (...);
# Time-based queries
SELECT * FROM metrics WHERE timestamp >= NOW() - INTERVAL '24 hours';
# Time aggregations
SELECT DATE_TRUNC('day', timestamp), COUNT(*) GROUP BY 1;
```

#### ❌ POOR Patterns

```python
# Frequent updates to historical records
UPDATE users SET email = ..., updated_at = NOW() WHERE id = ...;
# Non-time lookups
SELECT * FROM users WHERE email = ...;
# Small reference tables
SELECT * FROM countries ORDER BY name;
```

#### Schema Indicators

**✅ GOOD:**

- Has timestamp/timestamptz column
- Multiple indexes with timestamp-based columns
- Composite (entity_id, timestamp) indexes

**❌ POOR:**

- Mostly indexes with non-time-based columns (on columns like email, name, status, etc.)
- Columns that you expect to be updated over time (updated_at, updated_by, status, etc.)
- Unique constraints on non-time fields
- Frequent updated_at modifications
- Small static tables

#### Special Case: ID-Based Tables

Sequential ID tables can be candidates if:

- Insert-mostly pattern / updates are either infrequent or only on recent records.
- If updates do happen, they occur on recent records (such as an order status being updated orderered->processing->delivered. Note once an order is delivered, it is unlikely to be updated again.)
- IDs correlate with time (as is the case for serial/auto-incrementing IDs/GENERATED ALWAYS AS IDENTITY)
- ID is the primary query dimension
- Recent data accessed more often (frequently the case in ecommerce, finance, etc.)
- Time-based reporting common (e.g. monthly, daily summaries/analytics)

```sql
CREATE TABLE orders (
    id BIGSERIAL PRIMARY KEY,           -- Can partition by ID
    user_id BIGINT,
    created_at TIMESTAMPTZ DEFAULT NOW() -- For sparse indexes
);
```

Note: For ID-based tables where there is also a time column (created_at, ordered_at, etc.),
you can partition by ID and use sparse indexes on the time column.
See the `migrate-postgres-tables-to-hypertables` skill for details.

## Step 2: Candidacy Scoring (8+ points = good candidate)

### Time-Series Characteristics (5+ points needed)

- Has timestamp/timestamptz column: **3 points**
- Data inserted chronologically: **2 points**
- Queries filter by time: **2 points**
- Time aggregations common: **2 points**

### Scale & Performance (3+ points recommended)

- Large table (1M+ rows or 100MB+): **2 points**
- High insert volume: **1 point**
- Infrequent updates to historical: **1 point**
- Range queries common: **1 point**
- Aggregation queries: **2 points**

### Data Patterns (bonus)

- Contains entity ID for segmentation (device_id, user_id, product_id, symbol, etc.): **1 point**
- Numeric measurements: **1 point**
- Log/event structure: **1 point**

## Common Patterns

### ✅ GOOD Candidates

**✅ Event/Log Tables** (user_events, audit_logs)

```sql
CREATE TABLE user_events (
    id BIGSERIAL PRIMARY KEY,
    user_id BIGINT,
    event_type TEXT,
    event_time TIMESTAMPTZ DEFAULT NOW(),
    metadata JSONB
);
-- Partition by id, segment by user_id, enable minmax sparse_index on event_time
```

**✅ Sensor/IoT Data** (sensor_readings, telemetry)

```sql
CREATE TABLE sensor_readings (
    device_id TEXT,
    timestamp TIMESTAMPTZ,
    temperature DOUBLE PRECISION,
    humidity DOUBLE PRECISION
);
-- Partition by timestamp, segment by device_id, minmax sparse indexes on temperature and humidity
```

**✅ Financial/Trading** (stock_prices, transactions)

```sql
CREATE TABLE stock_prices (
    symbol VARCHAR(10),
    price_time TIMESTAMPTZ,
    open_price DECIMAL,
    close_price DECIMAL,
    volume BIGINT
);
-- Partition by price_time, segment by symbol, minmax sparse indexes on open_price and close_price and volume
```

**✅ System Metrics** (monitoring_data)

```sql
CREATE TABLE system_metrics (
    hostname TEXT,
    metric_time TIMESTAMPTZ,
    cpu_usage DOUBLE PRECISION,
    memory_usage BIGINT
);
-- Partition by metric_time, segment by hostname, minmax sparse indexes on cpu_usage and memory_usage
```

### ❌ POOR Candidates

**❌ Reference Tables** (countries, categories)

```sql
CREATE TABLE countries (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    code CHAR(2)
);
-- Static data, no time component
```

**❌ User Profiles** (users, accounts)

```sql
CREATE TABLE users (
    id BIGSERIAL PRIMARY KEY,
    email VARCHAR(255),
    created_at TIMESTAMPTZ,
    updated_at TIMESTAMPTZ
);
-- Accessed by ID, frequently updated, has timestamp but it's not the primary query dimension (the primary query dimension is id or email)
```

**❌ Settings/Config** (user_settings)

```sql
CREATE TABLE user_settings (
    user_id BIGINT PRIMARY KEY,
    theme VARCHAR(20),       -- Changes: light -> dark -> auto
    language VARCHAR(10),    -- Changes: en -> es -> fr
    notifications JSONB,     -- Frequent preference updates
    updated_at TIMESTAMPTZ
);
-- Accessed by user_id, frequently updated, has timestamp but it's not the primary query dimension (the primary query dimension is user_id)
```

## Analysis Output Requirements

For each candidate table provide:

- **Score:** Based on criteria (8+ = strong candidate)
- **Pattern:** Insert vs update ratio
- **Access:** Time-based vs entity lookups
- **Size:** Current size and growth rate
- **Queries:** Time-range, aggregations, point lookups

Focus on insert-heavy patterns with time-based or sequential access. Tables scoring 8+ points are strong candidates for conversion.

© tigerdata · Apache-2.0 · timescale/pg-aiguide

Похожие скиллы

Все скиллы по теме «Данные и базы» →
databases mrgoonie Скилл с единым справочником по MongoDB и PostgreSQL: схемы, запросы, индексы, миграции, бэкапы и администрирование. CX Codex +1 435установок sql-migrations Seth Hobson Готовит скрипты миграций SQL для PostgreSQL, MySQL и SQL Server с откатом и проверками целостности данных. Пригодится, когда менять схему на живой базе. CX Codex ★ 41 729звёзд репо postgres-best-practices neondatabase Скилл с гайдлайнами по Postgres: проектирование схем, индексы, оптимизация запросов, миграции и типичные ошибки. Пригодится, когда агент пишет SQL или настраивает базу. CX Codex +1 1 900установок drizzle-orm Mindrally Скилл задаёт агенту правила разработки на Drizzle ORM: схема как код, типы из таблиц, запросы и миграции. CX Codex +1 1 000установок database-design MoizIbnYousaf Скилл по проектированию схем, миграциям и оптимизации запросов для PostgreSQL, MySQL и NoSQL. Пригодится, когда агент пишет SQL. CX Codex +1 604установок neon-postgres neondatabase Скилл помогает агенту работать с базой Postgres на Neon: выбирать подключение, вести миграции и проверять состояние базы. Пригодится для задач с существующей схемой или DATABASE_URL. CX Codex +1 281 100установок

Из того же набора9

postgres Скилл для работы с PostgreSQL: проектирование таблиц, индексы, pgvector, PostGIS, TimescaleDB и миграции. Пригодится, когда агент пишет SQL вслепую. CX Codex +1 1 400установок pgvector-semantic-search Скилл учит агента настраивать векторный поиск в PostgreSQL с помощью pgvector. Он помогает хранить эмбеддинги, строить индексы HNSW и готовить базу к задачам RAG. CX Codex +1 938установок design-postgres-tables Скилл-справочник по проектированию таблиц PostgreSQL: типы данных, индексы, ограничения, JSONB и партиционирование. Пригодится, когда агент создаёт или меняет схему. CX Codex +1 613установок setup-timescaledb-hypertables Скилл подсказывает агенту, как проектировать гипертаблицы в TimescaleDB и Tiger Cloud под интенсивную запись. Помогает настроить сжатие, интервалы и секционирование. CX Codex +1 507установок postgres-hybrid-text-search Скилл учит ассистента настраивать гибридный поиск в PostgreSQL через связку pg_textsearch для BM25 и pgvector с объединением по алгоритму RRF. CX Codex +1 372установок migrate-postgres-tables-to-hypertables Планирует перевод таблиц PostgreSQL в гипертаблицы TimescaleDB: выбор колонки партиционирования, интервал чанков, ключи и сжатие. CX Codex +1 355установок design-postgis-tables Справочник по проектированию пространственных таблиц PostGIS: типы геометрий, системы координат, индексы и паттерны запросов. Пригодится, когда закладываете схему для данных с координатами. CX Codex +1 344установок pg-aiguide Даёт ИИ-агенту семантический поиск по мануалам PostgreSQL, TimescaleDB и PostGIS и подборки лучших практик, чтобы код был версионно корректным. CX Codex +1 ★ 1 874звёзд репо

Спонсоры проекта

Компании, которые помогают держать аналитику открытой