以文本方式查看主题 - 昂捷论坛 (http://enjoyit.com.cn/bbs/index.asp) -- □-技术研讨会 (http://enjoyit.com.cn/bbs/list.asp?boardid=36) ---- 如何让你的报表(查询)运行速度更快 (http://enjoyit.com.cn/bbs/dispbbs.asp?boardid=36&id=7980) |
-- 作者:ssp -- 发布时间:2011/5/15 17:16:44 -- 如何让你的报表(查询)运行速度更快 现在数据库服务器的配置都很高,虽然通过大内存、RAID技术解决了磁盘IO的瓶颈,但对于我们业务系统长期运行产生的海量数据来说对查询优化也是十分重要的。下面介绍几种优化方法: 1、数据转储和分区表:前者查询起来麻烦,需要union两个以上的表,转储时用删除原表、插入历史表的方法,可减少生产服务器的存储空间(数量少查询就快),用于处理极不常用的历史数据;使用分区表时需要在查询时指定分区表名,操作起来不灵活,但清除历史数据的速度比较快,可以把一个分区表数据删除,非常适合销售流水之类的数据。 2、在同样情况下表多次扫描慢于一次描,所以用exists、not exists代替in、not in,来减少扫描次数,并在写关联条件时尽量用索引字段。 3、join 快于left join 快于 full join。 4、在写查询时用“sp_help 表名”看下这个表有几个索引,哪个索引最适合你,尽量把索引的第一个字段作为查询的第一个条件,第二个字段作为查询的第二个条件等。不要在索引字段上加函数,如:datediff(day,c_date,@日期)=0,如果c_date是这个表的索引字段,那么数据库引擎不会选择这个索引,可以改成这样c_date>=@日期 and c_date<dateadd(day,1,@日期),得出的结果是一样的,但效率会差几十倍(取决于数据量,越大越明显),为什么会慢呢? 即使c_date不是索引字段这两个查询速度也是有区别的,加函数以后要经过几次运算才可以比较,不加函数,就是日期和日期的直接比较。 5、数值型的条件的常量不要加引号,这样有可能数值型的字段会被转成字符型,如数值型的字段c_id=123456,最好不要写成c_id=\'123456\' 6、全索引扫描慢于部分索引扫描,所以LIKE条件中的%_尽量放在最后面。 7、学会看查询计划,看下查询的哪个部分效率低,有没有优化的可能。 8、采用高转大容量大缓存的SAS盘、高缓存高速的RAID卡、多通道的高容量高速的内存。尽量使用64位系统,64位系统字长比32位大一倍,还可以使用超大内存。32位系统要开启pae启动参数,sql用awe分配内存,这样才能使用大内存,减少磁盘的IO。
|