精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

正確使用PostgreSQL的數組類型

開發 前端 PostgreSQL
在Heap中,我們依靠PostgreSQL支撐大多數后端繁重的任務,我們存儲每個事件為一個hstore blob,我們為每個跟蹤的用戶維護一個已完成事件的PostgreSQL數組,并將這些事件按時間排序。
在Heap中,我們依靠PostgreSQL支撐大多數后端繁重的任務,我們存儲每個事件為一個hstore blob,我們為每個跟蹤的用戶維護一個已完成事件的PostgreSQL數組,并將這些事件按時間排序。 Hstore能夠讓我們以靈活的方式附加屬性到事件中,而且事件數組賦予了我們強大的性能,特別是對于漏斗查詢,在這些查詢中我們計算不同轉化渠道步驟間的輸出。

在這篇文章中,我們看看那些意外接受大量輸入的PostgreSQL函數,然后以高效,慣用的方式重寫它。 

你的***反應可能是將PostgreSQL中的數組看做像C語言中對等的類似物。你之前可能用過變換陣列位置或切片來操縱數據。不過要小心,在PostgreSQL中不要有這樣的想法,特別是數組類型是變長的時,比如JSON、文本或是hstore。如果你通過位置來訪問PostgreSQL數組,你會進入一個意想不到的性能暴跌的境地。

這種情況幾星期前在Heap出現了。我們在Heap為每個跟蹤用戶維護一個事件數組,在這個數組中我們用一個hstore datum代表每個事件。我們 有一個導入管道來追加新事件到對應的數組。為了使這一導入管道是冪等的,我們給每個事件設定一個event_id,我們通過一個功能函數重復運行我們的事 件數組。如果我們要更新附加到事件的屬性的話,我們只需使用相同的event_id轉儲一個新的事件到管道中。 

