sqlserver占硬盘,sql server内存占用高解决办法-成都快上网建站

sqlserver占硬盘,sql server内存占用高解决办法

SQLServer表的大小与表占硬盘空间大小有什么区别,应该怎么去查这两项性能?

表的大小一般指表的行数,占用硬盘空间大小就比较复杂了,可以有以下几个参数:

站在用户的角度思考问题,与客户深入沟通,找到武鸣网站设计与武鸣网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:做网站、网站制作、企业官网、英文网站、手机端网站、网站推广、域名注册雅安服务器托管、企业邮箱。业务覆盖武鸣地区。

分配空间,数据占用空间及索引占用空间。

执行

EXEC alltablecount

即可显示当前数据库所有表资源占用情况。

执行前,请前建立以下表,和两个存储过程:

1、先建立表:HY_SPACE

CREATE TABLE [HY_SPACE] (

[name] [nvarchar] (128) COLLATE Chinese_PRC_CI_AS NULL ,

[rows] [char] (11) COLLATE Chinese_PRC_CI_AS NULL ,

[reserved] [varchar] (18) COLLATE Chinese_PRC_CI_AS NULL ,

[data] [varchar] (18) COLLATE Chinese_PRC_CI_AS NULL ,

[index_size] [varchar] (18) COLLATE Chinese_PRC_CI_AS NULL ,

[unused] [varchar] (18) COLLATE Chinese_PRC_CI_AS NULL

) ON [PRIMARY]

GO

2、建立统计存储过程:

create procedure HYspaceused

@objname nvarchar(776) = null,

@updateusage varchar(5) = false

as

declare @idint

declare @typecharacter(2)

declare@pagesint

declare @dbname sysname

declare @dbsize dec(15,0)

declare @logsize dec(15)

declare @bytesperpagedec(15,0)

declare @pagesperMBdec(15,0)

create table #spt_space

(

rowsint null,

reserveddec(15) null,

datadec(15) null,

indexpdec(15) null,

unuseddec(15) null

)

if @updateusage is not null

begin

select @updateusage=lower(@updateusage)

if @updateusage not in ('true','false')

begin

raiserror(15143,-1,-1,@updateusage)

return(1)

end

end

if @objname IS NOT NULL

begin

select @dbname = parsename(@objname, 3)

if @dbname is not null and @dbname db_name()

begin

raiserror(15250,-1,-1)

return (1)

end

if @dbname is null

select @dbname = db_name()

select @id = null

select @id = id, @type = xtype

from sysobjects

where id = object_id(@objname)

if @id is null

begin

raiserror(15009,-1,-1,@objname,@dbname)

return (1)

end

if not exists (select * from sysindexes

where @id = id and indid 2)

if @type in ('P ','D ','R ','TR','C ','RF')

begin

raiserror(15234,-1,-1)

return (1)

end

else if @type = 'V '

begin

raiserror(15235,-1,-1)

return (1)

end

else if @type in ('PK','UQ')

begin

raiserror(15064,-1,-1)

return (1)

end

else if @type = 'F '

begin

raiserror(15275,-1,-1)

return (1)

end

end

if @updateusage = 'true'

begin

if @objname is null

dbcc updateusage(0) with no_infomsgs

else

dbcc updateusage(0,@objname) with no_infomsgs

print ' '

end

set nocount on

if @id is null

begin

select @dbsize = sum(convert(dec(15),size))

from dbo.sysfiles

where (status 64 = 0)

select @logsize = sum(convert(dec(15),size))

from dbo.sysfiles

where (status 64 0)

select @bytesperpage = low

from master.dbo.spt_values

where number = 1

and type = 'E'

select @pagesperMB = 1048576 / @bytesperpage

select database_name = db_name(),

database_size =

ltrim(str((@dbsize + @logsize) / @pagesperMB,15,2) + ' MB'),

'unallocated space' =

ltrim(str((@dbsize -

(select sum(convert(dec(15),reserved))

from sysindexes

where indid in (0, 1, 255)

)) / @pagesperMB,15,2)+ ' MB')

print ' '

