У меня довольно большой запрос, который в 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)")
Почему запрос занимает больше места в базе данных tempdb при выполнении через pyodbc
, чем при выполнении в SSMS, и как я могу решить эту проблему?На 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
.