SQL查询优化对比实例

某银行做校园卡缴费的测试过程中,发现成功缴费时间很长,大约需要75秒左右,原因分析:在做校园卡缴费的时候,首先是从数据库中查询到需要缴费的费项,然后再对该费项进行缴费,缴费成功后修改相应的状态,交易完成后,查看日志,发现下面的查询语句执行时间很长,在数据库中执行时间大约33.782 secs.秒

低效SQL(耗时:33.782 secs.):

 代码如下 复制代码

SELECT DISTINCT hmc.bjbh,
                hmc.pxjgid,
                hmc.bjmc,
                csb.tjxbt,
                hmc.pxlx,
                hmc.bjrs,
                hmc.bjsfjs,
                csb.xzqhdm,
                hmc.shyj,
                hmc.kbrq
  FROM px_bjhmc hmc, ldlsc_xtcsb csb, px_xyhmc c
 WHERE hmc.pxjgid = csb.dwbh
   AND hmc.pxjgid = c.pxjgid

   AND hmc.shyj = '1' ---www.111cn.net
   AND hmc.bjsfjs = '1'
   AND c.pxsfjs = '1'
   AND hmc.jyrq >= '20130505000000'
   AND hmc.jyrq <= '20140102235959'
   AND hmc.pxjgid = '00000000000020'

优化方案一(耗时:6.485 secs.):

 

 代码如下 复制代码
SELECT DISTINCT hmc.bjbh,
                hmc.pxjgid,
                hmc.bjmc,
                csb.tjxbt,
                hmc.pxlx,
                hmc.bjrs,
                hmc.bjsfjs,
                csb.xzqhdm,
                hmc.shyj,
                hmc.kbrq
  FROM px_bjhmc hmc, ldlsc_xtcsb csb, px_xyhmc c
 WHERE hmc.pxjgid = csb.dwbh
   AND hmc.pxjgid = c.pxjgid
   AND csb.dwbh = c.pxjgid  ----在这里
   AND hmc.shyj = '1'
   AND hmc.bjsfjs = '1'
   AND c.pxsfjs = '1'
   AND hmc.jyrq >= '20130505000000'
   AND hmc.jyrq <= '20140102235959'
   AND hmc.pxjgid = '00000000000020'

低效SQL(耗时:33.782 secs.):

 代码如下 复制代码

SELECT DISTINCT hmc.bjbh,
                hmc.pxjgid,
                hmc.bjmc,
                csb.tjxbt,
                hmc.pxlx,
                hmc.bjrs,
                hmc.bjsfjs,
                csb.xzqhdm,
                hmc.shyj,
                hmc.kbrq
  FROM px_bjhmc hmc, ldlsc_xtcsb csb, px_xyhmc c
 WHERE hmc.pxjgid = csb.dwbh
   AND hmc.pxjgid = c.pxjgid
   AND hmc.shyj = '1'
   AND hmc.bjsfjs = '1'
   AND c.pxsfjs = '1'
   AND hmc.jyrq >= '20130505000000'
   AND hmc.jyrq <= '20140102235959'
   AND hmc.pxjgid = '00000000000020'

优化方案二(耗时:0.031 secs.):

 代码如下 复制代码

SELECT DISTINCT hmc.bjbh,
                hmc.pxjgid,
                hmc.bjmc,
                csb.tjxbt,
                hmc.pxlx,
                hmc.bjrs,
                hmc.bjsfjs,
                csb.xzqhdm,
                hmc.shyj,
                hmc.kbrq
  FROM px_bjhmc hmc, ldlsc_xtcsb csb
 WHERE hmc.pxjgid = csb.dwbh
   AND EXISTS (SELECT 1
          FROM px_xyhmc c
         WHERE hmc.pxjgid = c.pxjgid
           AND c.pxsfjs = '1')
   AND hmc.shyj = '1'
   AND hmc.bjsfjs = '1'

   AND hmc.jyrq >= '20130505000000'
   AND hmc.jyrq <= '20140102235959'
   AND hmc.pxjgid = '00000000000020'

•多表同时关联:a.id = b.id, a.id = c.id, b.id = c.id;
•多表联接查询时,联少不联多,避免笛卡尔积操作;
•当一个表仅作为检索条件时,避免联接查询,多数情况下用Exists语句进行优化;

时间: 2024-09-30 07:32:15

SQL查询优化对比实例的相关文章

