查询优化器是否会在计划创建时重写查询移除冗余列?
查询优化器冗余列处理与视图重写疑问
核心疑问与测试过程
- 我认为查询优化器理应在计划创建阶段移除冗余列,避免无意义的缓存占用,但一直找不到相关官方证据。
- 测试环境:290k行的数据集,带有主键和复合索引
- 测试操作:
- 先执行缓存清空命令:
DBCC FreeProcCache; DBCC DropCleanBuffers; DBCC FreeSystemCache('sql plans'); - 运行包含7个冗余列的派生表查询,Profiler监控结果:CPU=92,Reads=23703
- 再次清空缓存后运行无冗余列的简化查询,监控结果:CPU=78,Reads=23476
- 先执行缓存清空命令:
- 测试发现:两次查询的执行计划相似,怀疑优化器已经重写了查询,但无法找到直接的证实依据。
延伸疑问
- 当查询包含SCD Type 2逻辑、带有PII数据的冗余视图时,SQL Server查询优化器是否会对查询进行重写?
内容的提问来源于stack exchange,提问作者Steve Martin
相关产品推荐
相关产品推荐

