CTE 被多次调用?
CTE's being called multiple times?
我的任务是调查一个非常慢的 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 导致查询阻塞,因为它是在集合中的搜索行上执行的吗?
还是我看错了?
非常感谢。
我想你希望以这样的方式结束
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;
我的任务是调查一个非常慢的 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 导致查询阻塞,因为它是在集合中的搜索行上执行的吗?
还是我看错了?
非常感谢。
我想你希望以这样的方式结束
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;