我有一个相当大的查询,仅需一分钟即可在SSMS中完成,但是当我使用SQLAlchemy
(使用pyodbc
)运行完全相同的查询时,收到以下错误:
[Microsoft][ODBC SQL Server Driver][SQL Server]Could not allocate space for
object 'dbo.SORT temporary run storage: 140753617092608' in database 'tempdb'
because the 'PRIMARY' filegroup is full. Create disk space by deleting unneeded
files, dropping objects in the filegroup, adding additional files to the
filegroup, or setting autogrowth on for existing files in the filegroup. (1105)
(SQLExecDirectW)")
为什么在通过pyodbc
执行查询时,与在SSMS中执行查询相比,查询在tempdb上占用更多的空间,我该如何解决呢?在SQL Server上设置了自动增长(不在%中),并且有可用空间。
编辑1:
这是查询,最终结果大约有25000行。基本上,我查询table1
中每个记录的最新更新。
SELECT field1, field2, ... FROM table1 JOIN ( SELECT field1, field2, ... max(field3) AS maxdate FROM table1 WHERE field4 >= '20180531 17:00' AND field4 < '20180630 17:00' GROUP BY field1, field2, ... ) AS anon_1 ON field1 = anon_1.field1 AND field2 = anon_1.field2 ... AND field3 = anon_1.maxdate WHERE field4 >= '20180531 17:00' AND field4 < '20180630 17:00'
编辑2:
我已经通过使用pymssql
而不是pyodbc
“修复”了此问题。使用该模块,执行时间实际上与SSMS中的相同。显然,这并不能回答为什么pyodbc
破坏tempdb的问题。执行的查询语句相同,只是参数设置略有不同。 pyodbc
使用?
并在最后提供参数,而pymssql
以%(param)s
的形式传递参数。
我有一个很大的查询,仅需一分钟即可在SSMS中完成,但是当我使用SQLAlchemy(使用pyodbc)运行完全相同的查询时,出现以下错误:[Microsoft] [ODBC SQL Server ...] >
我无法回答为什么pyodbc
和pymssql
之间存在差异,但是在这里我要做出一个假设,即通过`pyodbc'运行时,传递给TSQL语句的值是参数化的,以及何时在SSMS中运行时,这些值将被硬编码到TSQL语句中。
如果上述正确,那么它在SSMS中执行得更快的一个原因是,优化器确切知道需要优化的值,因此它可以创建准确的查询计划。如果已将其参数化,则查询优化器必须估计/猜测值是什么,并提出合适的查询计划。通常,猜测并不总是能得出最佳计划,但可以通过处理统计信息,索引甚至修改查询来解决。