找回密码
 注册账号

QQ登录

只需一步,快速开始

手机号码,快捷登录

手机号码,快捷登录

初学者课程:T3自学|T6自学|U8自学软件下载课件下载工具下载资料:通资料|U8资料|NC|培训|年结积分规则 | 使用常见问题Q&A
知识库:U8 | | NC | U9 | OA | 政务U8|U9|NCC|NC65|NC65客开|NCC客开新手必读 | 任务 | 快速增金币用友QQ群[微信群]
查看: 110667|回复: 333

[经验] T6数据库变慢的终极解决办法 (持续完善中)

   火... [复制链接]
发表于 2011-9-1 10:35:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册账号

×
本帖最后由 sexman 于 2011-9-1 20:39 编辑

我们有一些客户的数据库是巨量数据,特别是用到生产管理的模块,千万行甚至亿行记录都不足为奇。如此情况下,数据库运行速度将受到严重影响,打开一个账表半小时甚至两小时,做一个计划要两天两夜,客户抱怨不断,服务人员焦头烂额,总不能叫客户都去买大型计算机吧。


其实是有办法可以大大提升数据库运行效率的,这要求我们的服务人员要学会数据库日常维护的高级技巧,而且是必须学会。

下面是数据库效率提升技巧的全面内容,建议所有服务人员自行练习并用在实际工作中,要求熟练掌握。


技巧一:重建索引
效率提升指数:高

特点:一二三买单,灰常的快,一下就弄完可以走人了。

案例:某超市T1商贸宝 百万行级数据,原速度五秒,重建索引后两秒不到,速度提升近一倍。不要小看这几秒,对超市来讲,那意味着不必要排长队。


由于数据库日常写操作频繁,索引的工作效率会越来越低,速度自然大受影响,很多客户会有这种感觉,前半年还非常快,后半年就受不了了。刚刚到年底,正好是出报告、查资料的年关,偏偏软件慢得要命,服务人员也别想有好日子过,陪着加班吧,就算解决不了问题,也让人家心理舒服点。这样的日子可以过去了。


命令1:DBCC DBREINDEX (表名称,"",70) ---针对主要影响速度的表,一般如rdrecords、salebillvouchs、pp_mrpdetails、pp_rmrpdetails
说明:只对主要表操作,影响速度的当然是这几个大表,速度解决问题,也不影响客户使用


命令2:exec sp_msforeachtable "DBCC DBREINDEX(""?"")" ---数据库所有表重建索引
说明:不太建议,除非太咸了


特别指出,重建索引前必须断网,以保证所有客户端无人在操作软件,你懂的



技巧二:表分区

效率提升指数:超高

特点:慢工出快活。硬盘越多,它就越快,所有硬盘一起转当然快;CPU越多,它就更快,sqlserver的引擎对这个有优化设计;设计得越合理,它就灰常滴快,例如历史数据按年存放,因为你一般不用嘛,那数据库只对你要操作的部分分区检索,自然飞快。
还有,必须得是sql2005及以上版本,人家买的ERP你还装sql2000,去死吧。

案例:NC、U8 10.0,是的,它们用的就是表分区,所以数据越海,速度也越Hi


没有做表分区之前,客户是痛苦的,你也得痛苦,因为你不明白几万元的服务器怎么就玩不转一个T6,但NC这么海却可以在宽带上溜溜的跑?U8 10.0还不分年度裤呢,咱一个年度还用爬的?如果我说可以提升五倍甚至更高的速度,你信不信?反正我是信了。

真的。


这个有点点难,因为要求有更多的数据库知识,不过初中生的水平也够用了,来吧。

1.为数据库建个文件组(可以建多个),最好是存放于不同磁盘上。这样效率得以最大化,想一想吧,我们查一个年度所有收发记录,三个硬盘一起转,是不是原来速度的三倍?

ALTER DATABASE 数据库名 ADD FILEGROUP 文件组名

2.一个文件组可放置多个文件,下面,只为一个文件组分配一个文件,类推吧。


