From f6941fe002e85b12d1963445d3be290894e4f7c0 Mon Sep 17 00:00:00 2001 From: huang <1724659546@qq.com> Date: Thu, 25 Sep 2025 10:34:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=B6=85=E8=A1=A8=E5=88=86?= =?UTF-8?q?=E7=89=87=E9=80=BB=E8=BE=91,=20=E4=B8=80=E5=A4=A9=E4=B8=80?= =?UTF-8?q?=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/infra/database/postgres.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/internal/infra/database/postgres.go b/internal/infra/database/postgres.go index 27d0ecc..b2200c4 100644 --- a/internal/infra/database/postgres.go +++ b/internal/infra/database/postgres.go @@ -124,7 +124,7 @@ func (ps *PostgresStorage) Migrate(models ...interface{}) error { return err } - // 如果是 TimescaleDB, 则将 sensor_data 转换为 hypertable + // 如果是 TimescaleDB, 则将部分表转换为 hypertable if ps.isTimescaleDB { ps.logger.Info("检测到 TimescaleDB, 准备进行超表转换") if err := ps.creatingHyperTable(); err != nil { @@ -139,16 +139,18 @@ func (ps *PostgresStorage) creatingHyperTable() error { // 将 sensor_data 转换为超表 // 使用 if_not_exists => TRUE 保证幂等性 // 'time' 是 SensorData 模型中定义的时间列 - sqlSensorData := "SELECT create_hypertable('sensor_data', 'time', if_not_exists => TRUE);" + // 设置 chunk_time_interval 为 1 天, 以优化按天查询的性能 + sqlSensorData := "SELECT create_hypertable('sensor_data', 'time', chunk_time_interval => INTERVAL '1 day', if_not_exists => TRUE);" if err := ps.db.Exec(sqlSensorData).Error; err != nil { ps.logger.Errorw("将 sensor_data 转换为超表失败", "error", err) return fmt.Errorf("将 sensor_data 转换为超表失败: %w", err) } - ps.logger.Info("成功将 sensor_data 转换为超表 (或已转换)") + ps.logger.Info("成功将 sensor_data 转换为超表 (或已转换), chunk 间隔为 1 天") // 将 device_command_log 转换为超表 // 'sent_at' 是 DeviceCommandLog 模型中定义的时间列 - sqlDeviceCommandLogs := "SELECT create_hypertable('device_command_log', 'sent_at', if_not_exists => TRUE);" + // 设置 chunk_time_interval 为 1 天 + sqlDeviceCommandLogs := "SELECT create_hypertable('device_command_log', 'sent_at', chunk_time_interval => INTERVAL '1 day', if_not_exists => TRUE);" if err := ps.db.Exec(sqlDeviceCommandLogs).Error; err != nil { ps.logger.Errorw("将 device_command_log 转换为超表失败", "error", err) return fmt.Errorf("将 device_command_log 转换为超表失败: %w", err)