select count(distinct v_yjhm) from (select v_yjhm from zjjk_t_yssj_o_his a where n_yjzl > 0 and d_sjrq between to_date('20070301', 'yyyymmdd') and to_date('20070401', 'yyyymmdd') and v_yjzldm like '40%' and not exists(select 'a' from INST_TRIG_ZJJK_T_YSSJ_O b where a.v_yjtm=b.yjbh) --and v_yjtm not in (select yjbh from INST_TRIG_ZJJK_T_YSSJ_O) union select v_yjhm from zjjk_t_yssj_u_his a where n_yjzl > 0 and d_sjrq between to_date('20070301', 'yyyymmdd') and to_date('20070401', 'yyyymmdd') and v_yjzldm like '40%' and not exists(select 'a' from INST_TRIG_ZJJK_T_YSSJ_U b where a.v_yjtm=b.yjbh)) --and v_yjtm not in (select yjbh from INST_TRIG_ZJJK_T_YSSJ_U))
说明:1、zjjk_t_yssj_o_his 、zjjk_t_yssj_u_his 的d_sjrq 上都有一个索引了
2、zjjk_t_yssj_o_his 、zjjk_t_yssj_u_his 的v_yjtm 都为 not null 字段
3、INST_TRIG_ZJJK_T_YSSJ_O、INST_TRIG_ZJJK_T_YSSJ_U 的 yjbh 为PK
优化建议:
1、什么是DISTINCT ? 就是分组排序后取唯一值 ,底层行为 分组排序
2、什么是 UNION 、 UNION ALL ? UNION : 对多个结果集取DISTINCT ,生成一个不含重复记录的结果集,返回给前端,UNION ALL :不对结果集进行去重复操作 底层行为:分组排序
3、什么是 COUNT(*) ? 累加
4、需要有什么样的索引? S_sjrq + v_yjzldm : 理由: 假如全省的数据量在表中全部数为1000万,查询月数据量为200万,1000万中特快占50%, 则 通过 beween 时间(d_sjrq)+ 种类( v_yjzldm ),可过滤出约100万,这是最好的检索方式了。
5、两表都要进行一次 NOT EXISTS 运算,如何做最优? NOT EXISTS 是不好做的运算,但是我们可以合并两次的NOT EXISTS 运算。让这费资源的活只干一次。
综合以上,我们可以如下优化这个SQL:
1、内部的UNION 也是去重复,外部的DISTINCT 也是去重复,可左右去掉一个,建议内部的改为 UNION ALL , 这里稍请注意一下,如果V_YJHM 有NULL的情况,可能会引起COUNT值不对实际数的情况。
2、建一个 D_SJRQ+V_YJZLDM 的复合索引
3、将两个子查询先 UNION ALL 联结 , 另两个用来做 NOT EXISTS 的表也 UNION ALL 联结
4、在3的基础上再做 NOT EXISTS
5、将NOT EXISTS 替换为NOT IN ,同时加提示 HASH_AJ 做半连接HASH运算
6、最后为外层的COUNT(DISTINCT … 获得结果数
SQL书写如下:
select count(distinct v_yjhm) from (select v_yjtm, v_yjhm from zjjk_t_yssj_o_his a where n_yjzl > 0 and d_sjrq between to_date('20070301', 'yyyymmdd') and to_date('20070401', 'yyyymmdd') and v_yjzldm like '40%' union all select v_yjtm, v_yjhm from zjjk_t_yssj_u_his a where n_yjzl > 0 and d_sjrq between to_date('20070301', 'yyyymmdd') and to_date('20070401', 'yyyymmdd') and v_yjzldm like '40%' ) a where a.v_yjtm not IN (select /*+ HASH_AJ */ yjbh from (select yjbh from INST_TRIG_ZJJK_T_YSSJ_O union all select yjbh from INST_TRIG_ZJJK_T_YSSJ_U))
经过上述改造,原来这个SQL的执行时间如果为2分钟的话,现在应该20秒足够!
|
相关推荐
Microsoft SQL Server 2005 Express Edition (SQL Server Express) 是一个免费且易于使用的 SQL Server 2005 版本,它替换了 Microsoft Desktop Engine (MSDE)。与 Microsoft Visual Studio 2005 集成之后,SQL ...
(1)大数据量、超大数据量的结构化平文本数据和模糊匹配查找(Char、Varchar、Nvarchar)。 (2)大数据量、超大数据量的层次型XML数据展开后的查找---含模糊查找(Xml type)。 (3)标准格式的二进制非...
而动态数据是指用户在使用平台的过程中所产生的业务数据,在实现业务中,这部分数据大部分都是读操作比较多,而写操作比较少,因此可以针对这部分数据根据特定的缓存失效策略机制来进行相应的缓存; 缓冲层的...
他认为对于SQL的学习是永无止境的,相信每一个查询Oracle数据库的人都需要精通SQL语言,才能写出高效的查询。他参与本书的编写就是为了帮助别人实现这一目标。 目录 封面 -11 封底 -10 扉页 -9 版权 -8 版权声明 -7...
3、要求使用sqlplus,pl/sql或developer建立存储过程,触发器和程序包等代码,其中要求用到游标,异常,各种语句等对表中数据进行处理; 4、使用自己熟悉的开发语言,加入界面,连接数据库; 5、报告要有操作截图...
系统开发采用Microsoft公司的Visual Basic 6.0,利用其强大的可视化界面功能及对数据库的支持,先构造一个原型,逐步增加功能,最终满足需求。系统中大量采用SQL查询语句,界面友好,功能较强。不足的地方是当数据...
本版继续使用之前版本增加的较为有效的规范化讨论,使用一个四步过程来演示规范化关系的规定步骤。这种方法不仅简化了规范化任务,而且使规范化原理更易于理解,因此当前版本仍沿用了这一方法。教师如需更多了解范式...
POS系统和联机电子称等级大地提高了前台销售和盘存的速度,并可以随时打印各项报表,使得零售企业的日常管理实现了信息化,并为企业积累了丰富的、比较完整的能反应企业经营过程的数据。为了充分利用大量的历史数据...
因此,先进的管理思想就成为了一个可望而不可及的目标。投票非常急需一套既有先进管理思想的系统,作为实现目标和提高现有投票管理水平的一种重要手段。 随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能...
科汛cms(Kesioncms)是基于采用网络中已经成熟、稳定的技术ASP+ACCESS(SQL2000/2005)开发而成,利用本系统您可以很方便地管理自己的网站。本系统是一款由文章、图片、下载、分类信息、商城、求职招聘、影视、动漫...
间接数据挖掘 一、数据挖掘的定义 数据挖掘,在人工智能领域,习惯上又称为数据库中知识发现(Knowledge Discovery in Database,简称为KDD),也有人把数据挖掘视为数据库中知识发现过程的一个基本步骤 。...
一个很有意义的SQL的优化过程(一个电子化支局中的大数据量的统计SQL) 166 如何优化大数据量模糊查询(架构,数据库设置,SQL..) 168 求助:海量数据处理方法 169 # re: 求助:海量数据处理方法 回复 更...
支持爬取东方财富网A股所有股票250日行情,数据量达到100万 支持自动更新数据 支持CCTV欧洲杯2020比赛数据爬取 1.2 数据落库位置 新闻数据存储在MongoDB 股票数据存储在MySQL的stock数据库 1.3 目前支持...
在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...
[ASP.NET 2.0]PageParser.GetCompiledPageInstance中存在一个Bug 如何在DotNet 2的登录组件中检索用户的锁定状态及解锁? ASP.NET 2.0, 想说爱你不容易 SqlDataSource WEB控件:当DeleteCommandType= 遭遇 ASP.NET ...