ALTER DATABASE 数据库名 ADD FILE (NAME = N"文件组名", FILENAME = N"存放路径",SIZE = 5MB , FILEGROWTH = 10% ) TO FILEGROUP 文件组名

3.创建分区函数。这个函数是本文件组专有的,再建其它的文件组还得再搞一个。主要是设定,包括预设现有的数据从哪里开始水平分割,比如我们假设U8 10.0的上一年度最后一行rdrecords记录的Id是5000000,那么就可以设定这个值,这以内的记录会切割保存到第一个分区中。

CREATE PARTITION FUNCTION [函数名] (int) AS RANGE LEFT FOR VALUES (5000000,8274249,12000000)
此句表示,分三个区存放原先的数据

4.将分区函数绑定到分区架构上

CREATE PARTITION SCHEME [架构名]
AS PARTITION [函数名]
TO ([PRIMARY],[文件组名],[PRIMARY],[文件组名],[PRIMARY],[文件组名])

5.删除表的主键,必须删除,表担心,主键可以再建的
ALTER TABLE 数据表名称 DROP CONSTRAINT [主键]

6.删除聚集索引,如果有的话,我还没找到命令,现在是手动删除的

7.开始做表分区

ALTER TABLE 数据表名称 add CONSTRAINT [主键] PRIMARY KEY CLUSTERED (主键字段名)
ON [SHEME_rdrec](主键字段名)

你看,这不是恢复了主键吗
不过还是得手动恢复原来的聚集索引,这个我再查查语句吧



特别提出:
数据库收缩并不能提高数据库的读取效率,正相反,它反而更慢了,蛋痛!原因,是收缩后数据库内部的数据存储发生位移,也就是索引变得更低效。
这种情况下,必须再做一次索引重建,但我发现似乎只要收缩了以后,数据库都慢,重建索引也恢复不到原来的速度,一下想不明白道理,而且做的测试次数也有限。
建议以后不要给客户做收缩处理,没空间了买硬盘吧。


最终建议:
微软的sqlserver系列产品一直在进化,我从7.0一直用到2008,对于习惯了sql2000的服务人员来讲,要更换并熟悉一种新的数据库确实是一个挑战。这个字眼换一个吧,叫做好奇心。是的,技术人员的最根本特性,就是要保持这种好奇心,那么无论何种旁人看来的枯燥都是我们新奇的玩具。
sql2008有什么特点?就速度的提升而言,并没有太大的提高,但是它将我们在sql2005中必须要复杂语句处理的表分区,直接做成了向导模式,傻瓜型的,也就是说,谁都可以轻松的胜任一个数据库管理员的工作。如果你不想记住那些复杂的语句,呃,那么来个2008吧。


点评

谢谢分享  发表于 2017-2-8 16:37
赞一个赞一个  发表于 2017-2-8 16:31
不错,值得我收藏下。  发表于 2013-8-13 15:57
不错。我想收缩变慢可能是因为:“为了收缩硬盘空间,删除了很多用来提高访问效率的缓存文件。数据库在运行时,不但没有了缓存,还需要花费一些运算量来重新建立缓存”的缘故  发表于 2013-4-28 13:05
可以先做重建索引,然后收缩数据库,再重建一次索引。我之前也只是收缩,但是效果不大,后来别人告诉我这么搞,我就了试,发现速度还是快了不少。  发表于 2013-1-29 08:49
不错,值得我收藏下。  发表于 2011-9-17 09:07

评分

参与人数 6威望 +10 金币 +55 魅力 +10 收起 理由
zhumingjv + 5 赞一个!
幸中人 + 5 赞一个!
堂⊕幾诃徳 + 5 神马都是浮云
sungaining + 5
haoguoshengwwdz + 5
stonys + 10 + 30 + 10 很给力!

查看全部评分

发表于 2015-1-30 08:16:55 | 显示全部楼层
这个是好东西,用之前必须先测试下,不然直接玩挂数据库就不好玩了。

