sql优化方案讲解

合集下载

复杂sql优化的方法及思路

复杂sql优化的方法及思路

复杂sql优化的方法及思路复杂SQL优化的方法及思路在实际的开发中,我们经常会遇到需要处理大量数据的情况,而这些数据往往需要通过SQL语句进行查询、统计、分析等操作。

然而,当数据量变得越来越大时,SQL语句的执行效率也会变得越来越低,这时就需要进行SQL优化来提高查询效率。

下面介绍一些复杂SQL 优化的方法及思路。

1. 索引优化索引是提高SQL查询效率的重要手段之一。

在使用索引时,需要注意以下几点:(1)选择合适的索引类型:根据查询条件的特点选择合适的索引类型,如B-Tree索引、Hash索引、全文索引等。

(2)避免过多的索引:过多的索引会降低SQL语句的执行效率,因为每个索引都需要占用一定的存储空间,并且在更新数据时需要维护索引。

(3)避免使用不必要的索引:有些查询条件并不需要使用索引,因此在编写SQL语句时需要避免使用不必要的索引。

2. SQL语句优化SQL语句的优化是提高查询效率的关键。

在编写SQL语句时,需要注意以下几点:(1)避免使用子查询:子查询会增加SQL语句的复杂度,降低查询效率。

可以使用JOIN语句代替子查询。

(2)避免使用OR操作符:OR操作符会使SQL语句的执行计划变得复杂,降低查询效率。

可以使用UNION操作符代替OR操作符。

(3)避免使用LIKE操作符:LIKE操作符会使SQL语句的执行计划变得复杂,降低查询效率。

可以使用全文索引代替LIKE操作符。

3. 数据库结构优化数据库结构的优化也是提高查询效率的重要手段之一。

在设计数据库结构时,需要注意以下几点:(1)避免使用过多的表:过多的表会增加SQL语句的复杂度,降低查询效率。

可以使用视图代替多个表。

(2)避免使用过多的字段:过多的字段会增加SQL语句的复杂度,降低查询效率。

可以使用分表代替过多的字段。

(3)避免使用过多的关联:过多的关联会增加SQL语句的复杂度,降低查询效率。

可以使用冗余字段代替过多的关联。

复杂SQL优化需要从索引优化、SQL语句优化和数据库结构优化三个方面入手,通过合理的优化手段提高查询效率,从而提高系统的性能和稳定性。

sqldistinct详解以及优化

sqldistinct详解以及优化

sqldistinct详解以及优化⼀.distinct简介distinct这个关键字来过滤掉多余的重复记录只保留⼀条,但往往只⽤它来返回不重复记录的条数,⽽不是⽤它来返回不重记录的所有值。

其原因是distinct只有⽤⼆重循环查询来解决,⽽这样对于⼀个数据量⾮常⼤的站来说,⽆疑是会直接影响到效率的。

下⾯先来看看例⼦:table表字段1 字段2id name1 a2 b3 c4 c5 b库结构⼤概这样,这只是⼀个简单的例⼦,实际情况会复杂得多。

⽐如我想⽤⼀条语句查询得到name不重复的所有数据,那就必须使⽤distinct去掉多余的重复记录。

select distinct name from table得到的结果是:----------nameabc好像达到效果了,可是,我想要得到的是id值呢?改⼀下查询语句吧:select distinct name, id from table结果会是:----------id name1 a2 b3 c4 c5 bdistinct怎么没起作⽤?作⽤是起了的,不过他同时作⽤了两个字段,也就是必须得id与name都相同的才会被排除。

我们再改改查询语句:select id, distinct name from table很遗憾,除了错误信息你什么也得不到,distinct必须放在开头。

难到不能把distinct放到where条件⾥?能,照样报错。

下⾯⽅法可⾏:select *, count(distinct name) from table group by name结果:id name count(distinct name)1 a 12 b 13 c 1最后⼀项是多余的,不⽤管就⾏了,⽬的达到。

group by 必须放在 order by 和 limit之前,不然会报错==============以上是关于的distinct的⼀种⽤法==============⽤distinct关键字只能过滤查询字段中所有记录相同的(记录集相同),⽽如果要指定⼀个字段却没有效果,另外distinct关键字会排序,效率很低。

