在本例中,我们将 SQL Server 与 SQLAlchemy 结合使用。当查看我们的计划缓存时,我们注意到数以万计的一次性临时编译计划。如您所知,这会占用大量内存,并且返回的每个查询看起来都与此类似,其值硬编码在查询文本中:
SELECT first_name, last_name FROM dbo.[user] WHERE username = 'abc123'
Run Code Online (Sandbox Code Playgroud)
用于生成上面查询的 python 代码如下所示:
SELECT first_name, last_name FROM dbo.[user] WHERE username = 'abc123'
Run Code Online (Sandbox Code Playgroud)
我的问题:有谁知道为什么会发生这种情况,或者如何确保我们收到从 SQLAlchemy ORM 发送的准备好的语句?如果可能的话,我们不想启用强制参数化。
查询以查找一次性临时编译计划:
SELECT TOP(500) DB_NAME(t.[dbid]) AS [Database Name], t.[text] AS [Query Text],
cp.objtype AS [Object Type], cp.cacheobjtype AS [Cache Object Type], cp.usecounts,
cp.size_in_bytes/1024 AS [Plan Size in KB]
FROM sys.dm_exec_cached_plans AS cp WITH (NOLOCK)
CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS t
WHERE cp.cacheobjtype = N'Compiled Plan'
AND cp.objtype IN (N'Adhoc')
AND …Run Code Online (Sandbox Code Playgroud)