Sql server 对同一个表进行两次连接时执行缓慢的T-SQL查询

Sql server 对同一个表进行两次连接时执行缓慢的T-SQL查询,sql-server,performance,tsql,indexing,inner-join,Sql Server,Performance,Tsql,Indexing,Inner Join,我正在努力弄清楚下面显示的T-SQL查询发生了什么 您将看到同一个表的两个内部联接,尽管联接条件不同。第一个连接本身大约在21秒内运行,如果我自己运行第二个连接,它将在大约27秒内完成 如果我将两个连接都保留在原位,查询将不断运行,直到我最终停止查询。适当的索引似乎已就位,我知道此查询运行在不同的环境中,马力较小,唯一的区别是另一台服务器运行的是SQL server 2012,而我运行的是SQL server 2016,尽管数据库处于2012兼容模式: 此连接将在约21秒内运行 选择 计数* 从

我正在努力弄清楚下面显示的T-SQL查询发生了什么

您将看到同一个表的两个内部联接,尽管联接条件不同。第一个连接本身大约在21秒内运行,如果我自己运行第二个连接,它将在大约27秒内完成

如果我将两个连接都保留在原位,查询将不断运行,直到我最终停止查询。适当的索引似乎已就位,我知道此查询运行在不同的环境中,马力较小,唯一的区别是另一台服务器运行的是SQL server 2012,而我运行的是SQL server 2016,尽管数据库处于2012兼容模式:

此连接将在约21秒内运行

选择 计数* 从…起 dbo.as.s 内连接 dbo.SPONSORSHIPTRANSACTION作为st 在st.SponsorshipCommitteId=s.SponsorshipCommitteId上 和st.TRANSACTIONSEQUENCE=选择MINTRANSACTIONSEQUENCE 来自dbo.SPONSORSHIPTRANSACTION作为ms 其中ms.SPONSORSHIPCOMMITMENTID=s.SPONSORSHIPCOMMITMENTID 和ms.TARGETSPONSORSHIPID=s.ID 此连接将在约27秒内运行

选择 计数* 从…起 dbo.AS.s 内连接 dbo.SPONSORSHIPTRANSACTION作为lt.SPONSORSHIPCOMMITMENTID=s.SPONSORSHIPCOMMITMENTID上的lt 和lt.TRANSACTIONSEQUENCE=选择MAXTRANSACTIONSEQUENCE 来自dbo.SPONSORSHIPTRANSACTION作为ms 其中ms.SPONSORSHIPCOMMITMENTID=s.SPONSORSHIPCOMMITMENTID 和ms.CONTEXTSPONSORSHIPID中的s.ID, TARGETSPONSORSHIPID女士, DECLINEDSPONSORSHIPID女士 以及《行动守则》第9章 这两项都被考虑在内。您通常应该避免这种模式,因为它会导致所谓的RBAR。。。这是一排又一排令人痛苦的。在您专注于对这个特定查询进行故障排除之前,我建议您重新检查查询本身,看看是否可以用一种更基于集合的方法来解决这个问题。您会发现,在大多数情况下,您有其他方法来实现这一点,并大幅降低成本

例如:

选择 总数 ,行_序列 从…起 选择 总数=计数* ,row_sequence=按st.TRANSACTIONSEQUENCE asc超额订购的row_编号 从…起 dbo.as.s 内部联接dbo.SPONSORSHIPTRANSACTION作为st 在st.SponsorshipCommitteId=s.SponsorshipCommitteId上 as x 哪里 x、 行_序列=1 这是一个未经测试的快速示例。作为将来的参考,如果您想要最佳答案,最好生成一个临时表或测试数据集,以便有人能够提供完整的工作示例

我举的例子说明了所谓的a。当你看到单词序列,需要在一个组中的第一个/最后一个,以及更多的时候,看看它们,帮助你选择结果


希望这能给你一些想法!欢迎来到堆栈溢出!谢谢谢尔顿!不幸的是,这是一个来自第三方产品的codegen查询,尽管我很想重写该查询,但我必须返回给他们并报告这一问题。谢谢你的及时回复!哦修改供应商查询代码总是很有趣的