| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- package vrtxsql
- import (
- "database/sql"
- "fmt"
- "testing"
- )
- // 生产形态仿真: monitor_metrics 同款结构 + GORM 驱动路径 + 周期清理(触发索引重建) + 持续插入。
- func TestProdShapeSimulation(t *testing.T) {
- dsn := t.TempDir() + "/prod.db"
- db, err := sql.Open("vrtx", dsn)
- if err != nil {
- t.Fatal(err)
- }
- defer db.Close()
- if _, err := db.Exec(`CREATE TABLE monitor_metrics (
- id BIGINT PRIMARY KEY,
- service_name VARCHAR(128),
- ts BIGINT,
- cnt BIGINT)`); err != nil {
- t.Fatal(err)
- }
- if _, err := db.Exec(`CREATE INDEX idx_name ON monitor_metrics (service_name)`); err != nil {
- t.Fatal(err)
- }
- if _, err := db.Exec(`CREATE INDEX idx_ts ON monitor_metrics (ts)`); err != nil {
- t.Fatal(err)
- }
- // GORM 形态: Prepare + 批量循环 Exec (5秒一轮监控的密度, 放大 40 轮)
- stmt, err := db.Prepare(`INSERT INTO monitor_metrics (id, service_name, ts, cnt) VALUES (?, ?, ?, ?)`)
- if err != nil {
- t.Fatal(err)
- }
- defer stmt.Close()
- id := int64(0)
- insertRound := func(n int, base int64) {
- for i := 0; i < n; i++ {
- id++
- svc := fmt.Sprintf("service-%02d-with-a-fairly-long-name-for-wide-secondary-keys", i%17)
- if _, err := stmt.Exec(id, svc, base+int64(i), int64(i)); err != nil {
- t.Fatalf("插入 id=%d: %v", id, err)
- }
- }
- }
- deleteBelow := func(bound int64) {
- if _, err := db.Exec(`DELETE FROM monitor_metrics WHERE ts < ?`, bound); err != nil {
- t.Fatalf("清理 ts<%d: %v", bound, err)
- }
- }
- for round := 0; round < 40; round++ {
- insertRound(200, int64(round*1000)) // 每轮 200 行 (一行 total + 每服务行)
- deleteBelow(int64(round*1000 - 500)) // 周期清理 → 触发批量删+索引重建
- }
- // 校验: 只有最后一轮的 200 行存活 (早期轮次被后续清理删光)
- var total int64
- if err := db.QueryRow(`SELECT COUNT(*) FROM monitor_metrics`).Scan(&total); err != nil {
- t.Fatal(err)
- }
- if total != 200 {
- t.Fatalf("行数不一致: total=%d 期望 200", total)
- }
- var n int64
- if err := db.QueryRow(`SELECT COUNT(*) FROM monitor_metrics WHERE service_name = ?`,
- "service-05-with-a-fairly-long-name-for-wide-secondary-keys").Scan(&n); err != nil {
- t.Fatal(err)
- }
- if n == 0 {
- t.Fatal("二级索引等值查 0 行")
- }
- t.Logf("仿真完成: 累计插入 %d 行, 存活 %d, 索引等值命中 %d", id, total, n)
- }
|