热门角色不仅是灵感来源,更是你的效率助手。通过精挑细选的角色提示词,你可以快速生成高质量内容、提升创作灵感,并找到最契合你需求的解决方案。让创作更轻松,让价值更直接!
我们根据不同用户需求,持续更新角色库,让你总能找到合适的灵感入口。
CREATE MATERIALIZED VIEW IF NOT EXISTS public.mv_product_sales_daily AS
SELECT
oi.product_id,
(o.created_at::date) AS sales_date,
SUM(oi.quantity) AS qty
FROM public.order_items oi
JOIN public.orders o ON o.id = oi.order_id
WHERE o.status IN (1,2)
AND o.created_at >= current_date - interval '180 days'
GROUP BY oi.product_id, o.created_at::date
WITH NO DATA;
-- 并发刷新要求唯一索引
CREATE UNIQUE INDEX IF NOT EXISTS ux_mv_product_sales_daily
ON public.mv_product_sales_daily (product_id, sales_date);
-- 支持常用时间过滤与二次聚合
CREATE INDEX IF NOT EXISTS idx_mv_psd_sales_date_product
ON public.mv_product_sales_daily (sales_date, product_id);
-- 原查询3改写
SELECT product_id, SUM(qty) AS qty
FROM public.mv_product_sales_daily
WHERE sales_date BETWEEN $1::date AND $2::date
GROUP BY product_id
ORDER BY qty DESC
LIMIT 20;
CREATE OR REPLACE VIEW public.v_recent_paid_orders AS
SELECT id, customer_id, created_at, total
FROM public.orders
WHERE status = 1
AND created_at >= now() - interval '30 days';
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_orders_paid_created_desc
ON public.orders (created_at DESC)
INCLUDE (id, customer_id, total)
WHERE status = 1;
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_orders_customer_created_desc
ON public.orders (customer_id, created_at DESC)
INCLUDE (id, total, status);
CREATE INDEX CONCURRENTLY IF NOT EXISTS brin_orders_created_12
ON public.orders USING BRIN (created_at)
WHERE status IN (1,2)
WITH (pages_per_range = 32);
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_products_category_updated
ON public.products (category_id, updated_at DESC)
INCLUDE (price, name);
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_orders_id_total
ON public.orders (id)
INCLUDE (total);
-- 确认生产一段时间无使用(pg_stat_user_indexes/auto_explain/计划观测)后再执行
DROP INDEX CONCURRENTLY IF EXISTS idx_orders_created;
附:验证与评估步骤(建议执行)
CREATE TABLE analytics.daily_user_activity (
d DATE NOT NULL,
user_id BIGINT NOT NULL,
PRIMARY KEY (d, user_id)
)
PARTITION BY RANGE COLUMNS(d) (
PARTITION p_min VALUES LESS THAN ('2024-01-01'),
PARTITION p_max VALUES LESS THAN (MAXVALUE)
) ENGINE=InnoDB;
INSERT IGNORE INTO analytics.daily_user_activity (d, user_id)
SELECT DATE(created_at) AS d, user_id
FROM analytics.event_log
WHERE created_at >= CURDATE() - INTERVAL 2 DAY
AND created_at < CURDATE() + INTERVAL 1 DAY;
-- 可按分区批量执行,或以分区边界作为增量窗口
CREATE OR REPLACE VIEW analytics.v_dau_daily AS
SELECT d, COUNT(*) AS dau
FROM analytics.daily_user_activity
GROUP BY d;
SELECT d, dau
FROM analytics.v_dau_daily
WHERE d BETWEEN ? AND ?
ORDER BY d;
CREATE OR REPLACE VIEW analytics.v_click_purchase_users AS
SELECT e1.user_id, e1.created_at AS click_ts
FROM analytics.event_log e1
WHERE e1.event_type = 'click'
AND EXISTS (
SELECT 1
FROM analytics.event_log e2
WHERE e2.user_id = e1.user_id
AND e2.event_type = 'purchase'
AND e2.created_at >= e1.created_at
);
-- 业务查询时加时间条件以利用分区裁剪:
-- SELECT user_id FROM analytics.v_click_purchase_users
-- WHERE click_ts BETWEEN ? AND ?;
备注:若业务允许限定转化窗口(例如 7 天内转化),可在 EXISTS 内增加 AND e2.created_at < e1.created_at + INTERVAL 7 DAY,以进一步减少扫描跨度(请先与业务确认再实施)。CREATE TABLE analytics.session_device_daily (
d DATE NOT NULL,
os VARCHAR(20) NOT NULL,
app_version VARCHAR(20),
cnt BIGINT NOT NULL,
PRIMARY KEY (d, os, app_version)
)
PARTITION BY RANGE COLUMNS(d) (
PARTITION p_min VALUES LESS THAN ('2024-01-01'),
PARTITION p_max VALUES LESS THAN (MAXVALUE)
) ENGINE=InnoDB;
INSERT INTO analytics.session_device_daily (d, os, app_version, cnt)
SELECT DATE(s.started_at) AS d, d2.os, d2.app_version, COUNT(*) AS cnt
FROM analytics.session s
JOIN analytics.device_dim d2 ON d2.id = s.device_id
WHERE s.started_at >= CURDATE() - INTERVAL 2 DAY
AND s.started_at < CURDATE() + INTERVAL 1 DAY
GROUP BY 1,2,3
ON DUPLICATE KEY UPDATE cnt = VALUES(cnt);
CREATE OR REPLACE VIEW analytics.v_session_os_version_daily AS
SELECT d, os, app_version, cnt
FROM analytics.session_device_daily;
SELECT os, app_version, SUM(cnt) AS cnt
FROM analytics.v_session_os_version_daily
WHERE d BETWEEN ? AND ?
GROUP BY os, app_version
ORDER BY cnt DESC
LIMIT 50;
ALTER TABLE analytics.event_log
ADD INDEX idx_event_user_eventtype_created (user_id, event_type, created_at)
ALGORITHM=INPLACE, LOCK=NONE;
ALTER TABLE analytics.event_log
ADD INDEX idx_event_eventtype_created_user (event_type, created_at, user_id)
ALGORITHM=INPLACE, LOCK=NONE;
ALTER TABLE analytics.event_log
ADD INDEX idx_event_user_created_desc_type (user_id, created_at DESC, event_type)
ALGORITHM=INPLACE, LOCK=NONE;
ALTER TABLE analytics.session
ADD INDEX idx_session_started_device (started_at, device_id)
ALGORITHM=INPLACE, LOCK=NONE;
ALTER TABLE analytics.event_log
ADD COLUMN properties_campaign_id BIGINT
GENERATED ALWAYS AS (CAST(JSON_UNQUOTE(properties->'$.campaign_id') AS UNSIGNED)) STORED,
ADD INDEX idx_event_prop_campaign (properties_campaign_id)
ALGORITHM=INPLACE, LOCK=NONE;
-- 请在确认生产近 7~14 天无依赖后再执行
ALTER TABLE analytics.event_log DROP INDEX idx_event_user, DROP INDEX idx_event_type;
附加实施与验证建议(安全性保障):
# 数据库优化建议报告
## 性能问题诊断
- 主要瓶颈分析:
- 月度科目余额:对 ledger_entry 的高代价扫描与聚合,逻辑读约 3.5M pages;现有索引 (account_id, posted_at) 不能充分利用按时间范围的选择性,导致并行扫描与大范围聚合。
- 逾期发票清单:虽然存在 (status, due_date) 索引,但非覆盖导致 Key Lookup;分页与排序触发额外 IO;P95 达 480ms。
- 交易-分录明细:联接计划多为 Hash Join,原因是返回行数较大且索引不覆盖,产生 Lookup 与额外排序;偶发 PAGELATCH_UP 与热点页相关(高并发插入/读取相同叶级页)。
- 客户发票汇总:以 issue_date 过滤、按 customer_id 聚合,但当前索引以 customer_id 为前导,导致范围扫描与昂贵聚合。
- 其他:参数嗅探造成波动;部分日期参数未对齐分区边界导致跨月扫描;等待中 IO_COMPLETION 占 11% 反映高读 IO。
- 影响范围:
- 受影响查询:月度余额、逾期发票、交易-分录明细、客户发票汇总(覆盖最近一周高频业务报表与明细检索)。
- 数据量级:ledger_entry ~900M(按月分区)、invoice ~40M。
## 视图优化建议
### 建议1:v_ledger_monthly_balance
- **优化类型**:创建新视图(索引化视图/物化)
- **优化原理**:将明细级别的分录按账户+月份预聚合,显著降低月度余额查询的读取与聚合成本;索引化视图的聚合结果持久化,查询可直接扫描小规模聚合页集。注意:索引化视图对 DML 有维护开销,需在预生产评估。
- **具体方案**:
- 先确保创建索引化视图所需 SET 选项(窗口会话级):
```
SET ANSI_NULLS ON;
SET QUOTED_IDENTIFIER ON;
SET ANSI_PADDING ON;
SET ANSI_WARNINGS ON;
SET CONCAT_NULL_YIELDS_NULL ON;
SET NUMERIC_ROUNDABORT OFF;
SET ARITHABORT ON;
```
- 创建视图与唯一聚集索引:
```sql
USE finance;
GO
CREATE VIEW dbo.v_ledger_monthly_balance
WITH SCHEMABINDING
AS
SELECT
le.account_id,
CONVERT(date, DATEFROMPARTS(YEAR(le.posted_at), MONTH(le.posted_at), 1)) AS month_start,
COUNT_BIG(*) AS row_count,
SUM(le.amount) AS balance
FROM dbo.ledger_entry AS le
GROUP BY
le.account_id,
CONVERT(date, DATEFROMPARTS(YEAR(le.posted_at), MONTH(le.posted_at), 1));
GO
-- 建立唯一聚集索引(行数量级为 账户数 × 月份数,体量远小于明细表)
CREATE UNIQUE CLUSTERED INDEX CIX_v_ledger_monthly_balance
ON dbo.v_ledger_monthly_balance (month_start, account_id);
GO
```
- 查询改写示例(建议使用 NOEXPAND 保证命中视图索引):
```sql
SELECT account_id, balance
FROM dbo.v_ledger_monthly_balance WITH (NOEXPAND)
WHERE month_start >= @start_month -- e.g. '2024-01-01'
AND month_start < @end_month -- e.g. '2024-02-01'
ORDER BY account_id;
```
- **预期效果**:月度余额查询从扫描 3.5M pages 降至扫描数千页以内,响应时间预计 1.6s → 80~200ms(>80% 降幅);CPU/IO 显著下降,计划稳定。
### 建议2:v_invoice_daily_cust_agg
- **优化类型**:创建新视图(索引化视图/物化)
- **优化原理**:将发票按“客户-自然日”预聚合,客户发票汇总在任意日期区间只需扫描日粒度聚合结果并再聚合,显著减少扫描与聚合量。
- **具体方案**:
```sql
USE finance;
GO
-- 同样要求与建议1相同的 SET 选项
CREATE VIEW dbo.v_invoice_daily_cust_agg
WITH SCHEMABINDING
AS
SELECT
i.customer_id,
i.issue_date,
COUNT_BIG(*) AS cnt,
SUM(i.amount) AS amt
FROM dbo.invoice AS i
GROUP BY i.customer_id, i.issue_date;
GO
CREATE UNIQUE CLUSTERED INDEX CIX_v_invoice_daily_cust_agg
ON dbo.v_invoice_daily_cust_agg(issue_date, customer_id);
GO
-- 查询改写示例:
SELECT customer_id, SUM(cnt) AS cnt, SUM(amt) AS amt
FROM dbo.v_invoice_daily_cust_agg WITH (NOEXPAND)
WHERE issue_date BETWEEN @start AND @end
GROUP BY customer_id
ORDER BY SUM(amt) DESC;
-- 请将 [PS_ledger_posted_at] 替换为现有基于 posted_at 的分区方案名称
CREATE NONCLUSTERED INDEX IX_ledger_posted_account_incl_amount
ON dbo.ledger_entry (posted_at ASC, account_id)
INCLUDE (amount)
WITH (DATA_COMPRESSION = PAGE, STATISTICS_INCREMENTAL = ON)
ON [PS_ledger_posted_at](posted_at);
CREATE NONCLUSTERED INDEX IX_ledger_account_posted_desc_cover
ON dbo.ledger_entry (account_id, posted_at DESC)
INCLUDE (amount, txn_id)
WITH (DATA_COMPRESSION = PAGE, STATISTICS_INCREMENTAL = ON)
ON [PS_ledger_posted_at](posted_at);
CREATE NONCLUSTERED INDEX IX_invoice_open_due_cover
ON dbo.invoice (due_date ASC)
INCLUDE (customer_id, amount)
WHERE status = 'O';
CREATE NONCLUSTERED INDEX IX_invoice_issue_customer_cover
ON dbo.invoice (issue_date, customer_id)
INCLUDE (amount)
WITH (DATA_COMPRESSION = PAGE);
CREATE NONCLUSTERED COLUMNSTORE INDEX NCCI_ledger_entry_analytics
ON dbo.ledger_entry (account_id, posted_at, amount, txn_id);
补充可操作要点(与上述建议配套):
让DBA、后端开发与数据平台负责人在最少输入下,将库表结构、典型查询与性能数据快速转化为一份可直接落地的视图与索引优化报告;分钟级定位慢查询与冗余索引,给出含原因说明、示例SQL、收益预估与实施优先级的行动清单;在确保数据安全与兼容性的前提下,实现可验证的查询加速与资源节省,稳定SLA并降低算力与云成本。
快速定位慢查询与热点表,输出索引增删改清单与执行顺序;生成脱敏SQL与回滚方案,缩短变更评审时间并降低风险。
根据接口的典型查询样本,一键获得可直接替换的视图与索引建议;用测试数据验证响应时间,避免上线后反复调优。
梳理跨库表的访问模式,制定统一索引规范与命名约定;按收益排序安排实施批次,确保不同版本与引擎都能兼容。
将模板生成的提示词复制粘贴到您常用的 Chat 应用(如 ChatGPT、Claude 等),即可直接对话使用,无需额外开发。适合个人快速体验和轻量使用场景。
把提示词模板转化为 API,您的程序可任意修改模板参数,通过接口直接调用,轻松实现自动化与批量处理。适合开发者集成与业务系统嵌入。
在 MCP client 中配置对应的 server 地址,让您的 AI 应用自动调用提示词模板。适合高级用户和团队协作,让提示词在不同 AI 工具间无缝衔接。
一次支付永久解锁,全站资源与持续更新;商业项目无限次使用