check约束提升性能的问题

ohfox 2015-01-23 02:55:25
我有一堆的存股票数据的表,一个代码一张表,例如
SH600000,SH600600,SZ000001
每张表中只有一个代码的数据
我在所有表上的Code列都建了约束,例如:CHECK ([Code]='600000') ,约束都是正常使用的
然后建了一个视图,把所有的表union all在一起

这样,当我从视图查询的时候,
select *
from vw_XXX
where Code='600000'
and TIME>....
应该能够通过约束,很快的定位到只扫描SH600000这个表
实际执行计划也是这样,只有一个聚集索引查找,但奇怪的是分析和编译的时间每次都很长:

SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
SQL Server 分析和编译时间:
CPU 时间 = 47502 毫秒,占用时间 = 87810 毫秒。
SQL Server 分析和编译时间:
CPU 时间 = 47502 毫秒,占用时间 = 87811 毫秒。

(1 行受影响)
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。


貌似这个执行计划没法缓存住,当我换股票代码,或者哪怕是查询同一个语句,都会经历很长的分析和编译时间
请教这个该怎么处理?
...全文
244 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
cxmcxm 2015-01-29
  • 打赏
  • 举报
回复
check只是检查插入数据是否合法,对查询并不会有影响。 每种股票数据分开只是为了提高查询效率,再把它合并,肯定效率会很低。
ohfox 2015-01-26
  • 打赏
  • 举报
回复
如果从我提到的视图查一个不存在的股票代码,执行计划能看到直接做常量扫描就过去了,没有任何物理读写,应该是能提高效率的 但奇怪的是每次的执行计划没法缓存,都要花个40来秒。。。。
卖水果的net 版主 2015-01-23
  • 打赏
  • 举报
回复
check 并不能提高效率,只是规范了数据。 我说的不一定对。。。
ohfox 2015-01-23
  • 打赏
  • 举报
回复
函数的方法我来试试看 表不是我们自己设计的,是购买的供应商的数据
alongkuku 2015-01-23
  • 打赏
  • 举报
回复
这个要从源头动起,为什么要设计一个代码一个表,理论上应该每个代码字段应该是一样的,假如能够存在一个表中,速度就不是问题了。不过股票我不懂。
Tiger_Zhao 2015-01-23
  • 打赏
  • 举报
回复
#5: 10亿数据UNION ALL起来纯粹就是折腾服务器啊。

sas就不能调用函数吗?
SELECT * FROM f_query股票('600000','2015-01-01')


#6:
可是执行时间是0啊!
说不定只是把准备视图数据的过程算成分析和编译的时间而已。
不能证明计划没缓存啊。
ohfox 2015-01-23
  • 打赏
  • 举报
回复
ALTER TABLE [dbo].[SH600000] ADD CONSTRAINT [CK_SH600000_Code] CHECK (([Code]='600000')) 我每个表上都有一个类似的语句 我觉得用视图把它们串在一起是很自然的一件事情,为何sqlserver没法缓存执行计划,每次都要花40多秒去分析??? 实在不理解啊
ohfox 2015-01-23
  • 打赏
  • 举报
回复
整个视图大概10亿条数据吧 数据库层级的动态sql不是很复杂,麻烦在于我要为用sas的同事提供支持,创建这个视图也是为了避免他们在sas里面动态的去拼表名,而且还不知道sas可能支持这种动态表名
Tiger_Zhao 2015-01-23
  • 打赏
  • 举报
回复
还不如写个函数,拼个动态语句呢。单表操作就算分析和编译也会很快的啊。
用视图说不定要先执行视图才能分析和编译,否则不会这么慢的。

又:整个视图有多少数据?
ohfox 2015-01-23
  • 打赏
  • 举报
回复
是的,确实union all了2000多个表 但奇怪的是,我之前用同样方法union all也很多表的时候,不会有这样的问题的 那有没有办法强制数据库把这个执行计划缓存下来呢?
Tiger_Zhao 2015-01-23
  • 打赏
  • 举报
回复
你的视图看起来数据会很多、结果变化不定,数据库认为每次执行重新分析和编译会更有效率啊。
ohfox 2015-01-23
  • 打赏
  • 举报
回复
补充一下,那个从视图的查询,在运行的时候从dm_exec_requests中看到的plan_handle值,在查询结束后,在sys.dm_exec_query_plan和sys.dm_exec_cached_plans中都查询不到,是否执行计划压根没被缓存下来?

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