查询在SSMS中运行1分钟,但是用pyodbc(sqlalchemy)填充了tempdb

问题描述 投票:0回答:1

我有一个相当大的查询,仅需一分钟即可在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 ...] >

python sql-server sqlalchemy pyodbc
1个回答
0
投票

我无法回答为什么pyodbcpymssql之间存在差异,但是在这里我要做出一个假设,即通过`pyodbc'运行时,传递给TSQL语句的值是参数化的,以及何时在SSMS中运行时,这些值将被硬编码到TSQL语句中。

如果上述正确,那么它在SSMS中执行得更快的一个原因是,优化器确切知道需要优化的值,因此它可以创建准确的查询计划。如果已将其参数化,则查询优化器必须估计/猜测值是什么,并提出合适的查询计划。通常,猜测并不总是能得出最佳计划,但可以通过处理统计信息,索引甚至修改查询来解决。

© www.soinside.com 2019 - 2024. All rights reserved.