wlzboy
1 天以前 08f95b2f159b56fa3bd4f4b348855989de8aa456
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
-- ========================================
-- 测试里程统计优化效果
-- 用途:对比优化前后的性能和准确性
-- ========================================
 
-- 1. 查看某个车辆某天的分段数据task_id覆盖率
-- 替换参数:@vehicleId, @statDate
SET @vehicleId = 1;  -- 替换为实际车辆ID
SET @statDate = '2025-12-04';  -- 替换为实际日期
 
SELECT 
    '分段统计' as '类型',
    COUNT(*) as '总分段数',
    SUM(CASE WHEN task_id IS NOT NULL THEN 1 ELSE 0 END) as '有任务ID的分段数',
    CONCAT(ROUND(SUM(CASE WHEN task_id IS NOT NULL THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2), '%') as 'task_id覆盖率'
FROM tb_vehicle_gps_segment_mileage
WHERE vehicle_id = @vehicleId
  AND DATE(segment_start_time) = @statDate;
 
-- 2. 对比两种计算方式的结果
-- 方式A:优化方案(直接按task_id聚合)
SELECT 
    '优化方案' as '计算方式',
    SUM(segment_distance) as '总里程',
    SUM(CASE WHEN task_id IS NOT NULL THEN segment_distance ELSE 0 END) as '任务里程',
    SUM(CASE WHEN task_id IS NULL THEN segment_distance ELSE 0 END) as '非任务里程',
    CONCAT(ROUND(SUM(CASE WHEN task_id IS NOT NULL THEN segment_distance ELSE 0 END) * 100.0 / 
           NULLIF(SUM(segment_distance), 0), 2), '%') as '任务占比'
FROM tb_vehicle_gps_segment_mileage
WHERE vehicle_id = @vehicleId
  AND DATE(segment_start_time) = @statDate;
 
-- 方式B:当前统计表中的数据(可能使用了时间重叠计算)
SELECT 
    '统计表数据' as '计算方式',
    total_mileage as '总里程',
    task_mileage as '任务里程',
    non_task_mileage as '非任务里程',
    CONCAT(ROUND(task_ratio * 100, 2), '%') as '任务占比'
FROM tb_vehicle_mileage_stats
WHERE vehicle_id = @vehicleId
  AND DATE(stat_date) = @statDate;
 
-- 3. 查看使用优化方案的车辆数量(task_id覆盖率 > 80%)
SELECT 
    DATE(segment_start_time) as '日期',
    vehicle_id,
    vehicle_no,
    COUNT(*) as '总分段数',
    SUM(CASE WHEN task_id IS NOT NULL THEN 1 ELSE 0 END) as '有task_id分段数',
    CONCAT(ROUND(SUM(CASE WHEN task_id IS NOT NULL THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2), '%') as '覆盖率',
    CASE 
        WHEN SUM(CASE WHEN task_id IS NOT NULL THEN 1 ELSE 0 END) > COUNT(*) * 0.8 
        THEN '✓ 使用优化方案' 
        ELSE '× 使用降级方案' 
    END as '方案选择'
FROM tb_vehicle_gps_segment_mileage
WHERE segment_start_time >= DATE_SUB(NOW(), INTERVAL 7 DAY)
GROUP BY DATE(segment_start_time), vehicle_id, vehicle_no
HAVING COUNT(*) > 10  -- 只统计分段数大于10的
ORDER BY DATE(segment_start_time) DESC, vehicle_id
LIMIT 20;
 
-- 4. 统计整体优化效果
SELECT 
    '整体统计' as '统计类型',
    COUNT(DISTINCT CONCAT(vehicle_id, '_', DATE(segment_start_time))) as '车辆-日期组合总数',
    SUM(CASE WHEN task_coverage > 0.8 THEN 1 ELSE 0 END) as '可使用优化方案的数量',
    CONCAT(ROUND(SUM(CASE WHEN task_coverage > 0.8 THEN 1 ELSE 0 END) * 100.0 / 
           COUNT(DISTINCT CONCAT(vehicle_id, '_', DATE(segment_start_time))), 2), '%') as '优化覆盖率'
FROM (
    SELECT 
        vehicle_id,
        DATE(segment_start_time) as stat_date,
        SUM(CASE WHEN task_id IS NOT NULL THEN 1 ELSE 0 END) * 1.0 / COUNT(*) as task_coverage
    FROM tb_vehicle_gps_segment_mileage
    WHERE segment_start_time >= DATE_SUB(NOW(), INTERVAL 7 DAY)
    GROUP BY vehicle_id, DATE(segment_start_time)
    HAVING COUNT(*) > 10
) coverage_stats;
 
-- 5. 性能测试:执行时间对比
-- 说明:使用EXPLAIN ANALYZE查看执行计划(MySQL 8.0+)或使用BENCHMARK函数
 
-- 优化方案查询(直接聚合)
EXPLAIN 
SELECT 
    vehicle_id,
    SUM(CASE WHEN task_id IS NOT NULL THEN segment_distance ELSE 0 END) as task_mileage,
    SUM(CASE WHEN task_id IS NULL THEN segment_distance ELSE 0 END) as non_task_mileage
FROM tb_vehicle_gps_segment_mileage
WHERE vehicle_id = @vehicleId
  AND DATE(segment_start_time) = @statDate
GROUP BY vehicle_id;
 
-- 6. 建议的优化措施
SELECT 
    '优化建议' as '类型',
    '补充历史数据的task_id' as '措施1',
    '确保定时任务正常运行' as '措施2',
    '确保任务状态正确更新' as '措施3',
    '定期检查task_id覆盖率' as '措施4';
 
-- ========================================
-- 使用说明:
-- 1. 设置参数:修改第7-8行的@vehicleId和@statDate
-- 2. 执行查询1-4查看优化效果
-- 3. 如果覆盖率低于80%,执行fix_segment_mileage_task_association.sql修复
-- 4. 重新统计,观察性能提升
-- ========================================