程序性能优化之SQL篇

如果说功能是程序的躯体,那么性能就是程序的灵魂。完整的功能可以保证程序的躯体是健全的,而良好的性能才是程序灵魂的象征,本文就程序的性能优化做简单的介绍。

最近对程序的性能的体会尤为深刻。最近做了一个数据查询和显示的功能,从7张表大概1500条数据中查询25条数据并且显示出来,时间消耗1秒钟。我的计算机参数为:CPU:i5处理器,4G内存。这个执行速度相当的慢,好在我查询的数据量比较小,等待时间不是很多,但是程序性能优化确实刻不容缓。

仔细分析了程序,发现有很多地方都是需要修改的,我们先从数据库开始。下面先来看一段代码,这个是程序中的SQL语句:

select {0} from ((((({1} inner join {2}) inner join {3}) inner join {4}) inner join {5}) inner join {6}) inner join {7} where {8} ",
                      "lp.CnName as ProjectCityName,t.TaskName,ls.CnName as StageAreaName,tm.TaskName as TaskTemplateName,t.StartTime,t.RealStartTime,t.EndTime,t.RealEndTime,t.Executor,cc.CnName as CorporationName",
                       "[SubjectDB].[WorkPlan].[Task] as t",
                       "[SubjectDB].[WorkPlan].[Plan] as p on t.PlanCode=p.Code",
                       "[SubjectDB].[WorkPlan].[TemplateTask] as tm on t.TemplateTaskCode = tm.Code",
                        "[SubjectDB].[LandObtained].[ProjectCity] as lp on p.ProjectCityCode = lp.CityCode",
                        "[SubjectDB].[LandObtained].[StageArea] as ls on p.StageAreaCode = ls.Code",
                        "[SubjectDB].[LandObtained].[Corporation_ProjectInfo] as lcp on p.ProjectCode  = lcp.ProjectInfoCode",
                        "[SubjectDB].[Common].[Corporation] as cc on lcp.CorporationCode = cc.Code",
                        "t.RealEndTime <= '" + endTime + "'and t.RealStartTime >='" + startTime + "' and t.VersionEndTime is null and p.ProjectCityCode in ('" + strCityCodeIn + "') and t.TaskStatus = '" + taskStatusCode + "' and ( t.TaskName like " + strTaskPointNameIn + ") and t.TemplateTaskCode not in ('" + strTaskPointCodeIn + "')

分析一下这段代码,使用了6个inner
join,1个in,1个not
in,不固定数量的like(strTaskPointNameIn还附加了orlike)。首先,数据查询就很费劲,这里应该如何进行优化呢?数据库的使用在性能上有哪些需要注意的地方呢?

一   inner join,left
join ,right join

1 inner join (等值连接)返回两个表连接字段相等的记录

2 left join (左连接)返回左表中的所有记录和右表中连接字段相等的记录

3  right join (右连接)返回右表中所有记录和左表中连接字段相等的记录

如:

A表


ID1


Name1


1


a


2


a


3


a

B表


ID2


Name2


1


b


3


b


4


b

Innerjoin :

select * from A inner join B onA.ID  = B.ID

结果:


ID1


Name1


ID2


Name2


1


a


1


b


3


a


3


b

Leftjoin:

Select * from A left join B on A.ID =  B.ID

结果:


ID1


Name1


ID2


Name2


1


a


1


b


2


a


null


null


3


a


3


b

Rightjoin :

Select * from  A right join Bon A .ID  =  B.ID

结果:


ID1


Name1


ID2


Name2


1


a


1


b


3


a


3


b


null


null


4


b

这三种表连接方式,不能直接说那个性能最好,一是看功能需要,二是看具体查询语句。就上面的SQL语句和功能来看,innerjoin应该是最适合的,一是数据量较小,二是不需要多余数据。

二  in   Exists

另一个值得讨论的地方就是in和exists的使用了,这两者是在嵌套查询的时候使用的。我们先来看它们各自的查询原理。

in是把外表和内表做hash连接,exists是把外表做loop循环,每次循环再对内表进行查询,一直以来说exists比in的查询方式更快是不准确的,不同情况结果也不一样,并且如果内外表数据量相一致的情况下,两种方式效率是相同的。

现在,我们还是假设有两个表:

A表:数据量较小,B表:数据量较大。

select * from A where cc in(select  cc  from B)

效率较低,因为in连接使用外表A的cc列的索引进行loop循环,然后在B表中寻找等值记录。

select *  from A where  exists (select  cc from B where  cc = A.cc)

效率较高,因为使用了B表cc列的索引

Not   in 和  not exists

如果查询语句使用到了not    in,那么内外两张表都需要全表扫描,没有用到索引,效率较低;而not    
exists使用到了索引,所以无论哪个表大,not     exists效率较高。

暂时写到这里吧,下篇文章继续继续性能优化。

时间: 2024-12-26 18:34:51

程序性能优化之SQL篇的相关文章

SQL Server数据库性能优化之SQL语句篇(转载)

