当前位置:主页>仓库管理软件> 列表

如何释放SQL所使用的内存空间,提高访问数据库的速度。 找汽配管理软件

仓库管理软件版1楼: 我的程序,打开后连到数据库,打开查询几次后(每次查询用到4个TADODataSet数据集,访问3个数据表,其同一个表有数据记录14,091,023条(一千四百多万条)),SQL数据库所使用的内存很快就上升到100多MB、虚拟内存也同样达到100多MB,在关闭程序后,SQL数据库使用的内存空间并没有释放。连接数据库访问速度很慢,有什么办法解决??
访问服务器(客户机与数据库服务器距离100米左右速度慢,有时会访问超时)
1、释放数据库使用的内存空间;
2、提高访问速度。[:)]

2楼: 1、在断开连接后,内存会慢慢的释放,但如果你停用一下再启动的话就会很快放掉。
2、如果是因为距离引起的,作成三层结构会好些。把应用服务器和数据库服务器放在同一台机器上。这样的话大数据量的操作就不会在网络上造成大的影响了。
具体问题还要更进一步分析才能,作出具体的解决办法。 如服装店库存软件

3楼: 我没做过三层结构的程序,不知道什么写,若要停用重启是不可能的我程序还在运行中其他用户也可能在访问。

4楼: 我在数据服务器上面运行程序查询的速度就2~5秒,在100多米外的客户机上查询有时可以的话要等1~2分钟,有时会超时。若在20、30米内的其他客户机上操作也就3~8秒。
1、服务器在16楼,客户机在1楼,
2、服务器与客户机联网的中间还有个交换机,若不用交换机就连不上局域网络
3、服务器是win2000高级服务器版,客户机时winxp专业版,数据库是MS SQL SERVER 7.0

5楼: 在100多米外的客户机上查询有时可以的话要等1~2分钟
这个是因为你的数据量比较大,通过网络传输需要这么多时间,直接在数据库服务器上运行不存在网络问题。

在缺省情况下,SQL Server7的内存管理是采用自动管理的方式,在这种模式下,SQL Server会自动回收没用的内存空间,但是如果没有其他的应用请求内存,即使其中有未使用的页, SQL Server也将维持它的内存池保持当前大小,它只在有内存需求时回收内存。

在这种机制下,最好的解决办法是一次性不要取那么多数据,假设你的1400多万条记录分两次获取,第一次的700万条取出后占用n兆空间,程序关闭后,第二次再取700万条时,SQL Server会重新利用上次占用的内存空间。

所以,我觉得问题的症结不在于自动释放内存,而是你一次性不应该取那么多数据。

6楼: 如果愿意的话,升级到SQL Server2000或SQL Server2005。
SQL Server占用很多内存只是想在内存中保留尽量多的数据以便使用,这些数据是SQL Server认为会被频繁使用的,其实就是起了个缓存的作用,从内存读数据远比从硬盘读数据快的多。如果你认为SQL Server占用过多内存,可以给它设置一个上限,如512MB、448MB等。


SQL Server 7.0的性能不能跟SQL Server2000或SQL Server2005同日而语!
配合window2003更好,windows2003提供了更好的多用户并发性能。

仓库管理软件版7楼: 按你这说法应该不是数据库慢的问题,是网络不好导致

8楼: 你所说的距离100米是指客户机和服务器直接用双绞线连吗?

双绞线的最大距离就支持100米,如果到临界时,网络连接质量可能无法保证。在中间加一台交换机吧。

9楼: 这个估计是网络问题,我们的程序在VPN环境下运行就是由于服务器到电信的带宽不够,运行不了,后面的服务器的改成光缆才可以了,我想你的也一样,先把网络解决了再说

10楼: 我也认为是网络的问题,一千多条数据不算什么,我们都是两个一万条数据的表比较,也没有多慢

11楼: to:fjjb
中间已经有交换机,若没交换机则不能联网。

to:流星雨夜
我的表数据是一千四百多万条,不是一千多条,若在一千多条是不会出现这情况。

12楼: to :蛋炒饭
有没有,一种连接方式:就是我连街上去后,去100万条记录,但他先传递会20万条,但我是用到20万零1条时再次传递20~40万条的记录。 如局域网网络管理软件

13楼: 应该是网络安装的问题....正常情况下..一般五类双绞线可以到100~150米...电脑直接连交换机...如果你慢,而且中间还有交换机...估计你的网线接法有问题...是按国标接水晶头的吗?1 3 2 6 的接法... 电脑网卡和交换机也可能是杂牌不稳定....或者你的网线跟一般电线放在一起也会有不少问题(这时需要有屏蔽的网线)....呵呵...在说硬件问题...:)..提高访问速度..基本那么多数据不会快到那里去了..尽量使用上面的建议,使用分页显示数据(本论坛搜索)..SQL语句尽量简洁..尽量不要使用 * ..服务器是win2000高级服务器版??你的电脑配置高吗?......内存问题SQL会自动处理,一般如果在服务器上再运行其它程序,那你的网络会更慢...

仓库管理软件版14楼: 数据库系统好像没有提供这么智能的方式每次传递多少条
但是可以通过客户端来控制每次取多少条记录,需要你的表有惟一索引
假设你的表的惟一索引是l_id,那么可通过如下方式实现每次取n条
select top n * from table
where l_id > xxx
如果你是通过翻页的方式来取数据的,那么当翻页到第20万条的时候,再调用
select top n * from table
where l_id > xxx1
此处的xxx1是第20万条的编号,如果是一次性取完,那么在取完20万条后,再循环调用一次SQL语句,直至取完。
总之,要提高数据库性能,网络传输的量必须考虑

