sql语句优化(一)

来源:互联网 发布:热云数据 编辑:程序博客网 时间:2024/04/26 08:28

       还记中学的时的一首诗中说:毕竟西湖六月中,风光不与四时同。真的与专业有关吧,对文字或多或少的敏感。开始言归正传,六月的西湖中荡漾着航行的小船,做一个项目对数据查询要求相对比较高的项目。 

       此次讨论的数据库sql也便是基于这个源头,在项目中听到比较多的查询速度慢,做压力测试几万数据就要开始崩溃。这样是必用户体验会不好对吧,也是程序不能接受的事情,那么我们就会想到要去优化。

       关于数据库、sql的优化,大家想到有几种方法呢?这里,小编提供三个思路,不全面相信大家还会有更好的。

       思路:1)sql语句中不要出现*,除非有特殊的需求,用?代替字符串拼接;

                 2)建分区;

                 3)建索引。

       下面呢,小编和大家一起看看基于Oracle数据库“用?代替字符串拼接”为什么能提高查询效率?

        首先,我们知道sql执行的过程:语法检查、分析、执行、返回结果。任何在应用程序把查询sql发送到服务器端,服务器在接收到sql之后不会马上去数据库查询,而是在在数据库的缓存中是否有相应的执行计划,如果有则直接用编译好的sql执行,这样就节省了编译时间。

        由此,我们也引进两个概念,sql的解析中的硬解析和软解析。硬解析:是指对应用程序传到服务器的sql进行语法、语义、权限等方面的分析;软解析:简单地说SQL语句存在于librarycache中,可以直接用,不需要硬解析。

     这样,我们就比较好分析用?代替字符串拼接”为什么能提高查询效率。

<pre name="code" class="sql">select a from Table where ID = '" + id +"'select a from Table where ID = ‘123’select a from Table where ID = ‘456’

    大家可以看到上面一条sql用字符串方式拼接,接下来时两个不同参数的两条sql语句,对Oracle数据库来说,这次两条完全不同sql,都需要进行硬解析,这样只要参数不同都要硬解析一次必然会影响效率。因为oracle会根据sql语句的文本去计算每个字符在内存里的hash值,因此虽然上述两条SQL只有一个字符不一样,oracle根据hash算法在内存中得到的hash地址就不一样,所以oracle就会认为这是两条完全不同的语句。
Select a from Table where ID = ?service.excuteQuery(sql.toString(), new Object[]{ID });
    然而,如果是用"?"代替参数位,用传参的方式写sql的话,sql只需要硬解析一次,这样能在一定程度上提高查询的效率,特别是当参数比较多的时候。

    sql的优化,对IT职业要说很普遍,与大家一起学习。

0 0
原创粉丝点击