oracle sql 优化技巧

oracle sql 优化技巧

oracle sql 优化技巧(实用版3篇)目录(篇1)1.Oracle SQL 简介2.优化技巧2.1 减少访问数据库次数2.2 选择最有效率的表名顺序2.3 避免使用 SELECT2.4 利用 DECODE 函数2.5 设置 ARRAYSIZE 参数2.6 使用 TRUNCATE 替代 DELETE2.7 多使用 COMMIT 命令2.8 合理使用索引正文(篇1)Oracle SQL 是一款广泛应用于各类大、中、小微机环境的高效、可靠的关系数据库管理系统。

为了提高 Oracle SQL 的性能,本文将为您介绍一些优化技巧。

首先,减少访问数据库的次数是最基本的优化方法。

Oracle 在内部执行了许多工作,如解析 SQL 语句、估算索引的利用率、读数据块等,这些都会大量耗费 Oracle 数据库的运行。

因此,尽量减少访问数据库的次数,可以有效提高系统性能。

其次,选择最有效率的表名顺序也可以明显提升 Oracle 的性能。

Oracle 解析器是按照从右到左的顺序处理 FROM 子句中的表名,因此,合理安排表名顺序,可以减少解析时间,提高查询效率。

在执行 SELECT 子句时,应尽量避免使用,因为 Oracle 在解析的过程中,会将依次转换成列名,这是通过查询数据字典完成的,耗费时间较长。

DECODE 函数也是一个很好的优化工具,它可以避免重复扫描相同记录,或者重复连接相同的表,提高查询效率。

在 SQLPlus 和 SQLForms 以及 ProC 中,可以重新设置 ARRAYSIZE 参数。

该参数可以明显增加每次数据库访问时的检索数据量,从而提高系统性能。

建议将该参数设置为 200。

当需要删除数据时,尽量使用 TRUNCATE 语句替代 DELETE 语句。

执行 TRUNCATE 命令时,回滚段不会存放任何可被恢复的信息,所有数据不能被恢复。

因此,TRUNCATE 命令执行时间短,且资源消耗少。

在使用 Oracle 时,尽量多使用 COMMIT 命令。

如何进行SQL调优

如何进行SQL调优

如何进行SQL调优SQL调优是优化数据库性能的一个重要步骤。

通常情况下,优化SQL查询的效率会使整个系统的性能得到提升。

在这篇文章中,我们将探讨如何进行SQL调优。

一、分析SQL语句首先,我们需要分析SQL查询语句。

如果SQL查询不正确或不充分,则不可能实现有效的调优。

我们需要了解查询的目的、查询的表、所需的数据以及查询的条件等等。

在分析查询语句时,我们需要关注以下几个方面:1.查询完成的时间是否满足需求;2.过滤条件是否合适;3.表之间的关系是否正确;4.是否使用了合适的索引;5.查询中使用了哪些函数;6.是否将复杂的查询分解为简单的查询;7.是否存在重复数据;8.是否使用了动态语句。

二、优化数据表结构第二个优化策略是优化数据表结构。

优化数据表结构可以使查询更快并减少查询时间。

以下是一些优化数据表结构的建议:1.将表拆分为更小的表;2.对于大型的表,可以使查询更快,更好地维护和管理;3.添加数据到表中时,使用批量插入而不是单独插入;4.为表的主键添加索引;5.使用适当的数据类型;6.删除不必要的列;7.标准化表设计。

三、使用优化查询技术第三个优化策略是使用优化查询技术。

以下是一些优化查询技术的建议:1.使用预编译语句;2.使用存储过程;3.将大的表拆分为小表;4.优化查询过程中使用的函数;5.范围查询的优化技术;6.优化复杂查询;7.熟悉查询缓存的工作原理;8.使用正确的JOIN语句。

四、使用合适的索引使用合适的索引是第四个优化策略。

索引是用于查找表中数据的一种结构。

