你的位置:首页 > 数据库

[数据库]利用查询提示优化SQL


数据库环境:SQL SERVER 2005

我们来看一下SQL语句及对应的数据量

SELECT COUNT(*)FROM  cinvout_02 aWHERE  ( a.dept_id IN ( SELECT RTRIM(dept_id)             FROM  ctlm2320             WHERE user1_id = '000008'                AND zone_id = '' )     OR a.dept_id = ''     OR ( a.dept_id IN ( SELECT  RTRIM(b.dept_id)               FROM   ctlm2320 a ,                    ctlm1003 b               WHERE   a.zone_id = b.zone_id                    AND a.user1_id = '000008'                    AND a.zone_id <> '' ) )    )    AND a.out_time >= '2014-07-01'    AND a.out_time <= '2014-07-12'    AND a.sts_flag = 'S'

---------------------数据量------------------------- SELECT COUNT(*)FROM cinvout_02 aWHERE a.out_time >= '2014-07-01' AND a.out_time <= '2014-07-12' AND a.sts_flag = 'S'--214555 SELECT COUNT(*)FROM ctlm2320WHERE user1_id = '000008' AND zone_id = ''--0 SELECT COUNT(*)FROM ctlm2320 a , ctlm1003 bWHERE a.zone_id = b.zone_id AND a.user1_id = '000008' AND a.zone_id <> ''--3768

数据量不是很大,cinvout_02也走了索引查找,而且返回的数据才有214317行。按理说应该不会太慢,

可是,真实情况是,整条SQL要跑4分多钟才全部出结果。

光靠猜是得不出答案的,我们通过执行计划来分析为什么会出现这种情况。

看一下圈红的地方,2张表/结果集关联走的是Nested Loops,且结果集相对较大,因此,这地方应该走hash join。

直接在SQL后面加上提示option(hash join)即可。

强制走hash join后,执行计划直接开并行,并将2个结果集并行。

好了,我们对比一下加查询提示前后SQL的耗时。

原来SQL耗时


加了查询提示后的SQL耗时

嗖的一下,就出结果了。
(本文完)

 




安徽旅游路线推荐安徽自驾游攻略安徽旅游线路大全什么时候去安徽旅游最好安徽跟团旅游报价多少礐石风景区在哪里?汕头礐石风景区什么时候去最好? 礐石风景区有什么好吃的?汕头礐石风景区美食有哪些? 广州市南沙水鸟世界电话?南沙水鸟世界门票怎么预定? 南沙水鸟世界好不好玩?广州南沙水鸟世界有什么? 2015春节小鸟天堂有什么好玩的?新会小鸟天堂景区春节活动介绍? 情人节将至 带着爱人去天津享受复古式“约泡” 通往异世界的入口 传说中的地狱之门 一张图让你读懂哈尔滨冰雪大世界 一叶知秋 看尽四川十大最美秋色 敏捷黄金海岸水晶湖有什么玩的?阳江敏捷黄金海岸水晶湖项目有什么? 阳江黄金海岸景区项目有哪些?阳江敏捷黄金海岸景区一天游攻略? 阳江黄金海岸景区电话?阳江海陵岛黄金海岸有什么玩的? 香港迪士尼乐园能带东西和吃的进去吗? 澳门购物哪里最好?具体地址在哪里? 香港有什么好吃正宗的美食?这些美食在哪里?怎么去? 澳门圣诞节哪里好玩?有什么好玩的? AQ12EA3R9DAJWE Datasheet AQ12EA3R9DAJWE Datasheet SQCA5A271JATWE Datasheet SQCA5A271JATWE Datasheet AQ12EA430FAJME Datasheet AQ12EA430FAJME Datasheet 义乌去港澳旅游 义乌去港澳旅游 义乌去港澳旅游 绍兴去港澳游 绍兴去港澳游 绍兴去港澳游 锦州去香港旅游 锦州去香港旅游 锦州去香港旅游