作者ppanerai (全职业封顶路途漫长)
看板Database
标题[SQL ] 为什麽select这麽慢?
时间Wed Jul 5 10:36:10 2006
常常会听到有这种说法:
"select动作很慢 是不是 Hardware/OS/database config 有问题"
大致上归类有以下几种情形 (这是我自己的分类~~呵~~)
1.应用程式
这边我指的是 - 设计与实作
这个部分也是最容易看到效果也最不花钱的
但是最花时间 @@
设计
通常是比较难解决的
如 table design 的错误 想改正 可能要整个打掉重做
若是开发中或是测试用的系统可能还好
但是...prod DB怎麽可以说停就停说打就打
有些机器整年都不能停...那怎麽办? @@"
实作
这一段就是重点了
我所经验过的效率问题(虽然不是很多经验)
80%以上集中在这一块
一般程式师由於对资料库的"操作"不熟悉
因此好像总有个印象认为只要懂得 SELECT、JOIN、Group 就好
也就是只求正确(嗯...Schedule的压力问题我们不讨论 = =)
我所说的操作并不是单纯下下SQL就OK
而是一些基本可以避开的问题点 算是基础观念
在这一方面 如果可以做到尽可能避免这些问题
不只可做出效率佳的程式 也可减少在硬体上的成本浪费
以下与资料库本身的厂家设计无关 我想应该通用吧 ^^
大部分我还是以 Oracle 为主
A).存取Data的数量
不必要的data勿 select 出来後再剔掉
尽量在SQL上将存取的限制做好
程式可以少处理一笔就少处理
B).Index的使用
适当使用Indexes
在random access时可以确保程式的效率
但也需要避免Indexes的滥用
如一个table有 10以上的 indexes
不要怀疑 就是会有 = ="
我想各个资料库的Index基本原理是大同小异的
但可以提供的功能确可能不太相同
如:
栏位是否可以倒置
存取资料超过整个table多少%时 Index反而浪费Resource
这些需要查过手册才知道
C).网路传输
这是最容易被忽略的一个部分
常常程式师会将Business写在前端(指非资料库)的程式中
因此 将data透过网路由Client(包括Applicatin Server)处理
在网路传输上面浪费时间是一件可怕的事
我们很可能无法察觉原来程式的效率瓶颈出在这里
我曾试过
将整个 program 写在 Store Procedure/Function中
与写在前端的应用程式中
使用相同的 SQL , Data数量 , database config
速度可以相差到 10倍 = ="
D).批次工作的分配
有资料产生 就一定有报表需求
报表通常是User最会Complain的一个部分
我们可以将这些批次工做分配到时间轴上
而不是一次跑完
举例说明
若系统每月需产生月报表
则每日将当日结算资料设计产生至另一个日结算table
跑月报表时将可以大大节省时间
当然 有些情况下 无法设计日结算的table(可能因BUSINESS问题)
这就需要靠各位的 Know How 及智慧去解决噜
E).转个弯会不会更好
有些时候无法避免
需要存取的 data就是这麽多
上面提到的几点也都考虑了
但还是跑很久
由於data原本就需处理这麽多
这时是不是用些偷吃步的做法(呵~)
可能会让程式跑的更快
举例
将需存取的资料先暂存於某一temp table
再进行处理
这一部分的应用需要对资料库本身的Feature有一定的了解
否则反而会造成其他资料库的影响
2.系统异常
嘿...这个呢 有可能发生在任何一个环节
OS NETWORK DATABASE 都有可能
不过 异常通常会导致...完全没办法动 = ="
如 Oracle 8i 中 temporary segment会发生的错误 storage parameter setting
所以 也跳过 (我看是不知从何讲起吧 噗~)
3.Hardware/OS/database - Config 有问题
这个我们不讨论 (是因为不知道怎麽讨论吧 @O@ )
因为发生的机会实在...不高
config 有问题 机器开始跑的第一天就会知道了
不会等到跑了好一阵子才出现 = =
=====================================================
如果以上的问题都已经处理过了
还是不满意
那就...花钱买硬体吧
不过扩充硬体实在是个无底洞 @@"
而且效果有限得很...
还有一点很重要
如果说...
你的资料库TABLE永远也不会超过 某一个数量(如 100,000 笔)
那...上面有些情况就可以不用考虑了
反正 ... 多做了些工 也感觉不出来快在哪里 QQ
最後要提到
Performance Tuning 永远都是很花时间的
需要实际资料量的执行以得到真正的tuning效果
评估永远是评估
实作完测试後才知道
- 改变後的做法及测试的问题点究竟是不是问题所在
以上如有谬误 还请各位指点 ^^
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 202.145.230.2
1F:推 drkkimo:你没提到join呀 不过join要约十万多笔资料以上才会变慢 07/05 15:33
2F:推 come:join应该包含在schema设计里面吧 07/05 23:18
3F:推 razor:资料库管理系统对於查询有最佳化的实作 07/06 00:24
4F:推 b6s:我想come的意思是,join 光是顺序不同也会有影响。 07/06 08:25
5F:推 ppanerai:呵我指的是观念上比较容易忽略的部分,至於真正的细节 07/06 09:09
6F:推 ppanerai:我想大家都很清楚,应该不用说太详细 @@ 07/06 09:16