【问题标题】:CTE's being called multiple times?CTE 被多次调用?
【发布时间】:2020-10-22 15:52:31
【问题描述】:

我的任务是调查一个非常慢的 SQL 查询。如果我对 CTE 的理解是正确的,那么每次从外部查询调用 CTE 时都会调用它们。

WITH 

UserAccount 
    AS
        (
            SELECT uaa.AccountId FROM PaymentInitiation.UserAccountAccess uaa
            WHERE uaa.UserId = @userId
        ),
        
CTE_TransactionId (TransactionId)
    AS
        (
            SELECT TOP 100 TransactionId 
            FROM   PaymentInitiation.TransactionMetaDataDebit T 
            JOIN   UserAccount UA ON T.AccountId = UA.AccountId  
            WHERE   T.TransactionId < @seekPoint ORDER BY T.TransactionId DESC
        ) 
        
SELECT 
    PT.Id,
    InstructionId,
    ContractReference,
    CpgReference,
    ModuleTypeId,
    ProductType,
    PT.ModifiedAt,
    VirtualAccountId,
    CounterpartyExchangeRate 
FROM PaymentInitiation.PaymentTransactions PT 
JOIN CTE_TransactionId P ON PT.Id = P.TransactionId

这个查询会导致一个带有嵌套循环和大量执行的执行计划。

所以我的问题是真的 - 是否是 CTE 导致查询阻塞,因为它是在集合中的每一行上执行的?

还是我看错了?

非常感谢。

【问题讨论】:

  • 请解释代码试图做什么。样本数据和期望的结果会有所帮助。

标签: sql sql-server sql-server-2012


【解决方案1】:

我认为你希望得到这样的结果

with CTE_TransactionId (TransactionId) AS (
    SELECT TOP 100 TransactionId 
    FROM   PaymentInitiation.UserAccountAccess uaa 
            join PaymentInitiation.TransactionMetaDataDebit T on uaa.AccountId=T.AccountId
    WHERE  UAA.UserId=@userId 
            and T.TransactionId < @seekPoint 
    ORDER BY T.TransactionId DESC) 
SELECT 
    PT.Id,
    InstructionId,
    ContractReference,
    CpgReference,
    ModuleTypeId,
    ProductType,
    PT.ModifiedAt,
    VirtualAccountId,
    CounterpartyExchangeRate 
FROM PaymentInitiation.PaymentTransactions PT 
     join CTE_TransactionId P ON PT.Id = P.TransactionId;

【讨论】:

  • WHERE UAA.UserId=@suerId 你能把“@suerId”改成“@userid”吗? ?
猜你喜欢
  • 2020-06-08
  • 2010-10-24
  • 2011-10-18
  • 2020-10-19
  • 2020-08-06
  • 1970-01-01
  • 1970-01-01
  • 2019-09-19
  • 2023-03-15
相关资源
最近更新 更多