通过使用内存优化更快的SQL临时表和表变量

时间:2018-06-14 04:39:11

标签: sql-server azure-sql-database connection-pooling temp-tables memory-optimized-tables

This Microsoft Doc中的场景C描述了如何将作用于连接的临时表替换为内存优化表。该方案使用过滤器安全策略调用函数来确定@@ spid是否与Memory-Optimized表中的SpidFilter列匹配。

这适用于.NET连接池吗?我希望@@ spid会返回相同的数字,因为连接会被反复使用。 .NET通过调用sp_reset_connection清除会话范围的临时表,但这不会清除内存优化表,或更改@@ spid。也许可以添加sys.dm_exec_sessions的session_id以使其在连接池环境中工作?

1 个答案:

答案 0 :(得分:1)

在Microsoft支持的帮助下,我能够获得有关ASP.NET连接池的必要详细信息,以解决此问题。的确,ASP.NET线程将共享相同的SPID,但绝不会在同一时间。仅在先前的线程不再使用该连接之后,才为该线程分配连接。连接池不会减少所需的连接数,只会减少需要打开和关闭连接的次数。

这是关于连接池的很好的文档,尽管没有区别。 https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql-server-connection-pooling

  

请注意,方案C特别注意:“用DELETE FROM dbo.soSessionC替换代码中的CREATE TABLE #tempSessionC语句,以确保会话不会暴露给具有相同session_id的先前会话插入的表内容。” –我一个

由于一次仅一个线程将使用该连接,这就足够了。如果该表在使用后也没有删除,它将继续消耗内存(尤其是Azure中的宝贵内存),直到另一个线程碰巧使用具有相同SPID的连接为止。