PDA

查看完整版本 : 处理登陆和打开仓库延迟的方法


Tony
2004-04-20, 12:16 AM
处理登陆和打开仓库延迟的方法

之前有很多朋友发过类似的贴子,只是写得都不是很清楚,也没有解决其中几个很关键的问题,导致方法失败。我这里重新整理一下,大家可以完全放心的使用。

先说原理: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秒,大家试试吧!不懂的问我,共同进步!