如何讓SQLServer 釋放資源?

duanhai 2005-05-16 09:36:37
最近開發了一個項目,開發語言是:Delphi,用的是SOAP的BS結構,發現一個問題,SQLServer使用時,最初在開機時只有10來兆,但內存的占用量一直居高不下,當使用一段時間後,居然占用到700多兆。
正因為這樣,在客戶端使用時總是出現接口錯誤。
現在我們的解決方法是:將中間層Kill掉,再啟動。
但是這樣也不是辦法呀,所以懇請高手們給予解答,這個問題我還會在開發語言中的Delphi中提出.
...全文
354 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
尤里二世 2005-05-21
  • 打赏
  • 举报
回复
這是它(薇軟)本身的問題,我之前也有這樣的問題,不管怎么聯接,聯接的數量怎么小,SQL Server的內存數一定會向上增不會少(當然,你重啟或結束進程是另一事),我做過測試:free聯接只能free 8K多的內存,關閉所有的dataset後也一樣,沒什么變化,好象最多只能free 8K.
也就是一個聯接的內存量.我們現在的做法是:2-3天重啟一下服務器,或結束一下SQLSERVER 這個進程,重新打個sql服務.其實答案也很難找.沒用的.建議換oracle吧..可能會好點.
duanhai 2005-05-19
  • 打赏
  • 举报
回复
to ycyin(齐格红茶)
如果用BS結構,在SQLServer中,只會有一個中間層的連接,所以應該不是這個連接會的問題
随风201333 2005-05-18
  • 打赏
  • 举报
回复
gz
ycyin 2005-05-18
  • 打赏
  • 举报
回复
会不会是因为SQL Server在安装的时候用户连结数设得小了?而Delphi程序中有过多的TAdoConnection控件用完以后没有断开,导致超过了连接数目。
duanhai 2005-05-18
  • 打赏
  • 举报
回复
to Hopewell_Go(好的在后頭﹗希望更好﹗﹗)
您所說的每操作一個數據或表都要在語句裡釋放是什麼意思?

是不是說用完之後要將Active置為False?如果僅是這一點,我已經做到了。

另外我做過測試,用一個TAdoConnection連接SQL,
連接成功後,SQL的占用內存會增加8K左右,
然後我再加入一個TAdoQuery,並將其Connection屬性選擇為TAdoConnection
並執行一條查詢,諸如:select * from tablename
這時,SQL占用內存增加4K左右(當然這個視表的大小、數據量而定)
可是我將其Active置為False這後,居然也沒有看到SQL占用內存減少
ycyin 2005-05-17
  • 打赏
  • 举报
回复
这个问题我们也遇到了,SQL Server的内存占用只进不出,一路牛势。而我们也曾经就这个问题咨询过微软的工程师,得到的答复是这个是SQL Server2000内存管理上的缺陷。
我们也试过设定SQL Server可以占用的内存上限,但是效果并不太理想。最后还是将数据库单独放在一台服务器上——内存占用达nGB(-_-!)。
duanhai 2005-05-17
  • 打赏
  • 举报
回复
to zjcxc(邹建)
你所說的那些,我也知道
但我就是不知道我的問題該怎麼解決,即在我的項目中,客戶端提交數據的時候,老是出現接口錯誤

to nz()
呵呵~~~
ghostzxp 2005-05-17
  • 打赏
  • 举报
回复
mark

Well 2005-05-17
  • 打赏
  • 举报
回复
我想應該是出在delphi的程序語言裡吧

也就是每操作一個數據或表都要在語句裡釋放。

不能在後台運行

duanhai 2005-05-17
  • 打赏
  • 举报
回复
to ycyin(齐格红茶)
說是SQL Server 2000的內存管理上的缺陷,這個我在以前的貼子裡面也看到過

看來也只有將數據庫單獨開來了

不過我的那個中間層老是出錯,真不知是什麼問題,出錯之後,非得Kill掉,客戶端才能用

郁悶吶~~~
nz 2005-05-16
  • 打赏
  • 举报
回复
我的作法:一个月要求管理员重启服务器一次.
zjcxc 元老 2005-05-16
  • 打赏
  • 举报
回复
下面是sql内存管理机制的说明.


动态管理 Windows NT 和 Windows 2000 上的内存
当 SQL Server 数据库引擎在 Microsoft® Windows NT® 或 Windows® 2000 上运行时,其默认内存管理行为并不是获取特定的内存量,而是在不产生多余换页 I/O 的情况下获取尽可能多的内存。为此,数据库引擎获取尽可能多的可用内存,同时保留足够的可用内存以防操作系统交换内存。

SQL Server 实例在启动时通常获取 8 到 12 MB 的内存以完成初始化过程。当实例完成初始化后,就不会再获取更多的内存,直到用户连接到该实例并开始产生工作负荷。这时,该实例根据需要不停地获取内存以支持工作负荷。随着更多的用户连接并运行查询,SQL Server 将获取支持需求所需的额外内存。该实例将继续获取内存直到达到自身的内存分配目标,并且直到达到该目标的下限才会释放任何内存。

为了在不产生多余换页 I/O 的情况下获取尽可能多的内存,SQL Server 的每个实例都设置一个内存获取目标,直到计算机的可用物理内存在 4 MB 到 10 MB 的范围内。之所以选择该范围是因为测试表明 Windows NT 和 Windows 2000 都有最小内存交换,直到内存分配等于可用物理内存减去 4 MB。工作负荷处理任务重的 SQL Server 实例保留的可用物理内存为范围的较低端 (4 MB);工作负荷处理任务轻的实例保留的可用物理内存为范围的较高端 (10 MB)。

SQL Server 实例的目标随工作负荷的改变而变化。当更多的用户连接并产生更多的工作时,该实例倾向于获取更多的内存以使可用的内存保持在 4 MB 的限制以下。当工作负荷减轻时,该实例将其目标调整为 10 MB 的可用空间,并释放内存给操作系统。将可用空间量保持在 10 MB 与 4 MB 之间可防止 Windows NT 或 Windows 2000 过多执行换页操作,同时使 SQL Server 得以获得尽可能最大的高速缓冲存储器而不至引起额外的交换。

实例的目标内存设置与数据库缓冲池的页相对于可用池大小的需求有关。在任何即时点,缓冲区页的总需求取决于满足所有当前执行的查询所需的数据页数。如果相对于高速缓冲存储器内的页数,数据页的需求很大,则当前在缓冲区内的每一页很可能在相对较短的时间内由新页替换。这可由"缓冲区管理器"对象的"页生命期"性能计数器来度量。对于相对较小的缓冲区有较高需求的情况将生成短生命期,而纯粹的影响就是使 I/O 增加,因为在页可由多个逻辑读取引用之前往往要被重写。为减轻这个问题,数据库引擎可以获取更多的内存以增加高速缓冲存储器的大小。当页生命期长时,数据库引擎将可用内存定位于目标的高端 (10 MB);而当页生命期短时,数据库引擎定位于目标范围的低端 (4 MB)。

随着其它应用程序在运行 SQL Server 实例的计算机上启动,它们消耗内存致使可用物理内存量降到 SQL Server 的目标以下。SQL Server 实例于是从其地址空间释放足够内存,以使可用内存量回到 SQL Server 的目标。如果有其它应用程序停止运行而使可用内存增多,SQL Server 实例将增加其内存分配大小。SQL Server 可以每秒释放并获取几 MB 字节的内存,这使它得以根据内存分配变化作出快速调整。

zjcxc 元老 2005-05-16
  • 打赏
  • 举报
回复
这个是sql server的内在管理机制决定的.

如果你的服务器除了提供sql server服务外,还要为其他应用服务,则应该限制sql server使用的内存的大小.

企业管理器--右键sql实例--属性--内存--将内存限制在一个范围内. 然后重新启动sql服务使设置生效.
子陌红尘 2005-05-16
  • 打赏
  • 举报
回复
1、检查连接到SQL Server服务器的应用程序,看是否存在连接使用完毕之后未关闭的情况。

2、限制服务器端SQL Server使用操作系统内存的最大值

3、如果应用服务程序和SQL Server在同一台服务器上,建立将前者转移到单独的服务器

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