Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 重复查询SQL Server(循环)占用的内存不';t释放回系统中_Sql Server 2008_Vb.net 2010 - Fatal编程技术网

Sql server 2008 重复查询SQL Server(循环)占用的内存不';t释放回系统中

Sql server 2008 重复查询SQL Server(循环)占用的内存不';t释放回系统中,sql-server-2008,vb.net-2010,Sql Server 2008,Vb.net 2010,我有一个VB web应用程序,它从一个包含大约300000++行的CSV文件中读取数据。 应用程序将逐行读取,对于每一行,它将在sql server数据库中查询一个表,其中包含大约100000++条记录,并根据查询结果执行其他操作。sqlservr.exe使我的4GB开发机器的内存消耗达到最大 因此,我创建了一个简单的应用程序来测试sql server在循环查询方面的性能 Dim Connection As New SqlConnection(ConfigurationManager.Conne

我有一个VB web应用程序,它从一个包含大约300000++行的CSV文件中读取数据。 应用程序将逐行读取,对于每一行,它将在sql server数据库中查询一个表,其中包含大约100000++条记录,并根据查询结果执行其他操作。sqlservr.exe使我的4GB开发机器的内存消耗达到最大

因此,我创建了一个简单的应用程序来测试sql server在循环查询方面的性能

Dim Connection As New SqlConnection(ConfigurationManager.ConnectionStrings("SiteSqlServer").ConnectionString)
Dim Command As New SqlCommand("", Connection)
Connection.Open()
For i As Integer = 0 To 20000
    Command.CommandText = "SELECT CustomerID FROM Customer WHERE CustomerID = " & i
    Command.ExecuteScalar()
Next
Connection.Close()
每次执行此代码时,sqlservr.exe都会占用额外的100MB++内存,即使在代码完成执行后,它也不会将其释放回去

这正常吗?有没有办法减轻这种影响?

试试这个:

For i As Integer = 0 To 20000
    Command.CommandText = "SELECT CustomerID FROM Customer WHERE CustomerID = " & i
    Command.ExecuteScalar()
    Command.Dispose()
Next

Dispose()
调用应该会在您身后清理干净,并可能会减轻影响。

Sql Server不会立即将内存释放回系统,原因有几个(请参阅:)

无论如何,您应该使用存储过程而不是动态sql查询:sql Server可以更高效地工作,因为您的sql字符串不必每次都进行解析

确实是这样,但请仔细检查-确保您查询的表已正确索引


您还可以考虑预先将SQLServer文件加载到SQLServer中,如果可行的话。将.csv数据放在sql server索引表中将使一切变得更容易:无论您如何优化它们,到sql server的10万次往返都将消耗资源,您可以利用连接和服务器端操作轻松保存这些资源。

是的,这是正常的。SQL Server通常不会在获得内存后释放内存。它的目的是尽可能快地向您提供结果,如果它有缓存在RAM中的数据,则可以更快地查询。SQL Server可能会重新调整其内部获取的内存块的用途,但不会在运行时释放它们。这是故意的


这也是为什么一般情况下,您应该在生产环境中在单独的机器上运行SQL Server,这样它就不会与其他应用程序争夺内存(如IIS)。

这与使用内存的sqlservr.exe无关。处置!=释放内存。假设有一些服务器资源支持已执行的命令:
Dispose
调用
SqlCommand
应通知服务器不再需要这些资源。与所有这些细节一样,无法判断资源是否会立即返回到系统,但如果您正在运行大量这些东西,您可以自行清理。同意,您应该始终“处置”您的
IDisposable
s,我只是指出这可能不是问题所在。因此,如果这是正常情况,那么如果所有内存都用完,sql server会崩溃吗?或者,回收它们并完成任务是否足够智能?不,SQL Server不会崩溃。它可能会耗尽您所有的可用内存,但它会回收它声称用于缓存其他数据的内存。