1、建表要科学,业务允许的话,尽可能的控制字段不要太多,合理的限制字段的类型和长度;
2、在常用的查询字段上建立索引;
3、不要太被第几范式之类的东西迷惑,最后是按着规范来了,每个查询都要join个5、6个表谁看着也不舒服,要合理的冗余(这个要根据自己业务来的);
4、多用业务层的缓存,比如字典库的东西不算多的话,都缓存起来吧,这样用的时候就不用select了。
5、能用TinyInt不用int,能用int不用char等等,效率来说,还是数字大于字符的;
6、多看看数据库的样例表,能学到很多东西的。
先想到了这么多,希望能帮助到你。
现在的服务器都很NB了,只要不是滥用缓存的话,就不用太在意内存大小了。
如何提高SQL Server数据库的性能 该从哪里入手呢笔者认为 该遵循从外到内的顺序 来改善数据库的运行性能 如下图
第一层 网络环境
到企业碰到数据库反映速度比较慢时 首先想到的是是否是网络环境所造成的 而不是一开始就想着如何去提高数据库的性能 这是很多数据库管理员的一个误区 因为当网络环境比较恶劣时 你就算再怎么去改善数据库性能 也是枉然
如以前有个客户 向笔者反映数据库响应时间比较长 让笔者给他们一个提高数据库性能的解决方案 那时 笔者感到很奇怪 因为据笔者所知 这家客户数据库的记录量并不是很大 而且 他们配置的数据库服务器硬件很不错 笔者为此还特意跑到他们企业去查看问题的原因 一看原来是网络环境所造成的 这家企业的客户机有 多台 而且都是利用集线器进行连接 这就导致企业内部网络广播泛滥 网络拥塞 而且由于没有部署企业级的杀毒软件 网络内部客户机存在病毒 掠夺了一定的带宽 不仅数据库系统响应速度比较慢 而且其他应用软件 如邮箱系统 速度也不理想
在这种情况下 即使再花十倍 百倍力气去提升SQL Server数据库的性能 也是竹篮子打水一场空 因为现在数据库服务器的性能瓶颈根本不在于数据库本身 而在于企业的网络环境 若网络环境没有得到有效改善 则SQL Server数据库性能是提高不上去的
为此 笔者建议这家企业 想跟他们的网络管理员谈谈 看看如何改善企业的网络环境 减少广播包和网络冲突;并且有效清除局域网内的病毒 木马等等 三个月后 我再去回访这家客户的时候 他们反映数据库性能有了很大的提高 而且其他应用软件 性能也有所改善
所以 当企业遇到数据库性能突然降低的时候 第一个反应就是查看网络环境 看看其实否有恶化 只有如此 才可以少走冤枉路
第二层 服务器配置
这里指的服务器配置 主要是讲数据库服务器的硬件配置以及周边配套 虽然说 提高数据库的硬件配置 需要企业付出一定的代价 但是 这往往是一个比较简便的方法 比起优化SQL语句来说 其要简单的多
如企业可以通过增加硬盘的数量来改善数据库的性能 在实际工作中 硬盘输入输出瓶颈经常被数据库管理员所忽视 其实 到并发访问比较多的时候 硬盘输入输出往往是数据库性能的一个主要瓶颈之一 此时 若数据库管理员可以增加几个硬盘 通过磁盘阵列来分散磁盘的压力 无疑是提高数据库性能的一个捷径
如增加服务器的内存或者CPU 当数据库管理员发现数据库性能的不理想是由内存或者CPU所造成的 此时 任何的改善数据库服务器本身的措施都将一物用处 所以 有些数据库管理专家 把改善服务器配置当作数据库性能调整的一个先决条件
如解决部署在同一个数据库服务器上的资源争用问题 虽然我们多次强调 要为数据库专门部署一个服务器 但是 不少企业为了降低信息化的成本 往往把数据库服务器跟应用服务器放在同一个服务器中 这就会导致不同服务器之间的资源争用问题 如把文件服务器跟数据服务器部署在同一个服务器中 当对文件服务器进行备份时 数据库性能就会有明显的下降 所以 在数据库性能发现周期性的变化时 就要考虑是否因为服务器上不同应用对资源的争夺所造成的
故 笔者建议 改善数据库性能时第二个需要考虑的层面 就是要看看能否通过改善服务器的配置来实现
第三层 数据库服务器
当通过改善网络环境或者提高服务器配置 都无法达到改善数据库性能的目的时 接下去就需要考察数据库服务器本身了 首先 就需要考虑数据库服务器的配置
一方面 要考虑数据库服务器的连接模式 SQL Server数据库提供了很多的数据库模式 不同的数据库连接模式对应不同的应用 若数据库管理员能够熟悉企业自身的应用 并且选择合适的连接模式 这往往能够达到改善数据库性能的目的
其次 合理配置数据库服务器的相关作业 如出于安全的需要 数据库管理员往往需要对数据库进行备份 那么 备份的作业放在什么时候合适呢当然 放在夜晚 夜深人静的时候 对数据库进行备份最好 另外 对于大型数据库 每天都进行完全备份将会是一件相当累人的事情 虽然累得不是我们 可是数据库服务器也会吃不消 差异备份跟完全备份结合将是改善数据库性能的一个不错的策略
第四层 数据库对象
若以上三个层面后 数据库性能还不能够得到大幅度改善的话 则就需要考虑是否能够调整数据库对象来完成我们的目的 虽然调整数据库对象往往可以提到不错的效果 但是 往往会对数据库产生比较大的影响 所以 笔者一般不建议用户一开始就通过调整数据库对象来达到改善数据库性能的目的
数据库对象有表 视图 索引 关键字等等 我们也可以通过对这些对象进行调整以实现改善数据库性能的目标
如在视图设计时 尽量把其显示的内容缩小 宁可多增加视图 如出货明细表 销售人员可能希望看到产品编号 产品中英文描述 产品名字 出货日期 客户编号 客户名字等等 但是 对于财务来说 可能就不需要这么全的信息 他们只需要产品编号 客户编号 出货日期等等少量的信息即可 所以 能可浪费一点代码的空间 设计两张视图 对应不同部门的需求 如此 财务部门在查询数据时 不会为不必要的数据浪费宝贵的资源
如可以通过合理设置索引来提高数据库的性能 索引对于提高数据的查询效率 有着非常好的效果 对一些需要重复查询的数据 或者数据修改不怎么多的表设置索引 无疑是一个不错的选择
另外 要慎用存储过程 虽然说存储过程可以帮助大家实现很多需求 但是 在万不得已的情况下 不要使用存储过程 而利用前台的应用程序来实现需求 这主要是因为在通常情况下 前台应用程序的执行效率往往比后台数据库存储过程要高的多
第五层 SQL 语句
若以上各个层面你都努力过 但是还不满足由此带来的效果的话 则还有最后一招 通过对SQL语句进行优化 也可以达到改善数据库性能的目的
虽然说SQL Server服务器自身就带有一个SQL语句优化器 他会对用户的SQL语句进行调整 优化 以达到一个比较好的执行效果 但是 据笔者的了解 这个最多只能够优化一些粗略的层面 或者说 %的优化仍然需要数据库管理员的配合 要数据库管理员跟SQL优化器进行配合 才能够起到非常明显的作用
不过 SQL语句的调整对于普通数据库管理员来说 可能有一定的难度 除非受过专业的训练 一般很难对SQL语句进行优化 还好笔者受过这方面的专业训练 对这方面有比较深的认识 如在SQL语句中避免使用直接量 任何一个包含有直接量的SQL语句都不太可能被再次使用 我们数据库管理员要学会利用主机变量来代替直接量 不然 这些不可再用的查询语句将使得程序缓存被不可再用的SQL语句填满 这都是平时工作中的一些小习惯
lishixinzhi/Article/program/SQLServer/201311/22452
1数据库I/O方面硬件性能
最有可能影响性能的是磁盘和网络吞吐量。解决办法:
扩大虚拟内存,并保证有足够可以扩充的空间
把数据库服务器上的不必要服务关闭掉
把SQL数据库服务器的吞吐量调为最大
2调整数据库
若对该表的查询频率比较高,则建立索引。
分区(如MySQL,按时间分区)
尽量使用固定长度字段和限制字段长度(如 varchar(10))优势:
降低物理存储空间
提高数据库处理速度
附带校验数据库是否合法功能
3使用存储过程
应用程序的实现过程中,能够采用存储过程实现的对数据库的 *** 作尽量通过存储过程来实现。
因为存储过程是存放在数据库服务器上的一次性被设计、编码、测试,并被再次使用,需要执行该任务的应用可以简单地执行存储过程,并且只返回结果集或者数值。
这样不仅可以使程序模块化,同时提高响应速度,减少网络流量,并且通过输入参数接受输入,使得在应用中完成逻辑的一致性实现。
4SQL语句方面
建立查询条件索引仅仅是提高速度的前提条件,响应速度的提高还依赖于对索引的使用。不良的SQL往往来自于不恰当的索引设计、不充份的连接条件和不可优化的where子句。
优化sql语句,减少比较次数
限制返回条目数(mysql中使用limit)
5Java方面
尽可能的少创造对象
合理摆正系统设计的位置。大量数据 *** 作,和少量数据 *** 作一定是分开的。
合理利用内存,有的数据要缓存。让数据流起来,而不是全部读到内存再处理,而是边读取边处理。
一、在SQL Server中存储过程不会影响性能。\x0d\1、只会大大的减轻服务器的压力,而不会增加,只有不合理的存储过程才会造成服务器性能下降的恶果。一个大型的数据库,一般存储过程也不会超过几千个,对当前的数据库及它依附的硬件来说,这点儿负载是大象身上的老鼠,负载基本可以_略不计。\x0d\2、但是,存储过程是批量的SQL语句的合成,如果设计上混乱,引发死循环、死锁、大范围查询、临时表没有及时清理释放等问题的情况下,是会严重影响服务器性能的,但这根子不在存储过程上,而在于存储过程的设计上。错误的SQL代码指挥服务器,无论它的形式是存储过程,还是客户端及时发向数据库的请求,都会使服务器出现问题。\x0d\\x0d\二、相关扩展\x0d\1、在当前,针对数据库的编程设计,没有存储过程是不可想象的,这就象某个公司的大型货品仓库中没有仓库保管员一样,所有的货品进出都得进货员或销售员去临时取放,会严重降低工作效率。\x0d\2、存储过程在数据库中无论是否编译好,其效率都要比客户端临时向数据库发送指令调数据来得要高,因为至少减少了发向服务器的指令的量。况且很多的中间值、临时值如果不通过存储过程来实现的话,就只能先全取到客户端,这样会大大增加网络负担与服务器的负钽。\x0d\3、正如微软所说,存储过程来实现,可以使得很多中间量不必传入到客户上,客户端只能得到需要的结果,所以同时可以提高安全。
在公路建设中,通过建立多条车道可以提高道路的流量。其实这个道理在Oracle数据库中也行得通。即可以将关键数据文件存储在多块硬盘上,以提高Oracle数据库的性能。可惜的是,不少数据库管理员没有意识到这一点。在这篇文章中笔者就以Oracle11G为例,说明如何通过在硬盘之间分布关键数据文件来提高性能。 一、在硬盘之间分布关键数据文件的基本原则。
在传统的文件系统上(即不是在裸机上)部署Oracle数据库,可以通过将关键的数据文件分布到多个可用的文件系统上或者不同的硬盘上来提高数据库的性能。具体的来说,需要遵循如下几个原则。
一是对于表来说,往往包含两个部分,即基本表与索引表。只要为基本表中的字段创建了索引,其对应的就有一张索引表。当用户访问表中的数据时,应用系统需要同时访问到索引表与数据表。此时我们可以将这两张表比喻成两辆车。如果现在只有一个车道(即将他们同时存放在一个硬盘或者文件系统中),那么两辆车必须前后行使。而如果现在有两个车道(即将基本表与其相对应的索引表存放在不同的硬盘或者文件系统中),那么这两辆车就可以并排行使。显然,后者的效率更高。为此笔者建议,可将经常需要访问的表和与之对应的索引表分开来存放。
二是可以将日志文件也分开来存放。不光光是数据表与索引表存在着这种状况。其实在日志文件管理中也是如此。只要条件允许,那么最好能够将联机重做日志和归档日志与其它数据文件存放在不同的硬盘或者文件系统上。因为当用户往数据库中写入数据时,需要同时往数据文件与重做日志文件中写入数据。此时如果将它们分开来存放,那么就相当于有了多条车道,分别往不同的文件中写入数据。这无疑就可以提高数据写入的效率,从而提高数据库的性能。
二、哪些文件最好能够分开存放
在讲到硬盘之间分布关键数据文件的基本原则的时候,笔者举了几个需要分开存放的几个案例。但是在实际工作中,并不仅仅局限于上面提到的这些文件。笔者认为,如果条件允许的话,那么可以考虑将如下文件放置在不同的硬盘上。
一是表空间,如临时表空间、系统表空间、UNDO表空间等等。这三个表空间可能系统会同时进行访问。为此需要将其分开来存放。二是数据文件和索引文件。上面提到过,需要将经常访问的数据文件与其对应的索引文件存放在不同的硬盘上。因为这两类文件在访问数据时也可能会同时访问到。三是 *** 作系统盘与数据库文件单独存放。显然Oracle系统肯定是与 *** 作系统同时运行的。为了避免他们之间的I/Q冲突,就需要将Oracle部署在 *** 作系统盘以外的磁盘上。四是联机重做日志文件。这个文件比较复杂,不但要将其与其他文件分开来存放。而且还需要注意的是,最好能够将其存放在性能最佳的硬盘上。
最后需要说明的一点是,增加磁盘也会增加成本。这不光光是购买磁盘所需要的花费,还包括管理的成本。所以这之间也会涉及到成本与性能之间的一个均衡问题。如果企业的数据不是很多,或者主要是涉及到查询 *** 作,那么这么设计的话,就可能不怎么合理。因为投入要大于回报。
三、如何确定是否需要将文件分开来存放
在实际工作中,企业的数据是一个从少到多的过程。也就是说,刚开始使用数据库的时候,可能数据量比较少,此时出于成本的考虑,没有将相关文件存放在不同的磁盘上。但是随着工作的深入,用户会发现数据库的性能在逐渐的降低。此时管理员就需要考虑,能够采取这种多建车道的措施,来提高数据库性能。当然在采取这个措施之前,管理员需要先进性评估。此时评估所需要用到的一个指标就是磁盘的I/O争用。
磁盘争用通常发生在有多个进程试图同时访问一个物理磁盘的情况下。如现在用户需要访问某个数据表中的数据,此时系统需要访问索引文件与数据表文件。如果将它们放置在同一磁盘上,那么在访问时就会发生I/O冲突。所以评估I/O冲突的严重程度,可以帮我们来确定是否需要将关键文件存放在不同的磁盘上。
将I/O平均的分布到多个可用的磁盘上,这可以有效的减少磁盘之间的争用情况,提高数据存储与读取的性能。从而提高Oracle等应用程序的效率。在实际工作中,数据库控制文件中有两个参数可以用来帮助我们评估这个指标。这两个参数是文件平均读取时间和文件平均写入时间。不过在使用这两个参数的时候,其只评估所有与数据库相关联的文件。管理员如果有需要的话,也可以通过下面的查询语句来查询数据文件是否存在I/O问题。查询的语法与结果如下图所示:
从如上的查询结果中可以看出某个数据文件是否繁忙,数据文件之间是否存在着/I/O冲突文件。这里需要注意的是,这个结果是一个动态的结果。在不同的时刻、用户进行不同的 *** 作时往往会得出不同的结论。为此笔者建议,在使用这个数据的时候,最好能够多跟踪几次。然后分析多次运行的结果。只有如此,才能够得到比较合乎情理的判断。 通常情况下,管理员根据上面的结果可以得出三种结论。
第一种结论是上面这些数据文件都不是很忙。即文件的平均读取时间与写入时间都比较短,表示这两个文件都是比较空闲的。此时正常情况下,数据库的性能应该是不错的。也就是说,如果此时数据库的性能不理想的话,那么就不是磁盘的I/O所造成的。管理员应该从其他角度来改善数据库的性能。
第二种结论是每个数据库文件都非常的繁忙。此时有可能是读取时间或者写入时间比较长,或者说两个时间都比较长。当多个数据文件同时比较繁忙并且他们处于同一磁盘的话,那么管理员就需要考虑购买新的磁盘,然后将上面提到的这些关键文件重新整理,让他们部署在不同的磁盘上。
第三种结论是某几个特定的数据文件比较繁忙,而其他数据文件还可以。此时管理员如果成本受到限制,那么也不需要重新购买硬盘。在磁盘上的物理写入和读取次数上如果出现比较大的差异,就表明某个磁盘负载过大,即有很严重的I/O冲突。此时最好能够将这个磁盘中的文件进行调整,如将某些文件移动到另外的一块I/O相对不怎么严重的磁盘上。不过在采取这个 *** 作的时候,需要注意一点。对于联机重做日志文件来说,即使其所在的磁盘I/O冲突比较低,或者访问这个文件的时间比较短,但是也不建议将其他数据文件转移到其所在的磁盘上来。因为通常情况下,为了保障数据库的性能,我们都建议将联机重做日志文件单独存放,并且还需要讲起放置在性能比较高的硬盘上。
总之,将关键的Oracle数据库文件分开放置。如此的话可以有效避免磁盘争用成为Oracle数据库系统的性能瓶颈。
以上就是关于如何优化数据库的性能全部的内容,包括:如何优化数据库的性能、从外到内提高SQL Server数据库性能、如何对数据库性能进行优化等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)