调用HolyCount函数处理70万行数据速度过慢,寻求优化方案
优化HolyCount函数的性能问题
原函数运行极慢的核心原因有三点:
- 逐天循环遍历日期范围,日期跨度大时循环次数会指数级增长,70万行调用相当于重复执行几十万次循环操作
- 每次循环都执行一次子查询,重复扫描全表,完全没有复用查询结果
- 未针对查询条件建立索引,每次子查询都是低效的全表扫描
直接用集合操作替代循环,一次性计算日期范围内的节假日数量,性能会提升几个数量级:
ALTER FUNCTION [dbo].[HolyCount] ( @StartTime datetime, @EndTime datetime ) RETURNS int AS BEGIN RETURN ( SELECT COUNT(*) FROM [StageArea_Tickets].[dbo].[SW_Calendar] WHERE [shamsi_state] = 'holiday' AND CAST([georgian_date] AS date) BETWEEN CAST(@StartTime AS date) AND CAST(@EndTime AS date) ) END
额外优化建议:
- 给
[StageArea_Tickets].[dbo].[SW_Calendar]表建立复合索引:CREATE NONCLUSTERED INDEX IX_SW_Calendar_HolidayDate ON SW_Calendar (shamsi_state, georgian_date),这会让查询直接命中索引,彻底避免全表扫描 - 如果
georgian_date字段本身就是date类型,可以去掉CAST转换,进一步减少计算开销
内容的提问来源于stack exchange,提问作者Adel
相关产品推荐
相关产品推荐