以下是一些使用索引的建议:1.只有在需要时才使用索引;2.使用准确性为索引提供数据;3.使用索引可以使查询更快,但也会增加插入和修改的时间;4.对于大型表,使用索引可以显著提高性能;5.使用覆盖索引;6.避免使用不规范的索引;7.使用联合索引;8.使用优化查询缓存。

五、优化数据库服务器优化数据库服务器是第五个优化策略。

以下是一些优化服务器的建议:1.选择正确的硬件;2.选择正确的操作系统;3.使用正确的配置参数;4.配置正确的缓存大小;5.使用内存表代替磁盘表;6.合理设置自动增量字段;7.优化写和读的优化区域;8.备份和压缩数据。

SQL优化工具及使用技巧介绍

SQL优化工具及使用技巧介绍

SQL优化工具及使用技巧介绍SQL(Structured Query Language)是一种用于管理和操作关系型数据库的编程语言。

它可以让我们通过向数据库服务器发送命令来实现数据的增删改查等操作。

然而,随着业务的发展和数据量的增长,SQL查询的性能可能会受到影响。

为了提高SQL查询的效率,出现了许多SQL优化工具。

本文将介绍一些常见的SQL优化工具及其使用技巧。

一、数据库性能优化工具1. Explain PlanExplain Plan是Oracle数据库提供的一种SQL优化工具,它可以帮助分析和优化SQL语句的执行计划。

通过使用Explain Plan命令,我们可以查看SQL查询的执行计划,了解SQL语句是如何被执行的,从而找到性能瓶颈并进行优化。

2. SQL Server ProfilerSQL Server Profiler是微软SQL Server数据库管理系统的一种性能监视工具。

它可以捕获和分析SQL Server数据库中的各种事件和耗时操作,如查询语句和存储过程的执行情况等。

通过使用SQL Server Profiler,我们可以找到数据库的性能瓶颈,并进行相应的优化。

3. MySQL Performance SchemaMySQL Performance Schema是MySQL数据库提供的一种性能监视工具。

它可以捕获和分析MySQL数据库中的各种事件和操作,如查询语句的执行情况、锁的状态等。

通过使用MySQL Performance Schema,我们可以深入了解数据库的性能问题,并对其进行优化。

二、SQL优化技巧1. 使用索引索引是提高SQL查询性能的重要手段之一。

在数据库中创建合适的索引可以加快查询操作的速度。

通常,我们可以根据查询条件中经常使用的字段来创建索引。

同时,还应注意索引的维护和更新,避免过多或过少的索引对性能产生负面影响。

2. 避免全表扫描全表扫描是指对整个表进行扫描,如果表中数据量较大,查询性能会受到较大影响。

sql千万级数据量优化方案

sql千万级数据量优化方案

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:select id from t where num=03.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。

4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num=10 or num=20可以这样查询:select id from t where num=10union allselect id from t where num=205.in 和 not in 也要慎用,否则会导致全表扫描,如:select id from t where num in(1,2,3)对于连续的数值,能用 between 就不要用 in 了:select id from t where num between 1 and 36.下面的查询也将导致全表扫描:select id from t where name like '%abc%'若要提高效率,可以考虑全文检索。

7.如果在 where 子句中使用参数,也会导致全表扫描。

因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。

然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。

如下面语句将进行全表扫描:select id from t where num=@num <mailto:num=@num>可以改为强制查询使用索引:select id from t with(index(索引名)) where num=@num <mailto:num=@num>8.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。

通过分析SQL语句的执行计划优化SQL

通过分析SQL语句的执行计划优化SQL

通过分析SQL语句的执行计划优化SQL
1.确定问题SQL:首先要确定哪个SQL语句是需要优化的,可以根据
数据库性能监控或慢查询日志等方式来定位。

2.分析执行计划:执行计划是数据库查询优化的关键,通过分析执行
计划可以了解SQL查询使用的索引、连接方式、数据访问路径等重要信息。

3.选择合适的索引:根据执行计划中的信息,考虑是否需要添加或修
改索引。

适当的索引可以大大提高查询性能,但是过多或不合适的索引也
会拖慢性能。

4.避免全表扫描:全表扫描是非常低效的操作,可以通过添加合适的
索引来避免全表扫描,或者优化查询条件使得数据库可以利用索引进行查询。

5.利用查询缓存:数据库中可能存在查询缓存,可以将频繁查询的SQL语句缓存起来,提高查询性能。

6.合理使用子查询:子查询可以增加数据访问的复杂性,需要谨慎使用。

可以重写SQL语句,将子查询转换为连接查询或者使用临时表等方式
避免子查询的使用。

7.调整SQL语句的顺序:在复杂的SQL语句中,表的连接顺序会影响
查询性能。

可以通过调整表的连接顺序,使得执行计划更为高效。

8.数据库优化:除了优化SQL语句,还可以从数据库本身进行优化,
比如调整数据库的参数配置,增加硬件资源等方式来提高数据库性能。

总之,通过分析SQL语句的执行计划,结合合适的索引和优化技巧,
可以大大提高SQL查询的性能。

大数据量数据库设计与优化方案(SQL优化)

大数据量数据库设计与优化方案(SQL优化)

⼤数据量数据库设计与优化⽅案(SQL优化)⼀、数据库结构的设计如果不能设计⼀个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,⽽且将会影响系统实际运⾏的性能。

所以,在⼀个系统开始实施之前,完备的数据库模型的设计是必须的。

在⼀个系统分析、设计阶段,因为数据量较⼩,负荷较低。

我们往往只注意到功能的实现,⽽很难注意到性能的薄弱之处,等到系统投⼊实际运⾏⼀段时间后,才发现系统的性能在降低,这时再来考虑提⾼系统性能则要花费更多的⼈⼒物⼒,⽽整个系统也不可避免的形成了⼀个打补丁⼯程。

所以在考虑整个系统的流程的时候,我们必须要考虑,在⾼并发⼤数据量的访问情况下,我们的系统会不会出现极端的情况。

(例:对外统计系统在7⽉16⽇出现的数据异常的情况,并发⼤数据量的的访问造成,数据库的响应时间不能跟上数据刷新的速度造成。

具体情况是:在⽇期临界时(00:00:00),判断数据库中是否有当前⽇期的记录,没有则插⼊⼀条当前⽇期的记录。

在低并发访问的情况下,不会发⽣问题,但是当⽇期临界时的访问量相当⼤的时候,在做这⼀判断的时候,会出现多次条件成⽴,则数据库⾥会被插⼊多条当前⽇期的记录,从⽽造成数据错误),数据库的模型确定下来之后,我们有必要做⼀个系统内数据流向图,分析可能出现的瓶颈。

为了保证数据库的⼀致性和完整性,在逻辑设计的时候往往会设计过多的表间关联,尽可能的降低数据的冗余。

(例:⽤户表的地区,我们可以把地区另外存放到⼀个地区表中)如果数据冗余低,数据的完整性容易得到保证,提⾼了数据吞吐速度,保证了数据的完整性,清楚地表达数据元素之间的关系。

⽽对于多表之间的关联查询(尤其是⼤数据表)时,其性能将会降低,同时也提⾼了客户端程序的编程难度,因此,物理设计需折衷考虑,根据业务规则,确定对关联表的数据量⼤⼩、数据项的访问频度,对此类数据表频繁的关联查询应适当提⾼数据冗余设计但增加了表间连接查询的操作,也使得程序的变得复杂,为了提⾼系统的响应时间,合理的数据冗余也是必要的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Sql优化方案一.数据库优化技术1.索引(强烈建议使用)1.1优点创建索引可以大大提高系统的性能。

第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。

第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。

第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

1.2 缺点第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。

第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。

第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

1.3 使用准则索引是建立在数据库表中的某些列的上面。

因此,在创建索引的时候,应该仔细考虑在哪些列上可以创建索引,在哪些列上不能创建索引。

一般来说,应该在这些列上创建索引。

第一,在经常需要搜索的列上,可以加快搜索的速度;第二,在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;第三,在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;第四,在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;第五,在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;第六,在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。

同样,对于有些列不应该创建索引。

一般来说,不应该创建索引的的这些列具有下列特点:第一,对于那些在查询中很少使用或者参考的列不应该创建索引。

