文章编号:10878时间:2024-09-29人气:
优化存储过程语法是提高数据库应用程序性能和效率的关键。遵循以下最佳实践,可以帮助您编写高性能的存储过程。
参数化查询可以显著提高性能,因为它可以防止 SQL 注入攻击,并避免不必要的查询计划重新编译。使用问号 (?) 作为参数占位符,而不是字符串连接。
-- 使用字符串连接SELECT FROM table WHERE name = 'John';-- 使用参数化查询SELECT FROM table WHERE name = ?;
游标是一种遍历查询结果集的机制。它们比其他方法效率较低,因为它们需要额外的内存和处理开销。尽可能使用基于集的操作(例如连接和子查询)代替游标。
-- 使用游标DECLARE cursor_name CURSOR FORSELECT FROM table;OPEN cursor_name;FETCH NEXT FROM cursor_name INTO @name;-- 使用基于集的操作SELECT name FROM table WHERE condition;
查询计划是优化器用于执行查询的步骤序列。缓存查询计划可以消除优化器在每次执行查询时重新编译它的需要,从而提高性能。
SET OPTIMIZER_MODE = 'ON';
临时表存储临时数据,可以在查询期间使用。它们可以提高性能,因为它们可以避免对同一数据集执行多次查询。但是,临时表会消耗内存,因此请谨慎使用。
CREATE TEMPORARY TABLE temp_table AS
10. 测试并调整
在生产环境中部署存储过程之前,对其进行彻底测试并进行性能调整至关重要。使用性能分析工具(例如 SQL Profiler)识别瓶颈并应用优化。
遵循这些最佳实践可以帮助您编写高性能的存储过程,从而提高数据库应用程序的整体性能和效率。
1.当我们请求mysql服务器的时候,MySQL前端会有一个监听,请求到了之后,服务器得到相关的SQL语句,执行之前(虚线部分为执行),还会做权限的判断2.通过权限之后,SQL就到MySQL内部,他会在查询缓存中,看该SQL有没有执行过,如果有查询过,则把缓存结果返回,说明在MySQL内部,也有一个查询缓存.但是这个查询缓存,默认是不开启的,这个查询缓存,和我们的Hibernate,Mybatis的查询缓存是一样的,因为查询缓存要求SQL和参数都要一样,所以这个命中率是非常低的(没什么卵用的意思)。 3.如果我们没有开启查询缓存,或者缓存中没有找到对应的结果,那么就到了解析器,解析器主要对SQL语法进行解析4.解析结束后就变成一颗解析树,这个解析树其实在Hibernate里面也是有的,大家回忆一下,在以前做过Hibernate项目的时候,是不是有个一个。 这个就是专门做语法解析的工具.因为在Hibernate里面有HQL,它就是通过这个工具转换成SQL的,我们编程语言之所以有很多规范、语法,其实就是为了便于这个解析器解析,这个学过编译原理的应该知道.5.得到解析树之后,不能马上执行,这还需要对这棵树进行预处理,也就是说,这棵树,我没有经过任何优化的树,预处理器会这这棵树进行一些预处理,比如常量放在什么地方,如果有计算的东西,把计算的结果算出来等等...6.预处理完毕之后,此时得到一棵比较规范的树,这棵树就是要拿去马上做执行的树,比起之前的那棵树,这棵得到了一些优化7.查询优化器,是MySQL里面最关键的东西,我们写任何一条SQL,比如SELECT * FROM USER WHERE USERNAME = toby AND PASSWORD = 1,它会怎么去执行?它是先执行username = toby还是password = 1?每一条SQL的执行顺序查询优化器就是根据MySQL对数据统计表的一些信息,比如索引,比如表一共有多少数据,MySQL都是有缓存起来的,在真正执行SQL之前,他会根据自己的这些数据,进行一个综合的判定,判断这一次在多种执行方式里面,到底选哪一种执行方式,可能运行的最快.这一步是MySQL性能中,最关键的核心点,也是我们的优化原则.我们平时所讲的优化SQL,其实说白了,就是想让查询优化器,按照我们的想法,帮我们选择最优的执行方案,因为我们比MySQL更懂我们的数据看数据,仅仅只是自己收集到的信息,这些信息可能是不准确的,MySQL根据这些信息选了一个它自认为最优的方案,但是这个方案可能和我们想象的不一样.8.这里的查询执行计划,也就是MySQL查询中的执行计划,比如要先执行username = toby还是password = 19.这个执行计划会传给查询执行引擎,执行引擎选择存储引擎来执行这一份传过来的计划,到磁盘中的文件中去查询,这个时候重点来了,影响这个查询性能最根本的原因是什么?就是硬盘的机械运动,也就是我们平时熟悉的IO,所以一条查询语句是快还是慢,就是根据这个时间的IO来确定的.那怎么执行IO又是什么来确定的?就是传过来的这一份执行计划.(优化就是制定一个我们认为最快的执行方案,最节省IO,和执行最快)10.如果开了查询缓存,则返回结果给客户端,并且查询缓存也放一份。
这个应该不会太慢吧,我建议你看一下,你是不是循环做了太多次的插入/更新操作。 mysql默认的配置中,每次事务提交都要写binlog和redo log,如果循环太多次——比如循环插入10w条记录——就会非常慢。 一般优化思路分两种:1 修改 sync_binlog为一个100-1000间的值,让binlog每隔100-1000个事务后再写一次;修改innodb_flush_log_at_trx_commit =2; 这么搞的好处是降低了写log的次数和消耗的时间,缺点是,中间出错的话,会丢失一部分的binlog和redolog导致无法通过他们来在出问题是恢复生产库数据。 2 将所有的插入/更新操作放到一个事务中进行。 这样,显然就只需要一次写binlong和redolog咯。
存储过程主要是把一组SQL语句和控制语句组成起来,然后封装在一起的过程,它驻留在数据库中,可以被客户应用程序调用,也可以从另一个存储过程或触发器调用。 创建的过程只需一次性将其存储在数据库中,便可以在应用程序中调用该存储过程。 它可以把数据库主要的关联性的业务通过SQL语句有效的组织在一起,也有着大量的语法结构,类似于编程语言相关的严谨性,一般由专门的数据库设计人员去编写。 高效的执行速度存储过程是对SQL语句进行编译性的存储,要比Transact-SQL 批代码的执行更快,存储过程在创建的时候就需要对其进行分析和优化,并可在首次执行该过程后使用该过程的内存中版本。 每次运行Transact-SQL 语句时,都要从客户端重复发送,并且在SQL Server每次执行这些语句时,都要对其进行编译和优化,而存储过程就节省了编译的时间。 减少网络的通信流量如果存储过程只需要一个简单的查询,可能是体现不出网络的通信流量,而如果有一个数百行的Transact-SQL语句的代码的操作由一个存储过就可以实现, 就不需要在网络中发送数百行的代码,减少网络的通信流量,增加了一些不必要的网络负载。 方便的管理与部署现在流行的开发语言都是编译性的,如JAVA或,如果SQL语句写在程序中,对这些数据的业务进行修改的时候,我们就会对其重新编译,然后再部署到服务器上,有时甚至会影响了应用程序其它功能的模块,而用存储过程方式实现,就不需要对应用程序进行重编译,修改存储过程就可以直接实现了。 它采用一种分布式的工作方式,应用程序和数据库的编码工作可以独立的进行,而不会相互影响。 提供了更安全的实现机制系统管理员通过对执行某一存储过程的权限进行限制,从而能够实现对相应的数据访问权限的限制,避免非授权用户对数据的访问,保证数据的安全。 1) 现在要我们设计一个权限方面的Web应用的软件系统,它有如下几种功能:1、 非登录用户不准进入;2、 登录的用户而在系统中的积分为零了,又不允许进入;3、 此用户由于发表一些过激的话语现在被管理员禁用他的权限了,又不允许进入;4、 此用户所在的IP段是不允许访问的,这样同样不允许进入。 这时我们如果在代码里面去实现这些功能的话,可能上面的每一个功能,我们都去写一个SQL语句去判断,根据每一个SQL语句执行的结果去提供给用户不同的显显示信息,无疑会增加数据库及网络的吞吐量。 而我们把上面的业务放在一个存储过程里面,把这些语句放在一组,然后通过每种情况传出一个输出参数,然后在程序部分只面要对这些接收参数进行分别的判断,这样程序部分只需要提交一次,就会大大的增加了应用程序的性能。 存储过程的优点显而可见。
在数据库的开发过程中,经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP来封装数据库操作。 如果项目的SP较多,书写又没有一定的规范,将会影响以后的系统维护困难和大SP逻辑的难以理解,另外如果数据库的数据量大或者项目对SP的性能要求很,就会遇到优化的问题,否则速度有可能很慢,经过亲身经验,一个经过优化过的SP要比一个性能差的SP的效率甚至高几百倍。 详细内容:1、开发人员如果用到其他库的Table或View,务必在当前库中建立View来实现跨库操作,最好不要直接使用“_name”,因为sp_depends不能显示出该SP所使用的跨库table或view,不方便校验。 2、开发人员在提交SP前,必须已经使用set showplan on分析过查询计划,做过自身的查询优化检查。 3、高程序运行效率,优化应用程序,在SP编写过程中应该注意以下几点:(a)SQL的使用规范:i. 尽量避免大事务操作,慎用holdlock子句,提高系统并发能力。 ii. 尽量避免反复访问同一张或几张表,尤其是数据量较大的表,可以考虑先根据条件提取数据到临时表中,然后再做连接。 iii. 尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该改写;如果使用了游标,就要尽量避免在游标循环中再进行表连接的操作。 iv. 注意where字句写法,必须考虑语句顺序,应该根据索引顺序、范围大小来确定条件子句的前后顺序,尽可能的让字段顺序与索引顺序相一致,范围从大到小。 v. 不要在where子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。 vi. 尽量使用exists代替select count(1)来判断是否存在记录,count函数只有在统计表中所有行数时使用,而且count(1)比count(*)更有效率。 vii. 尽量使用“=”,不要使用“”。 viii. 注意一些or子句和union子句之间的替换ix. 注意表之间连接的数据类型,避免不同类型数据之间的连接。 x. 注意存储过程中参数和数据类型的关系。 xi. 注意insert、update操作的数据量,防止与其他应用冲突。 如果数据量超过200个数据页面(400k),那么系统将会进行锁升级,页级锁会升级成表级锁。 (b)索引的使用规范:i. 索引的创建要与应用结合考虑,建议大的OLTP表不要超过6个索引。 ii. 尽可能的使用索引字段作为查询条件,尤其是聚簇索引,必要时可以通过index index_name来强制指定索引iii. 避免对大表查询时进行table scan,必要时考虑新建索引。 iv. 在使用索引字段作为条件时,如果该索引是联合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用。 v. 要注意索引的维护,周期性重建索引,重新编译存储过程。 (c)tempdb的使用规范:i. 尽量避免使用distinct、order by、group by、having、join、cumpute,因为这些语句会加重tempdb的负担。 ii. 避免频繁创建和删除临时表,减少系统表资源的消耗。 iii. 在新建临时表时,如果一次性插入数据量很大,那么可以使用select into代替create table,避免log,提高速度;如果数据量不大,为了缓和系统表的资源,建议先create table,然后insert。 iv. 如果临时表的数据量较大,需要建立索引,那么应该将创建临时表和建立索引的过程放在单独一个子存储过程中,这样才能保证系统能够很好的使用到该临时表的索引。 v. 如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先truncate table,然后drop table,这样可以避免系统表的较长时间锁定。 vi. 慎用大的临时表与其他大表的连接查询和修改,减低系统表负担,因为这种操作会在一条语句中多次使用tempdb的系统表。 (d)合理的算法使用:根据上面已提到的SQL优化技术和ASE Tuning手册中的SQL优化内容,结合实际应用,采用多种算法进行比较,以获得消耗资源最少、效率最高的方法。 具体可用ASE调优命令:set statistics io on, set statistics time on , set showplan on 等。
1首先存储过程是预编译,按理说应该会比程序运行的语句效率高,如果时间反而长的话,可能是统计信息没有及时更新导致优化器给存储过程与单语句生成了不同的查询计划,而用片面的统计信息生成的查询计划会导致索引利用率低效,试试更新统计信息或者重建/重组索引2一次提交查询6、7百次?这样的系统我还未见过,如果可以的话,现将需要的表数据缓存到服务器或者本地内存中,在内存中进行数据的操作,当然存储过程对复杂的查询会有一定的优化效果的
内容声明:
1、本站收录的内容来源于大数据收集,版权归原网站所有!
2、本站收录的内容若侵害到您的利益,请联系我们进行删除处理!
3、本站不接受违法信息,如您发现违法内容,请联系我们进行举报处理!
4、本文地址:http://www.jujiwang.com/article/294264b382da97fe10d9.html,复制请保留版权链接!
MFC,MicrosoftFoundationClasses,是一种用于在Windows环境中开发C,应用程序的库,凭借其广泛的功能和强大的工具集,MFC深受开发人员的欢迎,以下是一些实用技巧和技巧,可帮助您提升MFC开发能力,使用MFC视图框架MFC视图框架提供了一个应用程序框架,可处理应用程序的文档,视图架构,使用视图框架可以简...。
最新资讯 2024-09-26 23:35:57
无线电波的传播方式无线电波是一种电磁波,可以通过空中传播,无线电波的传播方式主要有以下几种,地波传播,地波是沿着地球表面传播的无线电波,地波的传播距离较短,通常只有几十公里,但穿透力较强,可以穿透建筑物和障碍物,天波传播,天波是向天空发射,然后被电离层反射回地面的无线电波,天波的传播距离较长,可以达到数百甚至上千公里,但穿透力较弱,容...。
本站公告 2024-09-22 23:38:32
ModifyMenu是一个免费的开源工具,它允许您修改Windows的上下文菜单,使其更加有用和高效,您可以使用ModifyMenu添加新命令、删除现有命令,甚至创建自定义子菜单,安装ModifyMenu要安装ModifyMenu,请访问Nirsoft网站并下载最新版本,下载完成后,运行安装程序并按照提示进行操作,使用ModifyMe...。
本站公告 2024-09-15 19:19:03
串口通信是一种广泛使用的技术,它允许计算机与外部设备进行数据交换,在Java中,串口通信可以通过java.util.comm包实现,要建立成功的串口通信,您需要正确配置串口参数,这些参数包括波特率、数据位、停止位和校验位,如果不正确配置这些参数,可能会导致通信错误或数据损坏,串口参数以下是Java中串口通信需要配置的主要串口参数,波特...。
本站公告 2024-09-12 14:25:08
在计算机网络领域,socket是一个用于网络通信的端点,它是应用程序和网络之间的接口,允许它们交换数据,Sockets的类型在Linux中,有两种主要类型的sockets,数据报套接字,UDP,提供无连接、不可靠的数据传输,数据报通过网络发送,但不保证送达,UDP通常用于实时应用程序,如视频流,流套接字,TCP,提供面向连接、可靠...。
技术教程 2024-09-12 05:10:43
组合工具是指将不同的工具结合使用来完成更复杂的任务,例如,一个木工可能使用以下工具组合来制造一个桌子,锯子,用于将木头切割成所需的形状,锤子,用于将木头钉在一起,螺丝刀,用于将螺钉拧入木头,砂纸,用于打磨木头的表面,油漆刷,用于为木头涂漆或染色,通过组合使用这些工具,木工能够制造出超出任何单一工具能力的复杂物品,组合工具的类型有许多类...。
最新资讯 2024-09-11 23:12:42
JavaScript提供了多种方法来获取当前月份,本文将探讨最常用的方法及其用例,1.使用Date对象最简单的方法是使用Date对象的getMonth,方法,该方法返回一个从0到11的数字,其中0表示一月,11表示十二月,constdate=newDate,constmonth=date.getMonth,console.l...。
本站公告 2024-09-10 09:05:23
前言欢迎来到详细的编程教程!本教程将带您踏上编程之旅,从基本概念到高级编程技术,一步一步地指导您学习,目录第1章,编程基础第2章,数据类型和变量第3章,运算符和表达式第4章,控制流第5章,函数第6章,面向对象编程第7章,数据结构和算法第8章,高级编程技术第1章,编程基础本章我们将介绍编程的基础知识,包括计算机程序、编程语言、编译器和解...。
本站公告 2024-09-07 10:14:52
随着HTML5的出现,HTML代码的标题元素发生了巨大的变化,引入了一个新的标题级别,hgroup,,同时还增强了现有级别的语义和灵活性,这些变化为web开发人员提供了前所未有的标题定制和组织选项,让他们的网站更具吸引力、用户友好且易于访问,标题元素的演变HTML4,标题元素为到,HTML5,新标题元素hgroup被引入,现有元素获得...。
本站公告 2024-09-07 04:28:13
StackOverflow无疑是世界上最大的编程问答网站,它拥有数百万个问题和答案,跨越广泛的编程语言和技术,StackOverflow也有一些缺点,对于初学者来说可能过于复杂StackOverflow的内容通常针对有经验的程序员,问题和答案往往包含技术术语和假设知识,这对于刚接触编程的新手来说可能很难理解,因此,StackOverf...。
技术教程 2024-09-05 15:07:24
创建数据库CREATEDATABASEmy,database,创建表CREATETABLEproducts,idINTNOTNULLAUTO,INCREMENT,nameVARCHAR,255,NOTNULL,descriptionVARCHAR,255,priceDECIMAL,10,2,stock,quantityINTNOT...。
互联网资讯 2024-09-05 12:26:42
官方网站又简称官网,一般指的是公司的,官方,网站,官方网站包括下列三种类型,1、网站主题的地区代理商,所制作的网页,也可以称做官方网页,如,美国在线游戏由台湾代理,台湾代理商做的网页就称为,台湾区的官方网页,2、指由网站主题代表者所设置的网站,有别于网友为兴趣设置的网站,如,电影公司为介绍某部新片所设置的网站,即可称为该影片的,官方...。
技术教程 2024-09-02 03:19:19