2004-04-20, 12:16 AM | #1 | |
注册日期: 2003-10-22
帖子: 11,053
积分:6
精华:24
现金:14348金币
资产:29325305金币
|
处理登陆和打开仓库延迟的方法
处理登陆和打开仓库延迟的方法 之前有很多朋友发过类似的贴子,只是写得都不是很清楚,也没有解决其中几个很关键的问题,导致方法失败。我这里重新整理一下,大家可以完全放心的使用。 先说原理:sql得查询得运算快慢是与索引有关的,当某个数据库记录的数据达到上百万条以后,数据库又没有索引,这样dataserver 的处理时有一个时间问题,在人数达到500人以后,基本上处理查询时间要5秒以上,再加上warehouse的记录有重复数据,而且没有索引,所以登陆就很慢了,大家可以在dataserver上看到recvQ:XXXXX的数字,这表示目前服务器还有多少条查询或修改命令等待处理。 在数据库muonline中有存储过程里除了处理item(复制)得程序,没有其它的,所有处理全是实时交换的,那么仔细看一下,其交换的数据,主要就是对character,optiondata,warehouse进行处理,对于character 已是做了索引的,那么现在要处理的就是另外两个表。 首先记得在SQL的企业管理器中备份你的数据库,这样可以随时恢复。我每次对数据库操作,都会事先备份一下,这是一个很好的习惯。 在查询分析器里对muonline数据库操作,输入以下SQL运行脚本 1、备份warehouse数据表 select * into warehousebak from warehouse 2、备份optiondata表: select * into optiondatabak from optiondata 3、删掉仓库是空的记录 delete from warehouse where items is null 4、导出不重复数据。 select distinct * into warehousetmp from warehouse 这里注意了,虽然这里使用了distinct参数,但是生成的warehousetmp临时表中依然会有重复的数据,主要就是ITEMS这个字段不同了,我们再用下面的命令查询 select accountid from warehousetmp group by accountid having count(*)>1 数据应该不会很多,我4万多用户才12条重复的记录。大家记下重复的帐号,如果对SQL语句不太熟,就去企业管理器中条件查询帐号,删除重复的记录,记得要保留一条喔。 5、清空warehouse truncate table warehouse 6、清空optiondata表 truncate table optiondata 7、建立索引,在查询分析器里运行 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[warehouse]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[warehouse] GO CREATE TABLE [dbo].[warehouse] ( [AccountID] [nvarchar] (10) COLLATE Latin1_General_CS_AS NOT NULL , [Items] [varbinary] (1200) NULL , [Money] [int] NULL , [EndUseDate] [smalldatetime] NULL , [DbVersion] [tinyint] NULL , [pw] [smallint] NULL ) ON [PRIMARY] GO CREATE UNIQUE CLUSTERED INDEX [PK_Warehouse] ON [dbo].[warehouse]([AccountID] DESC ) ON [PRIMARY] GO 运行上面的脚本就在warehouse表中建立索引了. 8、继续建立索引 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[OptionData]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[OptionData] GO CREATE TABLE [dbo].[OptionData] ( [Name] [varchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL , [Skillkey] [binary] (10) NULL , [GameOption] [tinyint] NULL , [Qkey] [tinyint] NULL , [Wkey] [tinyint] NULL , [Ekey] [tinyint] NULL , [ChatWindow] [tinyint] NULL ) ON [PRIMARY] GO CREATE UNIQUE CLUSTERED INDEX [PK_Optiondata] ON [dbo].[OptionData]([Name] DESC ) ON [PRIMARY] GO 上面这段是OptionData的索引脚本. 这两个脚本是给不会建立索引的朋友用的,知道怎么建立就不需要啦 9、把非重复数据导回 insert into warehouse select * from warehousetmp 第9步操作如果报错,那就是你导出的warehousetmp数据中依样有重复数据,重复前面的检查步骤。如果没有报错,那么恭喜你了,你的warehouse,optiondata表索引建立成功了。开启服务器证实一下,如果无误,就可以删掉warehousetmp,warehousebak,optiondatabak三张表了,不删也没有问题。 索引建立之后,打开仓库和登陆的速度会明显加快,我的服务器平均在线人数1000人,建立之前高峰期打开仓库需要1分钟,现在最多5秒,大家试试吧!不懂的问我,共同进步! |
|
|
||
|