这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。

相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。

第二,对于那些只有很少数据值的列也不应该增加索引。

这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。

增加索引,并不能明显加快检索速度。

第三,对于那些定义为text, image和bit数据类型的列不应该增加索引。

这是因为,这些列的数据量要么相当大,要么取值很少。

第四,当修改性能远远大于检索性能时,不应该创建索引。

这是因为,修改性能和检索性能是互相矛盾的。

当增加索引时,会提高检索性能,但是会降低修改性能。

当减少索引时,会提高修改性能,降低检索性能。

因此,当修改性能远远大于检索性能时,不应该创建索引。

1.4 总结1)索引提高了数据库的检索性能,但一定程度上牺牲了修改性能。

因此适用于“多查询少修改”(insert,update,delete)的表。

2)对此类表中的外键,需要分组,排序或作为检索条件的字段建立索引3)对此类表中查询使用少,字段取值少,字段数据量大的不应创建索引2.数据库设计标准化2.1 标准化标准化是在数据库中组织数据的过程。

其中包括,根据设计规则创建表并在这些表间建立关系。

标准化的特点:1)所有的“对象”都在它自己的table中,没有冗余。

2)简洁,更新属性通常只需要更新很少的记录。

3)Join操作比较耗时。

4)Select,sort优化措施比较少。

6)适用于OLTP应用(实时的增删改查系统)。

2.2 非标准化1) 在一张表中存储很多数据,数据冗余。

2) 更新数据开销很大,更新一个属性可能会更新很多表,很多记录。

3) 在删除数据是有可能丢失数据。

4) Select,order有很多优化的选择。

5) 适用于DSS应用。

2.3 总结标准化适用于“多修改少查询”的表。

提升了修改性能,但查询时通常需要join链接,检索慢非标准化适用于“少修改多查询”的表。

减少了join链接,提升了检索性能,但修改代价大。

(或者说放弃数据一致性,仅修改主表?)3.数据类型最基本的优化之一就是使表在磁盘上占据的空间尽可能小。

这能带来性能非常大的提升,因为数据小,磁盘读入较快,并且在查询过程中表内容被处理所占用的内存更少。

同时,在更小的列上建索引,索引也会占用更少的资源。

可以使用下面的技术可以使表的性能更好并且使存储空间最小:1) 使用正确合适的类型,不要将数字存储为字符串。

2) 尽可能地使用最有效(最小)的数据类型。

MySQL有很多节省磁盘空间和内存的专业化类型。

3) 尽可能使用较小的整数类型使表更小。

例如,MEDIUMINT经常比INT好一些,因为MEDIUMINT列使用的空间要少25%。

4) 如果可能,声明列为NOT NULL。

它使任何事情更快而且每列可以节省一位。

注意如果在应用程序中确实需要NULL,应该毫无疑问使用它,只是避免默认地在所有列上有它。

5) 对于MyISAM表,如果没有任何变长列(VARCHAR、TEXT或BLOB列),使用固定尺寸的记录格式。

这比较快但是不幸地可能会浪费一些空间。

即使你已经用CREATE选项让VARCHAR列ROW_FORMAT=fixed,也可以提示想使用固定长度的行。

6) 使用sample character set,例如latin1。

尽量少使用utf-8,因为utf-8占用的空间是latin1的3倍。

可以在不需要使用utf-8的字段上面使用latin1,例如mail,url等。

4.存储引擎4.1 MyISAM特点1) 不支持事务,宕机会破坏表2) 使用较小的内存和磁盘空间3) 基于表的锁,并发更新数据会出现严重性能问题4) MySQL只缓存Index,数据由OS缓存4.2 InnoDB特点1) 支持事务,ACID,外键。

2) Row level locks。

3) 支持不同的隔离级别。

4) 和MyISAM相比需要较多的内存和磁盘空间。

5) 没有键压缩。

6) 数据和索引都缓存在内存hash表中。

总结MyISAM 适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好。

因为写操作会使整个表被锁起来,而别的进程,就算是读进程都无法操作直到写操作完成。

另外,MyISAM 对于SELECT COUNT(*) 这类的计算是超快无比的。

