簡體   English   中英

SQL子查詢優化多個聚合操作

[英]SQL Subquery optimization multiple aggregate operations

我正在嘗試找到該項目的不同表和組的平均值和總和。 我還想將返回的表壓縮為一行。 所以對於我的子查詢,我得到這個結果

在此處輸入圖片說明

使用外部查詢,我期望這樣: 在此處輸入圖片說明

到目前為止,這是我的sql代碼。 它可以工作,但是性能非常慢,我不確定為什么或如何對其進行優化。

select sum(sub.count) as count, avg(sub.opened) as opened,
avg(sub.clicked) as clicked, avg(sub.started_watching) as started_watching,
sum(sub.views) as views
from (
select p.id, count(e.id) as count, 
avg(e.opened) as opened, avg(e.read_email) as clicked,
avg(e.started_video) as started_watching, sum(e.views) as views
from projects p
inner join guests g
on g.project_id = p.id
inner join videos v
on v.guest_id = g.id
inner join emails e
on e.video_id=v.id
group by p.id) sub; 

尋找您的查詢的主要問題與子查詢結果的創建有關
因此,改進此查詢非常重要,例如,在每個表的聯接所涉及的列上添加適當的索引,並最終為select中使用的列(在聯接所使用的列之后)添加復合索引

  Select  sum(sub.count) as count
        , avg(sub.opened) as opened
        , avg(sub.clicked) as clicked
        , avg(sub.started_watching) as started_watching
        , sum(sub.views) as views
  from (
    select p.id
        , count(e.id) as count
        , avg(e.opened) as opened
        , avg(e.read_email) as clicked
        , avg(e.started_video) as started_watching
        , sum(e.views) as views
    from projects p
    inner join guests g on g.project_id = p.id
    inner join videos v on v.guest_id = g.id
    inner join emails e on e.video_id=v.id
    group by p.id
  ) sub; 

因此,請確保您有正確的索引

guests  (project_id)
videos  (guest_id)
emails  (video_id, id, opened, read_email,started_video, views)

and obvious on projects (id)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM