当前位置:编程学习 > C#/ASP.NET >>

sql内存问题,高手请进

对sqlserver用存储过程做插入操作,流量大约每分钟10万条,sql内存不断增长,内存设置设定上限没有任何作用,查microsoft技术文档说会一直涨到内存基本用完为止,请问如何减少sql内存开销?
感觉用存储过程比c#中直接写sql语句更消耗sql内存,是不是这样?
有什么好的插入方法可以减少sql内存开销?
谢谢。 --------------------编程问答-------------------- 顶起 --------------------编程问答-------------------- 关注,帮顶 --------------------编程问答-------------------- 数据量太大啦,尝试把sql分开执行吧,执行几万条,释放一下资源,在继续执行 --------------------编程问答-------------------- 多线程 --------------------编程问答-------------------- To loveme1204 
数据量太大啦,尝试把sql分开执行吧,执行几万条,释放一下资源,在继续执行
-------
有没有具体一点的操作? --------------------编程问答-------------------- 内存体系结构 :

Microsoft SQL Server 2005 根据需要动态地获取与释放内存。虽然该选项仍然存在且在有些环境下需要用到,但通常情况下管理员不必指定为 SQL Server 分配多少内存。

SQL Server 2005 Enterprise Edition 支持地址窗口化扩展插件 (AWE),从而允许在 32 位版本的 Microsoft Windows 操作系统上使用 4 GB 以上的物理内存。最多可支持 64 GB 的物理内存。运行于 Microsoft Windows 2000 上的 SQL Server 实例使用静态 AWE 内存分配,而运行于 Microsoft Windows 2003 上的实例使用动态 AWE 内存分配。

所有数据库软件的一个主要设计目标是尽量减少磁盘 I/O,因为磁盘的读写操作是最费资源的操作之一。SQL Server 在内存中生成一个缓冲池来存放从数据库读取的页。SQL Server 中的大量代码专门用于尽量减少磁盘与缓冲池之间的物理读写次数。SQL Server 设法在以下两个目标之间达到平衡:

防止缓冲池变得过大,从而导致整个系统内存不足。


尽量增加缓冲池达的大小,以便尽量减少数据库文件的物理 I/O。


默认情况下,SQL Server 2005 的各个版本动态管理每个实例占用的内存。在 Windows 2000 和更高版本的操作系统上,SQL Server 管理映射 AWE 的内存的方法有所不同。

注意:  
在负荷过多的系统上,某些需要大量内存才能运行的大型查询会因为无法获得请求的最小内存量而在等待内存资源时收到超时错误消息。为了解决该问题,应增加 query wait 选项的值。对于并行查询,可以考虑减少 max degree of parallelism 选项的值。
 

注意:  
在负载过重而内存不足的系统中,对于查询计划中带有合并联接、排序和位图的查询,如果无法获得位图所需的最小内存量,可以删除位图。这会影响查询的性能,并且如果排序过程所需的内存过大,就会增加 tempdb 数据库中工作表的使用量,从而导致 tempdb 增大。若要解决此问题,可添加物理内存或优化查询以使用其他更迅速的查询计划。有关优化信息,请参阅优化 tempdb 性能和如何优化数据库。 


min server memory 和 max server memory 的影响:


min server memory 和 max server memory 配置选项建立 Microsoft SQL Server Database Engine 缓冲池使用的内存量的上限和下限。缓冲池并不立即获取 min server memory 中指定的内存量。缓冲池启动时只使用初始化所需的内存。随着数据库引擎 工作负荷的增加,它将继续获取支持工作负荷所需的内存。在达到 min server memory 中指定的内存量之前,缓冲池不会释放它获取的任何内存。达到 min server memory 后,缓冲池将使用标准算法,根据需要来获取和释放内存。唯一的区别是缓冲池从不将内存分配降到 min server memory 所指定的水平下,也从不获取超过 max server memory 所指定水平的内存。

注意:  
作为进程的 SQL Server 将获取超过 max server memory 选项所指定的内存。内部和外部组件都可以分配缓冲池以外的内存,这将占用额外内存,但是分配给缓冲池的内存通常表示 SQL Server 占用的内存的最大部分。
 


数据库引擎 获取的内存量完全取决于放置在实例上的工作负荷。不处理很多请求的 SQL Server 实例可能永远达不到 min server memory。

如果为 min server memory 和 max server memory 指定相同的值,则一旦分配给数据库引擎的内存达到该值,数据库引擎 将停止为缓冲池动态释放和获取内存。