InnoDB 的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比MyISAM 还慢。

他是它支持“行锁” ,于是在写操作比较多的时候,会更优秀。

并且,他还支持更多的高级应用,比如:事务。

5.数据库服务器缓存大多数的MySQL服务器都开启了查询缓存。

这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的。

当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个缓存中,这样,后续的相同的查询就不用操作表而直接访问缓存结果了。

但是注意对于CURDATE(),NOW() 和 RAND()或是其它的诸如此类的SQL函数都不会开启查询缓存,因为这些函数的返回是会不定的易变的。

开启方法:检测是否开启成功6.字符集使用sample character set,例如latin1。

尽量少使用utf-8,因为utf-8占用的空间是latin1的3倍。

可以在不需要使用utf-8的字段上面使用latin1,例如mail,url等。

这种优化的基本思想是:从磁盘到内存的io是数据库查询最为耗时的操作之一,通过压缩数据存储,减少读入内存的数据量,从而提高检索性能。

注意事项:SHOW VARIABLES LIKE 'character%'SHOW VARIABLES LIKE 'collation_%';a、要保证数据库中存的数据与数据库编码一致,即数据编码与character_set_database一致;b、要保证通讯的字符集与数据库的字符集一致,即character_set_client, character_set_connection与character_set_database一致;c、要保证SELECT的返回与程序的编码一致,即character_set_results与程序编码一致;d、要保证程序编码与浏览器、终端编码一致7.存储过程优点:(1)减少网络通信量。

调用一个行数不多的存储过程与直接调用SQL语句的网络通信量可能不会有很大的差别,可是如果存储过程包含上百行SQL语句,那么其性能绝对比一条一条的调用SQL语句要高得多。

(2)执行速度更快。

有两个原因:首先,在存储过程创建的时候,数据库已经对其进行了一次解析和优化。

其次,存储过程一旦执行,在内存中就会保留一份这个存储过程,这样下次再执行同样的存储过程时,可以从内存中直接调用。

(3)更强的适应性:由于存储过程对数据库的访问是通过存储过程来进行的,因此数据库开发人员可以在不改动存储过程接口的情况下对数据库进行任何改动,而这些改动不会对应用程序造成影响。

(4).安全性高,可设定只有某此用户才具有对指定存储过程的使用权。

缺点:1. 运行速度:大多数高级的数据库系统都有statement cache的,所以编译sql的花费没什么影响。

但是执行存储过程要比直接执行sql花费更多(检查权限等),所以对于很简单的sql,存储过程没有什么优势。

2. 网络负荷:如果在存储过程中没有多次数据交互,那么实际上网络传输量和直接sql是一样的。

3. 团队开发:很遗憾,比起成熟的IDE,没有什么很好存储过程的IDE工具来支持,也就是说,这些必须手工完成。

4. 安全机制:对于传统的C/S结构,连接数据库的用户可以不同,所以安全机制有用;但是在web的三层架构中,数据库用户不是给用户用的,所以基本上,只有一个用户,拥有所有权限(最多还有一个开发用户)。

这个时候,安全机制有点多余。

5. 用户满意:实际上这个只是要将访问数据库的接口统一,是用存储过程,还是EJB,没太大关系,也就是说,在三层结构中,单独设计出一个数据访问层,同样能实现这个目标。

6. 开发调试:一样由于IDE的问题,存储过程的开发调试要比一般程序困难(老版本DB2还只能用C写存储过程,更是一个灾难)。

7. 移植性:算了,这个不用提,反正一般的应用总是绑定某个数据库的,不然就无法靠优化数据库访问来提高性能了。

8. 维护性:的确,存储过程有些时候比程序容易维护,这是因为可以实时更新DB端的存储过程,但是在3层结构下,更新server端的数据访问层一样能实现这个目标,可惜现在很多平台不支持实时更新而已。

总结:所有数据访问在应用层封装为数据访问层,在那里,如果SQL简单的话,直接用SQL;如果SQL复杂,或者数据交互多且中间数据最后不会用到,使用存储过程。

8.视图简单性。

相关文档
最新文档