SQL Server数据库性能优化之SQL语句篇 原文地址:http://www.blogjava.net/allen-zhe/archive/2010/07/23/326927.html 期项目需要,做了一段时间的SQL Server性能优化,遇到了一些问题,也积累了一些经验,现总结一下,与君共享.SQL Server性能优化涉及到许多方面,如良好的系统和数据库设计,优质的SQL编写,合适的数据表索引设计,甚至各种硬件因素:网络性能.服务器的性能.操作系统的性能,甚至网卡.交换机等.这篇文章主

SQL Server数据库性能优化之SQL语句篇

SQL Server数据库性能优化之SQL语句篇 近期项目需要,做了一段时间的SQL Server性能优化,遇到了一些问题,也积累了一些经验,现总结一下,与君共享.SQL Server性能优化涉及到许多方面,如良好的系统和数据库设计,优质的SQL编写,合适的数据表索引设计,甚至各种硬件因素:网络性能.服务器的性能.操作系统的性能,甚至网卡.交换机等.这篇文章主要讲到如何改善SQL语句,还将有另一篇讨论如何改善索引.如何改善SQL语句的一些原则: 1. 按需索取字段,跟“SELECT *”说拜拜

SQL Server数据库性能优化之索引篇【转】

http://www.blogjava.net/allen-zhe/archive/2010/07/23/326966.html 性能优化之索引篇 近期项目需要, 做了一段时间的SQL Server性能优化,遇到了一些问题,也积累了一些经验,现总结一下,与君共享.SQL Server性能优化涉及到许多方面,如良好的系统和数据库设计,优质的SQL编写,合适的数据表索引设计,甚至各种硬件因素:网络性能.服务器的性能. 操作系统的性能,甚至网卡.交换机等.这篇文章主要讲到如何改善索引,还将有另一篇讨论

SQL Server数据库性能优化之SQL语句篇【转】

SQL Server数据库性能优化之SQL语句篇http://www.blogjava.net/allen-zhe/archive/2010/07/23/326927.html 近期项目需要, 做了一段时间的SQL Server性能优化,遇到了一些问题,也积累了一些经验,现总结一下,与君共享.SQL Server性能优化涉及到许多方面,如良好的系统和数据库设计,优质的SQL编写,合适的数据表索引设计,甚至各种硬件因素:网络性能.服务器的性能. 操作系统的性能,甚至网卡.交换机等.这篇文章主要讲到

数据仓库中的 SQL 性能优化(Hive篇)

一个Hive查询生成多个map reduce job,一个map reduce job又有map,reduce,spill,shuffle,sort等多个阶段,所以针对hive查询的优化可以大致分为针对MR中单个步骤的优化(其中又会有细分),针对MR全局的优化,和针对整个查询(多MR job)的优化,下文会分别阐述. 在开始之前,先把MR的流程图帖出来(摘自Hadoop权威指南),方便后面对照.另外要说明的是,这个优化只是针对Hive 0.9版本,而不是后来Hortonwork发起Stinger

Spark性能优化指南——高级篇

Spark性能优化指南--高级篇 [TOC] 前言 继基础篇讲解了每个Spark开发人员都必须熟知的开发调优与资源调优之后,本文作为<Spark性能优化指南>的高级篇,将深入分析数据倾斜调优与shuffle调优,以解决更加棘手的性能问题. 数据倾斜调优 调优概述 有的时候,我们可能会遇到大数据计算中一个最棘手的问题--数据倾斜,此时Spark作业的性能会比期望差很多.数据倾斜调优,就是使用各种技术方案解决不同类型的数据倾斜问题,以保证Spark作业的性能. 数据倾斜发生时的现象 绝大多数tas

Spark性能优化指南——基础篇

前言 在大数据计算领域,Spark已经成为了越来越流行.越来越受欢迎的计算平台之一.Spark的功能涵盖了大数据领域的离线批处理.SQL类处理.流式/实时计算.机器学习.图计算等各种不同类型的计算操作,应用范围与前景非常广泛.在美团•大众点评,已经有很多同学在各种项目中尝试使用Spark.大多数同学(包括笔者在内),最初开始尝试使用Spark的原因很简单,主要就是为了让大数据计算作业的执行速度更快.性能更高. 然而,通过Spark开发出高性能的大数据计算作业,并不是那么简单的.如果没有对Spar

Java程序性能优化——性能调优层次

为了提升系统性能,开发人员可以从系统的各个角度和层次对系统进行优化.除了最常见的代码优化外,在软件架构上.JVM虚拟机层.数据库以及操作系统层都可以通过各种手段进行调优,从而在整体上提升系统的性能. 设计调优 设计调优处于所有调优手段的上层,它往往需要在软件开发之前进行.在软件开发之初,软件架构师就应该评估系统可能存在的各种潜在的问题,并给出合理的设计方案.由于软件设计和架构对软件整体有决定性的影响,所以,设计调优对系统性能的影响也是最大的.如果说,代码优化.JVM优化都是对系统微观层面上"量&

Java程序性能优化技巧

多线程.集合.网络编程.内存优化.缓冲..spring.设计模式.软件工程.编程思想 1.生成对象时,合理分配空间和大小new ArrayList(100); 2.优化for循环Vector vect = new Vector(1000);for( inti=0; i<vect.size(); i++){ ...}for循环部分改写成:int size = vect.size();for( int i=0; i>size; i++){ ...} 如果size=1000,就可以减少1000次si