提高数据库访问性能的几种方法

    我在医院待了半个月了, 当然,不是住院,而是为了给用户升级程序。程序的稳定性还不错,几乎很少出现运行时错误,倒是数据库的访问上出来不少的问题,当然这些问题目前已经完全解决,系统的性能非常好。
    主要的改进措施总结如下:
    1、增加索引,选择合适的数据类型作为索引,尽可能不要在日期类型的字段上建索引。在公司测试的时候也把数据库中添加的上百万行数据,进行了大量的测试速度都很快,到了用户这里,速度怎么慢了呢?开始怀疑是程序的原因,后来发现,我们把索引建在了日期类型的字段UpdDate上,并且根据这个字段进行排序(order by),因为用户每次登录之后要显示最近更新的100条数据。后来添加了一个整数字段,专门用于排序,作为索引,替换UpdDate的作用,结果数据的加载在瞬间完成。
    感觉整数索引的效率高于字符串索引。两个数据表之间的如果需要关联进行查询(inner join和outer join),尽可能的使用整数字段建立关联。
    如果要根据日期进行检索,为了提高性能,完全可以在数据表中添加三个整数字段:年,月,日(通过触发器进行维护),然后在这三个字段上创建复合索引,检索的性能会非常高。
    如果我们确实要使用日期类型的字段作为条件,尽量不要对字段本身进行运算(datediff或dateadd),而是对条件值进行运算。例如:
    select * from 表 where datediff(day,创建日期,'2007-01-02')>100
    这样的查询效率会非常低。而采用如下的方式
    select * from 表 where 创建日期 >dateadd(day,2008,'2001-01-01')
    效率会比较高。
    2、尽可能的不要使用select * from,而是需要几个字段就返回几个字段。在我们设计数据库的初期,可能表中的字段不多,select *没有什么不可以,但是随着系统的大量应用,表中的字段数量会增加几倍甚至10几倍,此时使用select *将会付出沉重的代价。
    3、将查询交给存储过程执行,特别是在性能要求非常高的情况下。存储过程的执行效率会高于通过RecorderSet直接打开记录集的效率。通过将检索条件作为参数传递给存储过程,而不是传递一个非常长的sql语句,对网络的压力会降低。想想看如果你的程序每10秒钟访问一次数据库,每次向服务器发送一个接近1K的SQL语句,和传递一个存储过程的名称和参数相比哪个效率高呢?我们的代码可以随意写,然而,用户的要求是程序没有任何的停顿,任何人不希望在发出指令之后等等几秒中才看到结果。
    4、千万不要在跨服务器的查询中使用outer join和Inner join。在链接服务器A上的一个表T1与服务器B上的一个表T2进行任何的join都会造成系统的没有响应(可能你很幸运速度很快,但是当数据量达到一定的程度,灾难就会降临)。通过存储过程从一个服务器A上检索数据,将结果保存在一个临时表或表变量中,然后把A返回的结果作为参数传递给服务器B,从B上返回结果,然后把这些结果组装起来反馈给客户端。
    5、定期重建索引或重新组织索引。这可以交给SQL server取做。做这样的设置不超过5分钟,增加一个任务,定期执行即可。我曾经被告知系统的速度有点慢,后来是更慢了,最后终于无法忍受,反映到院领导哪里去了。结果重建索引问题解决。两年过期了,这个数据库的数据量翻了几翻,但是性能还是非常棒。
    6、学会使用SqlServer Profiler吧。它会告诉你,你写的数据库访问代码哪里消耗资源比较严重。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值