Запрос выполняется в SSMS за 1 минуту, но заполняет базу данных tempdb pyodbc (sqlalchemy) - PullRequest
0 голосов
/ 27 сентября 2019

У меня довольно большой запрос, который в 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.

1 Ответ

0 голосов
/ 28 сентября 2019

Я не могу ответить, почему существуют различия между pyodbc и pymssql, однако я собираюсь сделать здесь предположение, что при запуске через `pyodbc 'значения, передаваемые в оператор TSQL, параметризуются, ипри работе в SSMS значения жестко запрограммированы в операторе TSQL.

Если вышеприведенное верно, то одна из причин того, что он выполняется быстрее в SSMS, заключается в том, что оптимизатор точно знает, для каких значений он должен оптимизировать,так что он может создать точный план запроса.Если он параметризован, то оптимизатор запросов должен оценить / угадать значение и составить подходящий план запроса.Часто предположение не всегда дает лучший план, но его можно обойти, поиграв со статистикой, индексами или даже поработав с запросом.

Так что вам нужно подробно рассмотреть планы запросов.для всех сценариев, чтобы получить лучшую картину, почему есть различия.

...