MS SQL数据库太大30多G,服务器很慢,该如何处理?用了ms sql 2000+SP4

时间:2021-07-28 17:58:37
数据量很大,客户端的有上百个,不过应用使用了三层结构,客户端不直接连服务器。
有没有什么好的办法?提高服务器的性能,让服务器更快点

10 个解决方案

#1


确定性能瓶颈在磁盘的I/O上?

升级硬件是一个比较简单的途解办法,为了提高磁盘的I/O,可以使用磁盘阵列替代原有的磁盘存储设备,但是要选择正确的RAID级别。

#2


清除日志:

 
DECLARE @LogicalFileName sysname,
        @MaxMinutes INT,
        @NewSize INT
USE     szwzcheck             -- 要操作的数据库名
SELECT  @LogicalFileName = 'szwzcheck_Log',  -- 日志文件名
@MaxMinutes = 10,               -- Limit on time allowed to wrap log.
        @NewSize = 20                  -- 你想设定的日志文件的大小(M)
-- Setup / initialize
DECLARE @OriginalSize int
SELECT @OriginalSize = size 
  FROM sysfiles
  WHERE name = @LogicalFileName
SELECT 'Original Size of ' + db_name() + ' LOG is ' + 
        CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + 
        CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
  FROM sysfiles
  WHERE name = @LogicalFileName
CREATE TABLE DummyTrans
  (DummyColumn char (8000) not null)
DECLARE @Counter   INT,
        @StartTime DATETIME,
        @TruncLog  VARCHAR(255)
SELECT  @StartTime = GETDATE(),
        @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'
DBCC SHRINKFILE (@LogicalFileName, @NewSize)
EXEC (@TruncLog)
-- Wrap the log if necessary.
WHILE     @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time 
      AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = 
@LogicalFileName)  
      AND (@OriginalSize * 8 /1024) > @NewSize  
  BEGIN -- Outer loop.
    SELECT @Counter = 0
    WHILE  ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
      BEGIN -- update
        INSERT DummyTrans VALUES ('Fill Log')  
        DELETE DummyTrans
        SELECT @Counter = @Counter + 1
      END   
    EXEC (@TruncLog)  
  END   
SELECT 'Final Size of ' + db_name() + ' LOG is ' +
        CONVERT(VARCHAR(30),size) + ' 8K pages or ' + 
        CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
  FROM sysfiles 
  WHERE name = @LogicalFileName
DROP TABLE DummyTrans
SET NOCOUNT OFF
 
把szwzcheck换成你数据库的名字即可,在查询分析器里面运行。 
有全角的空格(为了显示好看),你自己把他换一下. 


收缩日志:

企业管理器--所有任务--收缩数据库--文件--选日志文件收缩

#3


对经常使用的查询字段建立索引.

#4


连慢在哪里都不知道就开药方了么?

#5


查看执行计划,如果不是处理方式的问题,就应该升级硬件了。

#6


MARK

#7


用Proflier跟踪SQL Server,看看哪些语句占资源厉害,优化一下就行了,还有,看看table的索引碎片多不多,多的话找个时间做下dbcc dbreindex,还有如果服务器内存达4GB或超过4GB记得打开SQL Server AWE模式,相应的操作系统启动参数加上/PAE

#8


日志我已经截掉,日志文件很小,不到2G,服务器升过级的,用的就是磁盘阵列。

重建索引还没试

#9


应该建索引了。但是数据量太大的话,硬件解决才是根本。

#10


数据库慢跟大没有必然联系。
建议用事件探查器看看有没有效率低下的查询和不合理的索引等。

#1


确定性能瓶颈在磁盘的I/O上?

升级硬件是一个比较简单的途解办法,为了提高磁盘的I/O,可以使用磁盘阵列替代原有的磁盘存储设备,但是要选择正确的RAID级别。

#2


清除日志:

 
DECLARE @LogicalFileName sysname,
        @MaxMinutes INT,
        @NewSize INT
USE     szwzcheck             -- 要操作的数据库名
SELECT  @LogicalFileName = 'szwzcheck_Log',  -- 日志文件名
@MaxMinutes = 10,               -- Limit on time allowed to wrap log.
        @NewSize = 20                  -- 你想设定的日志文件的大小(M)
-- Setup / initialize
DECLARE @OriginalSize int
SELECT @OriginalSize = size 
  FROM sysfiles
  WHERE name = @LogicalFileName
SELECT 'Original Size of ' + db_name() + ' LOG is ' + 
        CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + 
        CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
  FROM sysfiles
  WHERE name = @LogicalFileName
CREATE TABLE DummyTrans
  (DummyColumn char (8000) not null)
DECLARE @Counter   INT,
        @StartTime DATETIME,
        @TruncLog  VARCHAR(255)
SELECT  @StartTime = GETDATE(),
        @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'
DBCC SHRINKFILE (@LogicalFileName, @NewSize)
EXEC (@TruncLog)
-- Wrap the log if necessary.
WHILE     @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time 
      AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = 
@LogicalFileName)  
      AND (@OriginalSize * 8 /1024) > @NewSize  
  BEGIN -- Outer loop.
    SELECT @Counter = 0
    WHILE  ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
      BEGIN -- update
        INSERT DummyTrans VALUES ('Fill Log')  
        DELETE DummyTrans
        SELECT @Counter = @Counter + 1
      END   
    EXEC (@TruncLog)  
  END   
SELECT 'Final Size of ' + db_name() + ' LOG is ' +
        CONVERT(VARCHAR(30),size) + ' 8K pages or ' + 
        CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
  FROM sysfiles 
  WHERE name = @LogicalFileName
DROP TABLE DummyTrans
SET NOCOUNT OFF
 
把szwzcheck换成你数据库的名字即可,在查询分析器里面运行。 
有全角的空格(为了显示好看),你自己把他换一下. 


收缩日志:

企业管理器--所有任务--收缩数据库--文件--选日志文件收缩

#3


对经常使用的查询字段建立索引.

#4


连慢在哪里都不知道就开药方了么?

#5


查看执行计划,如果不是处理方式的问题,就应该升级硬件了。

#6


MARK

#7


用Proflier跟踪SQL Server,看看哪些语句占资源厉害,优化一下就行了,还有,看看table的索引碎片多不多,多的话找个时间做下dbcc dbreindex,还有如果服务器内存达4GB或超过4GB记得打开SQL Server AWE模式,相应的操作系统启动参数加上/PAE

#8


日志我已经截掉,日志文件很小,不到2G,服务器升过级的,用的就是磁盘阵列。

重建索引还没试

#9


应该建索引了。但是数据量太大的话,硬件解决才是根本。

#10


数据库慢跟大没有必然联系。
建议用事件探查器看看有没有效率低下的查询和不合理的索引等。