Postgresql

如何優化提取到交叉表中

  • May 3, 2018

我有一個像這樣的模式:

[ad_id] .  [name] . [valueofname]
1 .        name .    "brian"
1 .        age  .    "23"
2 .        job  .    "IT"
2 .        name .    "Jack" 

行名包含多個值:年齡、姓名、生日、工作,我想將其轉換為:

[ad_id] .      [name]  .       [age] .              [birthday] .    [job]
[valueofad_id][valueofname] [valueofnameofage] [valueofnameofbirth] [valueofnameofjob]

這是我提出的查詢;它正在工作,但速度很慢,因為它試圖為每一列創建自己的表並加入它。

請問您有什麼建議或見解嗎?我正在處理大量數據並嘗試優化獲取。

select users.ad_id,name.valueofname as name,
       age.valueofname as age,
       birthday.valueofname as birthday,
       job.valueofname as job
from users
left join users_details as name on (users.ad_id=name.ad_id) 
left join users_details as age on (users.ad_id=age.ad_id) 
left join users_details as job on (users.ad_id=job.ad_id) 
left join users_details as birthday on (users.ad_id=birthday.ad_id)
group by ad_id,name.valueofname,age.valueofname,birthday.valueofname;
SELECT *
FROM   crosstab(
      'SELECT ad_id, d.name, d.valueofname
       FROM   users
       LEFT   JOIN users_details d USING (ad_id)
       ORDER  BY 1'

   , $$VALUES ('name'), ('age'), ('birthday'), ('job')$$
  ) AS ct (ad_id int, name text, age text, birthday text, job text);

使LEFT JOIN使用者在結果中沒有任何數據。如果這種情況永遠不會發生或不可取,請users從查詢中完全刪除該表 - 它在這裡沒有其他用途。

詳細解釋crosstab()

與替代解決方案相比的主要優勢是頂級性能,這似乎是您的主要目標。

引用自:https://dba.stackexchange.com/questions/205629