insert into #spt_space (reserved)

select sum(convert(dec(15),reserved))

from sysindexes

where indid in (0, 1, 255)

select @pages = sum(convert(dec(15),dpages))

from sysindexes

where indid 2

select @pages = @pages + isnull(sum(convert(dec(15),used)), 0)

from sysindexes

where indid = 255

update #spt_space

set data = @pages

update #spt_space

set indexp = (select sum(convert(dec(15),used))

from sysindexes

where indid in (0, 1, 255))

- data

update #spt_space

set unused = reserved

- (select sum(convert(dec(15),used))

from sysindexes

where indid in (0, 1, 255))

select reserved = ltrim(str(reserved * d.low / 1024.,15,0) +

' ' + 'KB'),

data = ltrim(str(data * d.low / 1024.,15,0) +

' ' + 'KB'),

index_size = ltrim(str(indexp * d.low / 1024.,15,0) +

' ' + 'KB'),

unused = ltrim(str(unused * d.low / 1024.,15,0) +

' ' + 'KB')

from #spt_space, master.dbo.spt_values d

where d.number = 1

and d.type = 'E'

end

else

begin

insert into #spt_space (reserved)

select sum(reserved)

from sysindexes

where indid in (0, 1, 255)

and id = @id

select @pages = sum(dpages)

from sysindexes

where indid 2

and id = @id

select @pages = @pages + isnull(sum(used), 0)

from sysindexes

where indid = 255

and id = @id

update #spt_space

set data = @pages

update #spt_space

set indexp = (select sum(used)

from sysindexes

where indid in (0, 1, 255)

and id = @id)

- data

update #spt_space

set unused = reserved

- (select sum(used)

from sysindexes

where indid in (0, 1, 255)

and id = @id)

update #spt_space

set rows = i.rows

from sysindexes i

where i.indid 2

and i.id = @id

INSERT INTO HY_SPACE

select name = object_name(@id),

rows = convert(char(11), rows),

reserved = ltrim(str(reserved * d.low / 1024.,15,0) +

' ' + 'KB'),

data = ltrim(str(data * d.low / 1024.,15,0) +

' ' + 'KB'),

index_size = ltrim(str(indexp * d.low / 1024.,15,0) +

' ' + 'KB'),

unused = ltrim(str(unused * d.low / 1024.,15,0) +

' ' + 'KB')

from #spt_space, master.dbo.spt_values d

where d.number = 1

and d.type = 'E'

RETURN

end

return (0)

GO

3、主存储过程

create procedure alltablecount as

declare @name varchar(100)

TRUNCATE TABLE HY_SPACE

declare tablecur cursor for select name from sysobjects where xtype= 'u '

create table #tablecount(tablename varchar(100),reccount int)

open tablecur

fetch next from tablecur into @name

while @@fetch_status!=-1

begin

