微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在FireDAC上并且仅在FireDAC上,使用标量函数的SQL Server查询非常慢

如何解决在FireDAC上并且仅在FireDAC上,使用标量函数的SQL Server查询非常慢

我有一个sql Server查询,它可以在毫秒内在sql Server Management Studio或TADOQuery上运行,但是在TFDQuery上运行需要17秒。

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

if OBJECT_ID('tempdb..#DADES') is not null DROP TABLE #DADES

SELECT 'O' tipus,l.numero as Comanda,o.NumeroOrdre as Ordre,ag.nom as Client,c.Referencia,o.estat,max(a.Descripcio) descripcio,ag.provincia,c.ProvinciaEnvio,c.poblacioEnvio,c.codiPostalEnvio,c.adreSAEnvio,c.telefonoEnvio,c.Transportista,o.ObservacionsTransport,o.DataCarrega,o.DataEntrega,case when tipusOrdre=1 then 'PANEL' else case when tipusOrdre=2 then 'TAPAJUNT' else 'ALTRES' end end Tipus2,dbo.f_palets_pendents(o.NumeroOrdre) as paletsPendents,dbo.f_palets_assignats(o.NumeroOrdre) as paletsAssignats,c.ports,sum(dbo.f_pes_linia_comanda(l.numero,L.linia)) pes_lin,c.envio
INTO #DADES
FROM OrdresFabricacio o
     LEFT OUTER JOIN LiniesComandesvendes l ON o.NumeroOrdre=l.numeroordre
     LEFT OUTER JOIN CapsaleraComandesvendes c ON c.Numero=l.numero
     LEFT OUTER JOIN CapsaleraAgenda ag ON ag.codi=c.client
     LEFT OUTER JOIN Articles a ON a.codi=l.article
WHERE o.Transport=63163
GROUP BY l.numero,o.NumeroOrdre,ag.nom,o.tipusOrdre,c.envio
OPTION(RECOMPILE)

认使用所有选项在新的TFDConnection和TFDQuery上运行它们。使用SET TRANSACTION ISOLATION LEVEL READ COMMITTED,我可以确保它在与sql Server Management Studio相同的隔离级别上运行。使用into #DADES强制不返回任何数据(而是将其复制到临时表中),因此我可以丢弃任何潜在的问题并延迟将数据提取到本地缓冲区中。最后,我使用WITH(RECOMPILE)强制sql Server重新评估查询的执行计划(以防止使用一些过时的统计计划)。

此外,我还尝试了禁用TFDConnection的ResourceOptions上的所有Command Text Processing选项,但没有任何改善。

该问题似乎与dbo.f_pes_linia_comanda()函数有关,因为用表达式替换它会使同一查询在毫秒内正确运行。像这样的东西:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

if OBJECT_ID('tempdb..#DADES') is not null DROP TABLE #DADES

SELECT 'O' tipus,sum(l.Quantitat) pes_lin,c.envio
INTO #DADES
FROM OrdresFabricacio o
FROM OrdresFabricacio o
     LEFT OUTER JOIN LiniesComandesvendes l ON o.NumeroOrdre=l.numeroordre
     LEFT OUTER JOIN CapsaleraComandesvendes c ON c.Numero=l.numero
     LEFT OUTER JOIN CapsaleraAgenda ag ON ag.codi=c.client
     LEFT OUTER JOIN Articles a ON a.codi=l.article
WHERE o.Transport=63163
GROUP BY l.numero,c.envio
OPTION(RECOMPILE)

所以我的问题是,是否有人知道为什么FireDAC具有某些标量函数时运行查询的速度会变慢?为什么与直接向sql Server Management Studio上的引擎直接发送完全相同的查询相比,它们使用不同的执行计划? ,有没有一种方法可以获取用于TFDQuery的执行计划,以便我可以看到它出了什么问题并尝试解决该问题?

谢谢。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。