如果在运行 SQL Server 实例的计算机上频繁启动或停止其他应用程序,启动这些应用程序所需的时间可能会因 SQL Server 实例分配和释放内存而延长。另外,如果 SQL Server 是几个在一台计算机上运行的服务器应用程序中的一个,系统管理员可能需要控制分配给 SQL Server 的内存量。在这些情况下,可以使用 min server memory 和 max server memory 选项控制 SQL Server 可以使用的内存量。有关详细信息,请参阅服务器内存选项。 


--------------------编程问答-------------------- 简单点... 设置 min server memory 和 max server memory 即可 --------------------编程问答-------------------- 数据量太大啦,尝试把sql分开执行吧,执行几万条,释放一下资源,在继续执行

--------------------

SQL 使用的内存是由 SQL 自己释放的...你无法介入

一次提交其实性能更高....

只是 字符串太大了 --------------------编程问答-------------------- 楼上的,请问如何一次提交多条记录? --------------------编程问答-------------------- 还有,自动释放是很慢的,基本没用,最小最大内存值设定早试过了,一样会突破,基本设与不设一样。请问有没有手动释放的方法?谢谢 --------------------编程问答-------------------- 如何提交?
你客户端有多少条SQL....一起提交就可以啊


最大内存内存不能太少...比如你设置为 32 M 那当然没用啊...因为 32M 根本是最小的 --------------------编程问答-------------------- SQL Server 内存概念中有 Connection Memory、Granted Workspace Memory、Lock Memory、Maximum Workspace Memory、Optimizer Memory、SQL Cache Memory、Target Server Memory、Total Server Memory。

经测试,设置 max server memory 可以影响 Target Server Memory,Total Server Memory 值在  min server memory  与 Target Server Memory(max server memory) 之间浮动。

其他值不受 min server memory 和 max server memory 影响。

当 min server memory 和 max server memory 过小时,查询比较慢,大时查询比较快。

所以设置 min server memory 和 max server memory 是有作用的。 --------------------编程问答-------------------- 楼上的这些你有没有实际测试过,这些办法早试过多少次了啊,谁有实际起作用的办法啊。 --------------------编程问答-------------------- 12 楼的内容我是警告测试写出来的,不信你可以测试一下 --------------------编程问答-------------------- 12 楼的内容我是经过测试写出来的,不信你可以测试一下 --------------------编程问答-------------------- 请问你的流量是多少每分钟?是调用的存储过程还是直接sql?难道你的 max   server   memory   没有突破吗?是设成什么值?你的内存和cpu是什么能不能详细一点,谢谢。 --------------------编程问答-------------------- 我是测的啊,动态最大最小值设定过,固定值也试过,没用啊,最多是长的慢一点,max server memory设了比没设长的慢一点而已。 --------------------编程问答-------------------- 我设置为 1 到 16m

刚才测试了一下:


select * from 
(select * from tc_friend union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend
 union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend
 union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend
 union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend
 union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend
 union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend
 union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend
 union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend
 union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend
 union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend

)
 as f left join tc_sales_order_m as m on m.cust_id = f.friend_id left join tc_sales_order_d as d on d.so_id = m.so_id


这个返回 (29600 行受影响)


select * from 
(select * from tc_friend union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend
 union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend
 union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend
 union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend
 union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend
 union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend
 union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend
 union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend
 union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend
 union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend
 union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend
 union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend
 union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend
 union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend
 union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend
 union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend
 union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend
 union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend
 union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend
 union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend union all select * from tc_friend

)
 as f left join tc_sales_order_m as m on m.cust_id = f.friend_id left join tc_sales_order_d as d on d.so_id = m.so_id



返回 错误:
消息 701,级别 17,状态 123,第 1 行
没有足够的系统内存来运行此查询。

而 Target Server Memory、Total Server Memory 一直为 16384 kb,最大值、最小值、最后值、平均值一直是 16384


内存 1g, cpu pd 2.8

个人开发的..不是服务器
--------------------编程问答-------------------- 返回   错误: 
消息   701,级别   17,状态   123,第   1   行 
没有足够的系统内存来运行此查询。 

而我的物理内存还有 300 多M空着....呵呵

所以我认为还是有用啊 --------------------编程问答-------------------- 哦...上面测试的时候设置的是 8 到 16 --------------------编程问答-------------------- 哦...上面测试的时候设置的是 8 到 16m --------------------编程问答-------------------- 后来我设置为 16 到 64 m

第一条 SQL 的运行速度快了 80% (3000/12000)
第2条也可以运行成功

Target   Server   Memory、Total   Server   Memory   也增大了 --------------------编程问答-------------------- 你要执行不同的存储过程,或不断的少量不同的SQL操作,测试环境为每分10W次以上,因为相同操作缓存后没变化就不长了,以后就只长变化的部分,不同的操作并是多用户的你会发现内存很快就超过设置值,谢谢您的交流,呵呵.
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,