15楼: 或者将中间所谓的交换机换成HUB试试

在远距离的网络中,HUB会比交换机稳定,不过速度会慢

16楼: 看来楼主对SQL原理还不大熟悉。
为何数据库服务器的内存只上升,不下降,是不是软件有问题。这其实是SQL-SERVER使用内存的策略造成的,而且对于SQL-SERVER这种使用内存的策略也是一种优化策略。其大概的原理是这样的,SQL-SERVER对于查询过的数据在不用时不会立即从内存释放,直到内存用完,有新的查询需要使用内存,再按照一定的算法把一部分数据切换出内存,这样做的理由是磁盘读写是服务器非常耗时的操作,所以尽量使用内存缓存数据。相关的内容可以在微软的技术支持网站上查到。对于这种情况不必感到奇怪,这是一种正常的现象。

17楼: 看了半天,觉得主要问题在于:
1、网络速度问题;
2、sql语句的优化,甚至数据表的优化,如建立索引等等;
3、至于sql server的内存管理,这个请放心,sql server是内存越大越好。

18楼: 我觉得楼主的问题主要是:
1、网络速度原因,尽量用存储过程来实现。过程里面记得加set nocount on
2、SQL优化
我给楼主一个通用分页查询:
--例子
--sp_Pagination ''t_bases'',''*'',''fid'',10,2,0,0,''fid>40''
--对于一些查询是多表关联,建议采用索引视图的方式然后再分页处理

CREATE PROCEDURE sp_Pagination
@tblName varchar(255), -- 表名
@strGetFields varchar(1000) = ''*'', -- 需要返回的列
@fldName varchar(255)='''', -- 排序的字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@doCount bit = 0, -- 返回记录总数, 非 0 值则返回
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(1500) = '''' -- 查询条件 (注意: 不要加 where)
AS
declare @strSQL varchar(5000)
declare @strTmp varchar(110)
declare @strOrder varchar(400)

if @doCount != 0
begin
if @strWhere !=''''
set @strSQL = ''select count(*) as Total from ['' + @tblName + ''] where ''+@strWhere
else
set @strSQL = ''select count(*) as Total from ['' + @tblName + '']''
end

else
begin
if @OrderType != 0
begin
set @strTmp = ''<(select min''
set @strOrder = '' order by ['' + @fldName +''] desc''
end
else
begin
set @strTmp = ''>(select max''
set @strOrder = '' order by ['' + @fldName +''] asc''
end

if @PageIndex = 1
begin
if @strWhere != ''''
set @strSQL = ''select top '' + str(@PageSize) +'' ''+@strGetFields+ '' from ['' + @tblName + ''] where '' + @strWhere + '' '' + @strOrder
else
set @strSQL = ''select top '' + str(@PageSize) +'' ''+@strGetFields+ '' from [''+ @tblName + ''] ''+ @strOrder
--如果是第一页就执行以上代码,这样会加快执行速度
end
else
begin
set @strSQL = ''select top '' + str(@PageSize) +'' ''+@strGetFields+ '' from [''
+ @tblName + ''] where ['' + @fldName + '']'' + @strTmp + ''([''+ @fldName + '']) from (select top '' + str((@PageIndex-1)*@PageSize) + '' [''+ @fldName + ''] from ['' + @tblName + '']'' + @strOrder + '') as tblTmp)''+ @strOrder
if @strWhere != ''''
set @strSQL = ''select top '' + str(@PageSize) +'' ''+@strGetFields+ '' from [''
+ @tblName + ''] where ['' + @fldName + '']'' + @strTmp + ''([''
+ @fldName + '']) from (select top '' + str((@PageIndex-1)*@PageSize) + '' [''
+ @fldName + ''] from ['' + @tblName + ''] where '' + @strWhere + '' ''
+ @strOrder + '') as tblTmp) and '' + @strWhere + '' '' + @strOrder
end
end
exec (@strSQL)
GO

19楼: 建议用视图索引,如果查询要多表关联,过滤条件也差不多的话
建立视图,然后作索引比较好。
其实索引视图的效率很高,但是却很少人经常用。


你可以到微软文档那边找找

20楼:   我以前做过一个系统也遇到过同样的这两个问题,经过测试查找,发现问题不在网络,也不在数据库服务器(这两者只能提高速度到一定水平,解决不了问题)。
  首先数据库里有几千万条数据,是不一需要一次都读出来?(读出来怎么显示,谁能看呀)答案当然是否定的。
  那么解决问题的关键就是每次只读出需要的数据来,这样速度和内存的问题都解决了。
  解决之道就是--分页读取数据。方法有很多,不同的数据库也有不同的方法。

仓库管理软件版21楼: TO:jackwuyes
set nocount on
是什么意思,有什么作用。

22楼: 关注
索引视图有什么做,有谁知道
[:D] 如汽配管理软件

23楼: 這也就是說當用TADODataSet控件OPEN後,本機和數據庫服務器都會占用一定的資源的。
但是用完後就要關閉TADODataSet連接,然後釋放窗體就可以了。
Form.Free;
Form:=Nil;
FreeAndNil(Form);

24楼: 问题虽未解决,先散分……