根据您的需求,优化 SQL 的核心目标是 高效获取每个分组中最新时间对应的记录。在不使用 CTE 的情况下,推荐以下两种优化方案:
方案 1:ROW_NUMBER() 窗口函数(推荐)
```sql
SELECT cTK_State, cTaskType, cCreateTime
FROM (
SELECT
cTK_State,
cTaskType,
cCreateTime,
ROW_NUMBER() OVER (
PARTITION BY ExtendField3, cTK_State, cTaskType
ORDER BY cCreateTime DESC
) AS rn
FROM Table_Task
WHERE ExtendField3 = 'SG240126004'
) AS t
WHERE rn = 1;
```
优化点:
1. 精准定位最新记录
`ROW_NUMBER()` 为每组数据按时间倒序编号 (`rn=1` 即最新记录),避免 `GROUP BY` 的聚合计算开销。
2. 分区逻辑匹配需求
`PARTITION BY ExtendField3, cTK_State, cTaskType` 确保分组条件与原始查询一致。
3. 性能优势
若存在索引 `(ExtendField3, cTK_State, cTaskType, cCreateTime DESC)`,效率显著高于聚合查询。
方案 2:关联子查询(兼容低版本)
```sql
SELECT
t1.cTK_State,
t1.cTaskType,
t1.cCreateTime
FROM Table_Task t1
WHERE t1.ExtendField3 = 'SG240126004'
AND t1.cCreateTime = (
SELECT MAX(cCreateTime)
FROM Table_Task t2
WHERE
t2.ExtendField3 = t1.ExtendField3
AND t2.cTK_State = t1.cTK_State
AND t2.cTaskType = t1.cTaskType
);
适用场景:
- 需兼容 SQL Server 早期版本(不支持窗口函数时)
- 数据量适中(避免全表扫描)
关键优化建议:
1. 索引优化
创建覆盖索引加速查询:
```sql
CREATE INDEX idx_optimizer
ON Table_Task (ExtendField3, cTK_State, cTaskType, cCreateTime DESC);
```
- 索引效果:通过包含所有查询字段和排序字段,减少 I/O 消耗 。
2. 避免 `GROUP BY` 陷阱
原始查询的 `GROUP BY` 会强制扫描所有分组数据,而上述方案仅提取目标行,效率更高 。
> 建议:优先选择 方案 1(窗口函数),兼顾性能与代码简洁性。