所以,我們需要一個功能函數來處理hstores數組,并且,如果兩個事件具有相同的event_id時應該使用數組中最近出現的那個。剛開始嘗試這個函數是這樣寫的:

  1. -- This is slow, and you don't want to use it! 
  2. -- 
  3. -- Filter an array of events such that there is only one event with each event_id. 
  4. -- When more than one event with the same event_id is present, take the latest one. 
  5. CREATE OR REPLACE FUNCTION dedupe_events_1(events HSTORE[]) RETURNS HSTORE[] AS $$ 
  6.   SELECT array_agg(event) 
  7.   FROM ( 
  8.     -- Filter for rank = 1, i.e. select the latest event for any collisions on event_id. 
  9.     SELECT event 
  10.     FROM ( 
  11.       -- Rank elements with the same event_id by position in the array, descending. 
  12.       SELECT events[sub] AS event, sub, rank() 
  13.       OVER (PARTITION BY (events[sub] -> 'event_id')::BIGINT ORDER BY sub DESC
  14.       FROM generate_subscripts(events, 1) AS sub 
  15.     ) deduped_events 
  16.     WHERE rank = 1 
  17.     ORDER BY sub ASC 
  18.   ) to_agg; 
  19. $$ LANGUAGE SQL IMMUTABLE; 

這樣奏效,但大輸入是性能下降了。這是二次的,在輸入數組有100K各元素時它需要大約40秒!

Execution Times For dedupe_events_1

這個查詢在擁有2.4GHz的i7CPU及16GB Ram的macbook pro上測得,運行腳本為:https://gist.github.com/drob/9180760。

在這邊究竟發生了什么呢? 關鍵在于PostgreSQL存貯了一個系列的hstores作為數組的值, 而不是指向值的指針. 一個包含了三個hstores的數組看起來像
{“event_id=>1,data=>foo”, “event_id=>2,data=>bar”, “event_id=>3,data=>baz”}
相反的是
{[pointer], [pointer], [pointer]}
 

對于那些長度不一的變量, 舉個例子. hstores, json blobs, varchars,或者是 text fields, PostgreSQL 必須去找到每一個變量的長度. 對于evaluateevents[2], PostgreSQL 解析從左側讀取的事件直到讀取到第二次讀取的數據. 然后就是 forevents[3], 她再一次的從***個索引處開始掃描,直到讀到第三次的數據! 所以, evaluatingevents[sub]是 O(sub), 并且 evaluatingevents[sub]對于在數組中的每一個索引都是 O(N2), N是數組的長度.

PostgreSQL能得到更加恰當的解析結果,  它可以在這樣的情況下分析該數組一次. 真正的答案是可變長度的元素與指針來實現,以數組的值, 以至于,我們總能夠處理 evaluateevents[i]在不變的時間內.

即便如此,我們也不應該讓PostgreSQL來處理,因為這不是一個地道的查詢。除了generate_subscripts我們可以用unnest,它解析數組并返回一組條目。這樣一來,我們就不需要在數組中顯式加入索引了。

  1. -- Filter an array of events such that there is only one event with each event_id. 
  2. -- When more than one event with the same event_id, is present, take the latest one. 
  3. CREATE OR REPLACE FUNCTION dedupe_events_2(events HSTORE[]) RETURNS HSTORE[] AS $$ 
  4.   SELECT array_agg(event) 
  5.   FROM ( 
  6.     -- Filter for rank = 1, i.e. select the latest event for any collisions on event_id. 
  7.     SELECT event 
  8.     FROM ( 
  9.       -- Rank elements with the same event_id by position in the array, descending. 
  10.       SELECT event, row_number AS index, rank() 
  11.       OVER (PARTITION BY (event -> 'event_id')::BIGINT ORDER BY row_number DESC
  12.       FROM ( 
  13.         -- Use unnest instead of generate_subscripts to turn an array into a set. 
  14.         SELECT event, row_number() 
  15.         OVER (ORDER BY event -> 'time'
  16.         FROM unnest(events) AS event 
  17.       ) unnested_data 
  18.     ) deduped_events 
  19.     WHERE rank = 1 
  20.     ORDER BY index ASC 
  21.   ) to_agg; 
  22. $$ LANGUAGE SQL IMMUTABLE; 

結果是有效的,它花費的時間跟輸入數組的大小呈線性關系。對于100K個元素的輸入它需要大約半秒,而之前的實現需要40秒。

這實現了我們的需求:

  • 一次解析數組,不需要unnest。
  • 按event_id劃分。
  • 對每個event_id采用***出現的。
  • 按輸入索引排序。

教訓:如果你需要訪問PostgreSQL數組的特定位置,考慮使用unnest代替。 

我們希望能夠避免失誤。有任何意見或其他PostgreSQL的秘訣請@heap。 

[1]特別說明一下,我們使用一個名為Citus Data的貼心工具。更多內容在另一篇博客中! 
[2]參考:https://heapanalytics.com/features/funnels。特別說明一下,計算轉換程序需要對用戶已完成事件的數組進行一次掃描,但不需要任何join。

原文鏈接:http://blog.heapanalytics.com/dont-iterate-over-a-postgres-array-with-a-loop/

譯文鏈接:http://www.oschina.net/translate/dont-iterate-over-a-postgres-array-with-a-loop

責任編輯:陳四芳 來源: 開源中國編譯
相關推薦

2012-08-23 09:33:25

數據庫數組PostgreSQL

2010-01-18 17:23:55

函數

2010-01-18 17:23:55

函數

2010-03-02 14:12:30

WCF枚舉類型

2013-08-29 13:31:07

PostgreSQL數據庫數據庫日期

2024-07-08 10:48:51

2014-01-05 17:08:09

PostgreSQL數據類型

2017-02-23 15:37:44

OptionObject容器

2009-02-20 11:03:25

Vista特點

2010-01-11 13:33:07

VB.NET使用數組

2010-01-18 13:12:43

VB.NET控件數組

2019-11-14 16:23:07

MySQL索引數據庫

2010-02-03 15:40:37

Python函數

2017-07-10 13:09:45

前端Flexbox

2018-04-12 08:37:27

2010-02-24 15:27:26

Python數組

2024-10-30 13:48:23

2010-04-23 13:45:14

Oracle存儲過程

2010-05-21 17:14:18

MySQL 數字類型

2010-08-02 14:03:49

DB2驅動類型
點贊
收藏

51CTO技術棧公眾號

99精品国产99久久久久久福利| 123成人网| 91麻豆精东视频| 国产精品入口尤物| 青青草在线观看视频| 先锋影音国产精品| 欧美精品久久天天躁| 亚洲色成人www永久在线观看| 毛片网站在线观看| 国产精品18久久久久久久久久久久| 97人人做人人爱| 黄色录像一级片| 午夜a一级毛片亚洲欧洲| 欧美久久婷婷综合色| 99精品视频在线看| 亚洲区欧洲区| 国产精品私人自拍| 久久久久久久久一区二区| 国产精品久久久久久久久毛片| 国产欧美短视频| 欧美成年人网站| 欧美三级视频网站| 三级精品视频| 精品久久久久一区二区国产| 在线观看免费视频高清游戏推荐| 美女搞黄视频在线观看| 亚洲美腿欧美偷拍| 性刺激综合网| 好男人免费精品视频| 成人高清视频在线观看| 亚洲综合社区网| 一二三四区在线| 久久久噜噜噜| 欧美亚洲一区在线| 91香蕉在线视频| 亚洲网址在线| 欧美日本高清一区| 成人自拍小视频| 91视频一区| 久久精品国产精品| 日本爱爱小视频| 日韩精品dvd| 中文字幕久久久| 久久久精品成人| 欧美一二区在线观看| 亚洲色在线视频| www在线观看免费视频| 九九综合在线| 中文字幕精品久久| 中国1级黄色片| 欧美激情欧美| 久久久99久久精品女同性| 欧美h片在线观看| 婷婷六月综合| 欧美精品一本久久男人的天堂| 97在线观看视频免费| 91精品一区二区三区综合在线爱 | 一区二区欧美国产| www.-级毛片线天内射视视| 成人免费网址| 一区二区视频在线看| 欧美极品少妇无套实战| av日韩国产| 狠狠色噜噜狠狠狠狠97| 欧美精品无码一区二区三区| 99久久婷婷国产综合精品首页| 欧美在线不卡一区| 一区二区在线免费看| 2020国产精品小视频| 日韩午夜av一区| 无码任你躁久久久久久老妇| 色爱综合av| 中国china体内裑精亚洲片| 日韩av手机在线免费观看| 午夜精品999| 午夜精品一区二区三区视频免费看 | 日本激情一区二区| xnxx国产精品| 亚洲一区二区三区色| 成人短视频在线| 午夜久久久久久电影| 人人干人人视频| 国产精品日韩精品在线播放 | 永久免费av在线| 一区二区三区四区在线播放| 1024av视频| 日韩毛片免费看| 亚洲成在人线av| 日韩欧美黄色网址| 狠狠久久婷婷| 国产精品久久久久久久一区探花| 99在线观看免费| 久久蜜桃一区二区| 看全色黄大色大片| 一二三四视频在线中文| 欧美一区二区网站| 久久精品无码一区| 亚洲性色视频| 国产免费亚洲高清| 四季av日韩精品一区| 中文字幕在线播放不卡一区| 国内自拍在线观看| 国产一区二区三区视频在线| 亚洲男人天堂2019| 青青草国产在线观看| 日本午夜一区二区| 国产精品一区二区欧美| 免费网站成人| 在线精品视频小说1| 一区二区三区四区影院| 日本精品黄色| 热久久99这里有精品| 精品国产999久久久免费| 国产亚洲成aⅴ人片在线观看| 日韩国产小视频| 成人精品在线| 中文字幕日韩av电影| 欧美精品亚洲精品日韩精品| 国产在线国偷精品产拍免费yy| 青青草原亚洲| 中文在线免费二区三区| 亚洲成色777777在线观看影院 | 亚洲成人资源网| 国产乱女淫av麻豆国产| 精品久久久亚洲| 欧美亚洲国产成人精品| 蜜桃av噜噜一区二区三区麻豆| 国产精品久久久一区麻豆最新章节| 久久9精品区-无套内射无码| 九九热播视频在线精品6| 欧美大胆在线视频| 国产精品久久影视| 国产精品午夜在线| 青青青在线视频免费观看| 亚洲理论电影片| 5252色成人免费视频| 人妻中文字幕一区| 亚洲国产成人av网| 久草视频福利在线| 激情久久久久久久| 国产66精品久久久久999小说| 亚洲成a人v欧美综合天堂麻豆| 欧美日韩精品一区二区在线播放| 国产成人免费观看网站| 奇米一区二区三区| 亚洲激情啪啪| 在线免费成人| 久久成人综合视频| 性做久久久久久久久久| 亚洲一区二区3| 亚洲天堂成人av| 视频一区视频二区在线观看| 日韩精品电影网站| 国产成人精品一区二区三区视频| 中文字幕久热精品在线视频| 一区二区美女视频| 亚洲另类在线一区| jjzz黄色片| 久久国产主播| 日韩欧美亚洲日产国| 四虎国产精品免费久久5151| 久久视频在线播放| 免费av网站观看| 欧美日韩在线视频首页| 亚洲精品一区二区三区影院忠贞| 麻豆精品视频在线观看免费| 一本二本三本亚洲码| 视频成人永久免费视频| 2021国产精品视频| 国产中文字幕在线| 91精品国产品国语在线不卡| 国产真实夫妇交换视频| 久久久综合网站| 日本人视频jizz页码69| 欧美福利专区| 欧美精品一区在线发布| 深夜福利亚洲| 555www成人网| 欧美性天天影视| 亚洲成人三级在线| www.亚洲激情| 亚洲一区二区在线免费观看视频| 在线免费观看a级片| 蜜桃精品在线观看| www.国产在线视频| 成人网18免费网站| 国产精品免费一区二区三区在线观看| 高清电影一区| 欧美激情亚洲精品| 国产黄在线看| 亚洲高清久久网| 在线观看免费观看在线| 亚洲成人在线观看视频| 成年人免费视频播放| 成人动漫在线一区| 一本色道久久亚洲综合精品蜜桃 | 欧美精品激情blacked18| 黄色在线视频观看网站| 日韩美女在线视频| 在线观看视频二区| 欧美视频在线免费| 中文字幕av免费在线观看| 国产亚洲精品aa午夜观看| 欧美图片自拍偷拍| 国内成+人亚洲+欧美+综合在线| 亚洲熟妇av日韩熟妇在线| 亚洲成av人电影| 日韩电影免费观看高清完整| av自拍一区| 91啪国产在线| 成人四虎影院| 日本精品性网站在线观看| 国产盗摄在线视频网站| 欧美xxxx14xxxxx性爽| 思思99re6国产在线播放| 日韩大陆欧美高清视频区| 亚洲乱熟女一区二区| 欧美精品 日韩| 国产九色91回来了| 色香蕉久久蜜桃| 日韩精品久久久久久久酒店| 亚洲精品国产高清久久伦理二区 | 亚洲一区二区三区影院| av最新在线观看| 中文字幕第一区综合| 高潮毛片无遮挡| 91在线视频在线| 久久国产劲爆∧v内射| 国产成人免费在线| 99中文字幕在线| 激情欧美一区二区| 高潮一区二区三区| 老司机一区二区| 日韩肉感妇bbwbbwbbw| 日韩国产欧美一区二区三区| 中文字幕日本最新乱码视频| 99热免费精品| 亚洲色成人一区二区三区小说| 精品69视频一区二区三区Q| 激情成人开心网| 欧美精品国产一区二区| 国产女人18毛片| 欧美色图首页| 久久手机在线视频| 极品av少妇一区二区| www.av片| 久热re这里精品视频在线6| 50路60路老熟妇啪啪| 免费亚洲视频| 国产福利影院在线观看| 蜜桃精品视频在线| 色18美女社区| 国产精品亚洲а∨天堂免在线| 四虎国产精品免费| 国产91精品免费| 国产亚洲色婷婷久久99精品91| 99久久精品免费看| 在线不卡av电影| 中文字幕精品三区| 国产一区第一页| 亚洲一区自拍偷拍| 日韩精品视频免费看| 欧美小视频在线| 中文字幕日韩三级| 日韩三级免费观看| 黄色av网站免费在线观看| 日韩精品免费在线视频观看| 国产三级电影在线| www.色综合| 成人高潮aa毛片免费| 日韩免费精品视频| 亚洲免费一区| 国产精选一区二区| 精品国产一级毛片| 国产在线无码精品| 久久国产日韩| 下面一进一出好爽视频| av在线不卡电影| 香蕉久久久久久久| 亚洲国产日韩一级| 看黄色一级大片| 日韩欧美一区二区不卡| 欧美日韩伦理片| 久久在线免费视频| 伊人久久精品一区二区三区| 91美女高潮出水| 色橹橹欧美在线观看视频高清 | 在线看片成人| 污污视频网站免费观看| 国产精品亚洲午夜一区二区三区 | 亚洲最大视频网| 久久久久免费观看| 激情五月少妇a| 欧美在线一二三四区| 蜜臀av免费在线观看| 日韩中文字幕不卡视频| av资源在线| 成人免费午夜电影| 国产成人av| 欧美一级片免费播放| 久久91精品久久久久久秒播| 国产制服丝袜在线| 一区二区三区国产豹纹内裤在线 | 色偷偷偷在线视频播放| 国产综合久久久久| 蜜桃tv一区二区三区| 女人被男人躁得好爽免费视频| 日本不卡一二三区黄网| 加勒比精品视频| 亚洲一区二区av电影| 国产毛片毛片毛片毛片毛片| 亚洲欧美中文日韩在线| a国产在线视频| 91九色在线免费视频| 日韩欧美字幕| 五月婷婷深爱五月| 99riav久久精品riav| 国产小视频在线观看免费| 7777女厕盗摄久久久| 99reav在线| 国产成人黄色av| 亚洲综合图色| 欧美日韩黄色一级片| 成人动漫一区二区在线| 精品无码免费视频| 日韩视频免费观看高清完整版在线观看 | 91在线视频网址| 精品91久久久| 亚洲成人国产精品| 国产丝袜在线观看视频| 成人av片网址| 国产综合自拍| 精品国产aⅴ一区二区三区东京热| 亚洲免费av高清| 超碰人人人人人人| 欧美二区乱c黑人| 亚洲精品午夜| 日韩小视频网站| 成人av电影在线观看| 日韩精品在线不卡| 亚洲第一精品夜夜躁人人爽 | jizz日本免费| 天天亚洲美女在线视频| 污视频网站免费观看| 欧美一二三视频| 美日韩中文字幕| 国产九九热视频| 中文字幕在线不卡一区| av网站免费大全| 欧美日韩福利视频| 国产精品天天看天天狠| av天堂永久资源网| 久久精品视频免费| 最近中文字幕免费在线观看| 中文字幕亚洲无线码a| 国产精品777777在线播放| 真人做人试看60分钟免费| 国产成人啪午夜精品网站男同| 久久精品免费av| 日韩成人中文字幕| 成人在线免费电影网站| 色撸撸在线观看| 豆国产96在线|亚洲| 久久久国产高清| 一区二区欧美日韩视频| 久久国产精品美女| 欧美午夜小视频| 欧美激情在线看| av中文字幕免费| 91国产美女在线观看| japanese国产精品| 九色91porny| 婷婷综合五月天| 成人h小游戏| 91偷拍精品一区二区三区| 国产农村妇女精品一二区| 妖精视频在线观看免费| 日韩精品一区二| 日本成人三级电影| 8x8x华人在线| 久久久九九九九| www.激情五月.com| 人人澡人人澡人人看欧美| 91精品综合久久久久久久久久久 | 激情五月俺来也| 亚洲综合丁香婷婷六月香| 懂色av中文在线| 国产精品国产一区二区| 美女网站一区二区| 色播视频在线播放| 色播久久人人爽人人爽人人片视av| 99国产精品免费网站| 日本xxxx黄色| 婷婷开心久久网| 国产三区视频在线观看| 麻豆蜜桃91| 国产成人精品网址| 中文字幕永久在线视频| 97国产精品人人爽人人做| 午夜影院欧美|