Python 通过pymssql从远程ubuntu计算机到MsSQL数据库的MsSQL查询太长

Python 通过pymssql从远程ubuntu计算机到MsSQL数据库的MsSQL查询太长,python,sql-server,azure,ubuntu,Python,Sql Server,Azure,Ubuntu,我的基础架构位于Microsoft Azure环境中。另外,我在本地网络上有一个Ubuntu虚拟机。 首先,我在SQLManagementStudio中执行一个查询,它在不到一秒钟的时间内就能工作。 然后我尝试使用Ubuntu中的pymssql执行相同的查询,大约需要50秒 import pymssql import pandas as pd qtext = ''' IF OBJECT_ID('tempdb..#ids') IS NULL SELECT [Rich

我的基础架构位于Microsoft Azure环境中。另外,我在本地网络上有一个Ubuntu虚拟机。 首先,我在SQLManagementStudio中执行一个查询,它在不到一秒钟的时间内就能工作。 然后我尝试使用Ubuntu中的
pymssql
执行相同的查询,大约需要50秒

import pymssql   
import pandas as pd

qtext = '''
    IF OBJECT_ID('tempdb..#ids') IS NULL
        SELECT [RichTrackId]
              ,max(PointDate) as max_date
        into #ids
        FROM [MobileServiceStage].[dbo].[RichTrackPoints] (nolock)
        where DeviceToken = 12345
        group by [RichTrackId]

    select 
        rtp.[RichTrackId],
        max(Latitude) as Latitude,
        max(Longitude) as Longitude
    from [MobileServiceStage].[dbo].[RichTrackPoints] as rtp (nolock)
    inner join #ids
    on rtp.DeviceToken = %(user)s and 
        rtp.[RichTrackId] = #ids.[RichTrackId] and rtp.PointDate = #ids.max_date
    group by rtp.[RichTrackId], rtp.PointDate
    order by rtp.PointDate
'''

conn = pymssql.connect(server=server, user=user, password=pas)
df = pd.read_sql(qtext, conn)
我的分析器显示问题出在pymssql的
execute()
方法中

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
     1   51.896   51.896   51.896   51.896 {method 'execute' of 'pymssql.Cursor' objects}

这怎么可能?我认为查询文本不是瓶颈,查询是在SQL Management Studio中优化和测试的。

SSMS只是一个客户端,它不会优化任何东西。从SSM运行查询需要多长时间?执行计划是什么?您是否已经遇到性能或阻塞问题?这就是您使用
NOLOCK
读取脏数据的原因吗?什么是
=%(用户)s
?这不是有效的SQL。您不能在SSMS中运行此查询,这意味着您测试了不同的内容。您是否使用字符串替换来生成最终查询,即使您仅使用单个设备的数据填充临时表?%(用户)s仅为12345正如我所说的,这不是有效的SQL,也不是参数。这意味着这不是在SSMS中尝试的查询。在任何情况下,
NOLOCK
语句都是一种非常强烈的气味,表明存在阻塞问题。我怀疑SSMS是针对一个测试数据库使用的,而这个查询是针对一个生产表的。由于临时表没有主键和索引,所以这个查询可以很容易地强制进行全表扫描。联接必须扫描两个表才能找到匹配的行。CTE不必这样做,它将使用原始表的索引。如果有很多设备写入表,查询将无法在很长一段时间内获取整个表的共享锁(扫描所需)。使用快照隔离可以克服这一问题,但实际上修复查询会更好