Оптимизация CTE - PullRequest
       20

Оптимизация CTE

0 голосов
/ 18 сентября 2018

У меня есть запрос, связанный с CTE.Я просто хочу знать, может ли следующий запрос быть оптимизирован в любом случае, и если это так, то в чем смысл его оптимизированной версии:

вот запрос:

WITH A AS               
(               
  SELECT                
    user_ID             
  FROM user             
  WHERE user_Date IS not NULL               
),              
B AS                
  (             
      SELECT                
        P.user_ID,              
        P.Payment_Type,             
        SUM(P.Payment_Amount) AS Total_Payment              
      FROM Payment P                
        JOIN A ON A.user_ID = P.user_ID             
  )             
SELECT              
  user_ID,              
  Total_Payment_Amount              
FROM B              
WHERE Payment_Type = 'CR';              

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Ваш запрос должен использовать GROUP BY, так как кажется, что вы хотите взять совокупную сумму для каждого user_ID. С точки зрения производительности вы вводите много подзапросов, которые на самом деле не нужны. Мы можем написать ваш запрос, используя одно соединение между таблицами Payment и user.

SELECT                
    P.user_ID,              
    SUM(P.Payment_Amount) AS Total_Payment              
FROM Payment P                
INNER JOIN user A
    ON A.user_ID = P.user_ID
WHERE
    A.user_Date IS NOT NULL AND P.Payment_Type = 'CR'
GROUP BY
    P.user_ID;
0 голосов
/ 18 сентября 2018

Попробуйте следующий запрос -:

 select  p.user_ID,              
 SUM(Payment_Amount) as Total_Payment_Amount    
 from Payment P join   user u
 on P.user_ID=u.user_ID
 where Payment_Type = 'CR';
 and u.user_Date IS not NULL
 group by p.user_ID

SQL Server 2014

0 голосов
/ 18 сентября 2018

Для Oracle, SQL Server и Postgres оптимизаторы запросов не должны иметь проблем с поиском оптимального плана запроса для этого. Вы можете узнать, что база данных будет делать с EXPLAIN, обычно.

...