php+mysql查询优化简单实例

 这篇文章主要介绍了php+mysql查询优化简单实例,分析了php+mysql程序设计中关于SQL语句优化查询的技巧,对于提高查询效率有一定参考借鉴价值,需要的朋友可以参考下     本文实例分析了php+mysql查询优化的方法.分享给大家供大家参考.具体分析如下: PHP+Mysql是一个最经常使用的黄金搭档,它们俩配合使用,能够发挥出最佳性能,当然,如果配合Apache使用,就更加Perfect了. 因此,需要做好对mysql的查询优化,下面通过一个简单的例子,展现不同的SQL语句对于查

SQL Server游标实例演示不得不看

以下的文章主要描述的是SQL Server游标实例,假如你在实际操作中遇SQL Server游标实例,但是你却不知道对其如何正确应用,那么以下的文章对你而言一定是良师益友,希望会给你带来一些帮助在此方面. SQL Server游标实例: Declare MyCusror Cursor Scroll     For Select * From Master_Goods Order By GoodsID     Open MyCursor     Fetch next From MyCursor  

SQL交叉表实例

版权声明:CSDN是本Blog托管服务提供商.如本文牵涉版权问题,CSDN不承担相关责任,请版权拥有者直接与文章作者联系解决. SQL交叉表实例 很简单的一个东西,见网上好多朋友问"怎么实现交叉表?",以下是我写的一个例子,数据库基于SQL SERVER 2000. -- ====================================================== --交叉表实例 -- ==========================================

SQL子查询实例

  SQL子查询实例介绍: 子查询是在一个查询内的查询.子查询的结果被DBMS使用来决定包含这个子查询的高级查询的结果.在子查询的最简单的形式中,子查询呈现在另一条SQL语句的WHERE或HAVING子局内. 列出其销售目标超过各个销售人员定额综合的销售点. SELECT CITY FROM OFFICES WHERE TARGET > (SELECT SUM(QUOTA) FROM SALESREPS WHERE REP_OFFICES = OFFICE) SQL子查询一般作为WHERE子句或

sql 优化 嵌套-SQL 查询优化 嵌套查询

问题描述 SQL 查询优化 嵌套查询 sql server sql如下:select *from ( select subjectCOUNT(Subject) as cout from Questions where UserID ='banianji' and AskDate>'2011-01-01' and AskDate<'2014-01-01' group by Subject ) as a where a.cout= ( select MAX(cout)from ( select s

MS SQL 能否修改实例名称

前几天研究了了一下修改数据库名称的方式后,今天突然冒出一个问题,MS SQL的命名实例是否也可以修改呢?例如下图,我在本机上安装了一个命名实例GSP,如果我想将其改为GSPS,能行吗? 如果可以,那么该怎么做呢? 该如何下手呢,真的不知道怎么做,毕竟以前都没有做过修改命令实例(当然修改计算机名称是另外一回事),先从网上搜索资料吧,结果,搜索到一堆不相关的资料,其实都不是真正的修改命名实例名称,只是修改计算机名称.不过最后搜索到一点有用的信息http://www.itpub.net/thread-

SQL Server对比两字段的相似度(函数算法)

原文:SQL Server对比两字段的相似度(函数算法) 相似度函数 概述    比较两个字段的相似度    最近有人问到关于两个字段求相似度的函数,所以就写了一篇关于相似度的函数,分别是"简单的模糊匹配","顺序匹配","一对一位置匹配".在平时的这种函数可能会需要用到,可能业务需求不一样,这里只给出参照,实际情况可以相对修改. 本文所有的两个字段比较都是除以比较字段本身,例如A与B比较,找出的长度除以A的长度,因为考虑如果A的长度大于B的长度

引用:初探Sql Server 执行计划及Sql查询优化

原文:引用:初探Sql Server 执行计划及Sql查询优化 初探Sql Server 执行计划及Sql查询优化 收藏 MSSQL优化之----探索MSSQL执行计划   作者:no_mIss   最近总想整理下对MSSQL的一些理解与感悟,却一直没有心思和时间写,晚上无事便写了一篇探索MSSQL执行计划,本文讲执行计划但不仅限于讲执行计划.   网上的SQL优化的文章实在是很多,说实在的,我也曾经到处找这样的文章,什么不要使用IN了,什么OR了,什么AND了,很多很多,还有很多人拿出仅几S甚

SQL Server 触发器实例详解_MsSql

Microsoft SQL Server 2000 提供了两种主要机制来强制业务规则和数据完整性:约束和触发器.触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 触发器对表进行插入.更新.删除的时候会自动执行的特殊存储过程.触发器一般用在check约束更加复杂的约束上面.触发器和普通的存储过程的区别是:触发器是当对某一个表进行操作.诸如:update.insert.delet