`

一个很有意义的SQL的优化过程(一个电子化支局中的大数据量的统计SQL)

SQL 
阅读更多
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秒足够!
分享到:
评论

相关推荐

    SQL语句优化手册

    综上所述,SQL语句优化是一个多方面的过程,涉及对SQL语句的定位、分析、调整等多个环节。通过合理地利用数据库管理系统提供的各种工具和技术,可以有效地提高SQL语句的执行效率,进而提升整个系统的性能。在实际...

    基于关系型数据库的SQL检索优化研究.pdf

    关系型数据库在处理SQL语句时,会生成一个HASH值,并与执行过的SQL语句进行比对,以便利用缓存区中的结果,从而减少查询时间。优化操作符的使用也是提高数据库检索效率的关键,例如减少ORDER BY运算符的使用,使用...

    基于Python实现SQL SEVER与Excel间数据的批量导出.pdf

    SQL Server与Excel之间的数据交互是一个常见且重要的操作需求,尤其是在处理大量数据时,如何高效地将SQL Server数据库中的数据导出到Excel成为了一个值得探讨的问题。 在实际应用中,虽然SQL Server自带的数据导出...

    plsql大数据量导出工具

    在Oracle数据库环境中,...综上所述,"plsql大数据量导出工具"结合了SQL*Loader、PL/SQL以及大数据处理的最佳实践,旨在提供一个高效、安全且灵活的解决方案,帮助用户在Oracle环境中轻松处理大规模数据的导出需求。

    运用Excel SQL语句处理大量会计数据.pdf

    利用Excel SQL语句则可以优化这一过程,通过编写SQL语句快速从不同工作簿中提取并汇总数据,无需重复多次复制粘贴和筛选操作,从而大幅减轻了工作量。 例如,在Excel中创建一个SQL查询以合并多个Excel文件中的销售...

    SQLSERVER表导入EXCEL 小工具

    "SQLSERVER表导入EXCEL小工具"就是这样一个实用程序,它简化了从SQL Server数据库向Excel电子表格转移数据的过程。 SQL Server是一个强大的关系数据库管理系统,广泛用于存储、管理及分析大量结构化数据。而Excel则...

    excel数据导入sql工具

    这个工具极大地简化了数据迁移过程,特别是在处理大量结构化数据时,比如进行数据分析、数据清洗或数据库更新等任务。以下是关于这个工具以及相关技术的详细解释: 1. **Excel文件格式**:Excel是Microsoft Office...

    百万级数据在Excel和Sql数据库之间相互导入、导出

    2. **SQL Server Import and Export Wizard**:SQL Server提供了一个向导,可以将数据从Excel文件导入到数据库,或者反之亦然。这个工具可以处理大量数据,但可能需要配置一些高级选项,如错误处理和数据类型映射。 ...

    数据分析实践 使用Excel和SQL进行数据分析 数据分析教程课件 数据分析实战课程 共94页.pdf

    数据分析是现代商业决策的核心工具,它利用统计分析方法对大量数据进行深入研究,提取有价值的信息并形成结论,以便解决实际问题。本课程旨在教授如何使用Excel和SQL进行数据分析,覆盖了从基础知识到实战技巧的全面...

    Excel VBA+SQL 数据管理与应用模板开发.rar

    在Excel VBA(Visual Basic for Applications)和SQL(Structured Query Language)的结合使用中,我们可以创建高效、自动化的数据管理与应用模板。这样的模板对于处理大量数据和执行复杂的计算任务非常有用,尤其在...

    导出excel.XLS表格数据到MS SQLSERVER数据库中.zip

    这个压缩包文件"导出excel.XLS表格数据到MS SQLSERVER数据库中.zip"包含了完成这一过程所需的资源,比如宏模块(Module1.bas)、表单(Form1.frm)以及一个Excel工作簿(che.xls)。下面我们将详细讲解这个过程涉及...

    Excel导入SQLserver源码_excel2sql.zip

    Excel作为常用的电子表格软件,适合处理中小规模的数据,而SQL Server则是一个强大的关系型数据库管理系统,适合存储和管理大规模数据。当我们需要将Excel中的数据导入到SQL Server时,手动操作可能会非常耗时且容易...

    sql数据库导入工具

    在导入过程中,BCP需要一个格式文件来定义数据的结构,然后将数据从文本文件批量加载到SQL Server。这种方式适用于大量数据的迁移,且速度较快,但需要对命令行操作有一定的了解。 3. OPENROWSET 和 BULK INSERT ...

    EXCEL中的SQL入门

    3. **导入数据**:编写完SQL查询后,点击“运行”或“确定”按钮,Excel会将查询结果导入为一个新的工作表。你可以选择实时刷新数据,或者手动更新,确保数据的实时性。 4. **SQL与Excel函数的结合**:虽然Excel...

    SqlServer数据导入工具

    这一工具极大地简化了数据迁移过程,对于需要频繁进行数据交换或者数据库初始化的IT工作者来说,是一个非常有价值的助手。 首先,我们来详细了解Access数据导入。Access是微软公司开发的一种关系型数据库管理系统,...

    Excel数据导入SQL工具

    Excel数据导入SQL工具是一种实用程序,它允许用户方便地将Excel电子表格中的数据批量导入到SQL数据库中。这种工具在数据分析、数据迁移或系统集成场景中非常常见,特别是在需要处理大量结构化数据时。以下是对这个...

    C#与SQL开发的电子商务系统

    在本案例中,我们使用的是SQL Server 2000,这是一个功能强大的数据库管理系统,能够支持大量并发用户和大数据量的存储。在电子商务系统中,SQL Server 2000负责存储和管理商品信息、订单数据、用户账户等关键信息,...

    在应用中浅析SQL查询的优化对比.pdf

    【SQL查询优化】SQL(Structured Query Language)是用于管理和处理关系数据库的重要工具,因其高效、灵活和非过程化的特性,在医疗、金融、电子商务等众多领域广泛应用。在日益增长的数据库规模下,SQL查询的优化至...

    excel生成sql脚本

    "Excel生成SQL脚本"这个主题涉及到如何利用Excel的功能来自动化创建SQL语句,这对于数据库管理员和数据分析师来说是一个非常实用的技巧。 首先,我们需要理解表结构说明。在“表结构说明及SQL生成文档.xls”中,...

    SQL 必知必会.pdf

    SQL 视图是一种虚拟表,它的内容是从一个或多个表的查询结果中派生出来的。视图可以简化复杂的查询操作,并且可以提高数据的安全性。 9. SQL 常见问题 9.1 inner join 和 outer join 的区别 inner join 返回两个...

Global site tag (gtag.js) - Google Analytics