点评

谢谢分享  发表于 2017-2-8 16:38
回复 点赞 1 拍砖 1

使用道具 举报

发表于 2015-6-12 08:32:39 | 显示全部楼层
说的通俗点,可以从以下几个角度来处理下:
1.定期做索引重新生成和数据库日志删除(删除日志,必须在确认系统正常情况下,无需返回查日志)

2.建多个文件组,主文件和日志文件都要建立多个组,文件实施初期可以控制在:主文件500M,日志文件200M.
如果是在运行的系统,可以把文件大小扩充为原来的大小的10%左右

3.数据库文件组和主文件分别存放在不同硬盘,至少不同磁盘上。

4.操作系统为64位,可以充分扩大应用内存,可在4G以上

5.硬盘可为NTFS格式,否则数据库单文件4G以上,无法存储

其他您们补充……

点评

赞一个赞一个  发表于 2017-2-8 16:32
回复 点赞 拍砖

使用道具 举报

发表于 2023-2-17 08:13:48 | 显示全部楼层
楼主,我提个思路。
你看既然你出入库百万条以上,那么你的ua_log的数量也不会太少,可以定期删除记录,这样速度也会快,要知道,速度并不是只与rdrecord等相关的,总是先要去ufsystem中去读写记录的。
回复 点赞 拍砖

使用道具 举报

发表于 2019-5-28 14:39:37 | 显示全部楼层
好文章好文章好文章好文章好文章好文章好文章好文章好文章好文章好文章好文章好文章
回复 点赞 拍砖

使用道具 举报

发表于 2013-12-23 11:01:41 | 显示全部楼层
厉害                  
回复 点赞 拍砖

使用道具 举报

发表于 2011-9-1 10:41:25 | 显示全部楼层
好东东啊。正用得着。
发表于 2011-9-1 11:00:46 | 显示全部楼层
没点评的权限o(╯□╰)o

点评

赞一个  发表于 2017-2-8 16:36
应该有吧  发表于 2014-4-17 08:25
发表于 2011-9-1 12:34:38 | 显示全部楼层
好东东啊。正用得着。
发表于 2011-9-1 13:58:52 | 显示全部楼层
好东西啊,谢谢
发表于 2011-9-1 14:06:53 | 显示全部楼层
LZ真是强人!
发表于 2011-9-1 17:14:23 | 显示全部楼层
太高深了,对于没有数据库知识的人来说真是天书啊~

点评

赞一个  发表于 2017-2-8 16:36
强大的人啊  详情 回复 发表于 2013-1-4 10:53
发表于 2011-9-2 11:08:21 | 显示全部楼层
没有看明白啊,能否讲解的更浅显些么?谢谢!
另外:服务器本身如果设置的是RAID的话,怎么区分把数据库文件组放到哪个磁盘上呢?分区本身可能就是跨磁盘的啊。
我不懂,请多多指教。

点评

谢谢分享  发表于 2017-2-8 16:39
赞一个  发表于 2017-2-8 16:37
发表于 2011-9-2 15:12:16 | 显示全部楼层
不错,挺好的东西了来来看看
发表于 2011-9-2 15:42:30 | 显示全部楼层
很好,学习中
发表于 2011-9-2 16:28:47 | 显示全部楼层
不错不错非常不错 感谢楼主
发表于 2011-9-2 22:33:06 | 显示全部楼层
好东西啊
发表于 2011-9-3 11:01:12 | 显示全部楼层
高人就是高人啊!支持!
发表于 2011-9-4 15:30:08 | 显示全部楼层
这个是好好学一下
发表于 2011-9-5 17:33:43 | 显示全部楼层
亲爱的兄弟,给我这样的菜鸟说的再通俗一些、再详细一些好么?谢谢了!
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

QQ|站长微信|Archiver|手机版|小黑屋|用友之家 ( 蜀ICP备07505338号|51072502110008 )

GMT+8, 2024-4-20 03:16 , Processed in 0.057770 second(s), 11 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表