exec ('insert into #tablecount select tablename='''+@name+''',reccount=count(1) from '+@name+' ')

EXEC HYspaceused @NAME

fetch next from tablecur into @name

end

close tablecur

deallocate tablecur

select * from #tablecount order by reccount desc

select * from HY_SPACE

GO

SQL server 磁盘占用率过高怎么解决

SQL

server

磁盘占用率过高怎么解决

sql

数据库占用磁盘IO读写过高,

原因:可能是插入数据频繁,并且存在的索引太多

所以建议清除不用的索引

或是对数据库进行重建索引

也可以叫DBCC

操作

sql server 2008R2 占用大量硬盘空间问题

这些占用着的内存,其实是数据缓存.如果内存够大,那就别删了.删除后会减低性能和效率.

如果一定要删,实质上是通过最大值开限制内存开销:

鼠标右键实例--属性--内存

设定最大内存 即可

sqlserver占用内存过高,清理办法

SQL Server对服务器内存的使用策略是用多少内存就占用多少内存,只用在服务器内存不足时,才会释放一点占用的内存,所以SQL Server 服务器内存往往会占用很高。

Sql Server运行时候的缓存:

1.数据缓存:执行个查询语句,Sql Server会将相关的数据页(Sql Server操作的数据都是以页为单位的)加载到内存中来, 下一次如果再次请求此页的数据的时候,就无需读取磁盘了,大大提高了速度。

2.执行命令缓存:在执行存储过程,自定函数时,Sql Server需要先二进制编译再运行,编译后的结果也会缓存起来, 再次调用时就无需再次编译。

清除缓存的命令(直接执行第四个命令清除所有缓存):

DBCC FREEPROCCACHE --清除存储过程相关的缓存

DBCC FREESESSIONCACHE --会话缓存

DBCC FREESYSTEMCACHE('All') --系统缓存

DBCC DROPCLEANBUFFERS --所有缓存

注意:清除了缓存,不会释放SQL Server所占用的内存,所以需要通过修改SQL Server内存或重启SQL Server服务器来释放内存。

修改SQL Server内存:

优化:使用以下语句查找出什么语句占内存最高,针对占内存高的语句进行优化

SELECT SS.SUM_EXECUTION_COUNT,

T.TEXT,

SS.SUM_TOTAL_ELAPSED_TIME AS '总和时间',

SS.SUM_TOTAL_WORKER_TIME AS '执行耗时',

SS.SUM_TOTAL_LOGICAL_READS AS '总和逻辑读数',

SS.SUM_TOTAL_LOGICAL_WRITES AS '总和逻辑写'

FROM (SELECT S.PLAN_HANDLE,

SUM(S.EXECUTION_COUNT)SUM_EXECUTION_COUNT,

SUM(S.TOTAL_ELAPSED_TIME)SUM_TOTAL_ELAPSED_TIME,

SUM(S.TOTAL_WORKER_TIME)SUM_TOTAL_WORKER_TIME,

SUM(S.TOTAL_LOGICAL_READS)SUM_TOTAL_LOGICAL_READS,

SUM(S.TOTAL_LOGICAL_WRITES)SUM_TOTAL_LOGICAL_WRITES

FROM SYS.DM_EXEC_QUERY_STATS S

GROUP BY S.PLAN_HANDLE

) AS SS

CROSS APPLY SYS.dm_exec_sql_text(SS.PLAN_HANDLE)T

ORDER BY SUM_TOTAL_LOGICAL_READS DESC

转自:

SqlServer数据文件太大,表占用空间太大,怎么释放空间

时间充足就断线停止写入数据库,做个全备份。

删除数据库,删除数据库文件。

整理下磁盘。

重建同名数据库,恢复数据库。

这时候的空间是最紧凑的,可以试试建聚集索引。

最根本的方法是加硬盘,可能你的数据操作规律就是会产生很多碎片的,必须要有双倍的空间才行。

为什么SQLServer会占用这么大的内存

简单回答:

因为它的设计是为了提供最高效快速的数据服务。它会尽可能利用(占用)电脑的内存、CPU资源来做数据服务。

1、SQL Server是数据库系统,它的设计目标就是以当前设备硬件的最大的资源来为其它或自已提供最高效快速的数据查询、存储、运算支持。

2、所以,它在运行过程中,默认情况下,会占用较大的内存,会用较高的CPU性能,因为它可不管你的想法是什么,它的想法就是时刻准备着,查询、存储、运算数据。它会将它认为最常用的数据调入内存中,以加快查询速度,会不停的想法儿优化算法,优化物理存储位置,以做到尽可能的最快的速度提供操作者想要的数据。

3、SQL Server对内存的占用是可以调定与调整的,在起动 “企业管理器”或“SQL Server Management Studio”在里面点击树状结构的根目录,点属性,到里面相关的参数处可设定数据库的内存占用。提示的是,过小的内存占用会引发SQL Server的运行故障。

4、个人电脑,安装它用于调试、编程学习、或某些特定软件数据支持,不用时,可以去控制面版的“服务”中,关闭“SQLServer”相关服务,即可让它不再占用系统资源,但这并不是太方便,而且只适用于对电脑比较熟悉的朋友。


本文名称:sqlserver占硬盘,sql server内存占用高解决办法
文章转载:http://kswjz.com/article/dsihedi.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流