亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

修改一行SQL代碼 性能提升了100倍

2024-07-21 02:50:46
字體:
來源:轉載
供稿:網友
修改一行SQL代碼 性能提升了100倍

  在PostgreSQL中修改了一行不明顯的代碼,把(ANY(ARRAY[...]) 改成 ANY(VALUES(...))),結果查詢時間從20s變為0.2s。最初我們學習使用EXPLAN ANALYZE來優化代碼,到后來,Postgres社區也成為我們學習提升的一個好幫手,付出總會有回報,我們的性能也因此得到了極大的提升。

  事出有因

  Datadog是專門為IT、開發團隊等提供監控服務的。這周早些時候,我們的許多數據庫所面臨的一個性能問題是在一個較小的表上進行大量的key查詢。這些查詢中的99.9%都是高效靈活的。在極少數實例中,有些數量的性能指標tag查詢是費時的,這些查詢需要花費20s時間。這也就意味著用戶需要在瀏覽器面前花費這么長的時間來等待圖形編輯器做出響應。即使是0.1%,這樣的用戶體驗也顯然糟透了,對此,我們進行了監測,探究為何速度會這么慢。

  查詢與計劃

  結果令人震驚,罪魁禍首竟然是下面這個簡單的查詢:

SELECT c.key,       c.x_key,       c.tags,       x.name FROM context c JOIN x   ON c.x_key = x.keyWHERE c.key = ANY (ARRAY[15368196, -- 11,000 other keys --)])  AND c.x_key = 1  AND c.tags @> ARRAY[E'blah'];

  X表擁有上千行數據,C表擁有1500萬行數據,這兩個表的“key”列都帶有適當的索引主鍵。簡單地說,它就是一個簡單的主鍵查詢。但有趣地是,隨著key列中記錄的增加,例如在11000行時,我們通過添加EXPLAIN (ANALYZE, BUFFERS)前綴來查看key列的值是否與數組中的值匹配:

Nested Loop  (cost=6923.33..11770.59 rows=1 width=362) (actual time=17128.188..22109.283 rows=10858 loops=1)  Buffers: shared hit=83494  ->  Bitmap Heap Scan on context c  (cost=6923.33..11762.31 rows=1 width=329) (actual time=17128.121..22031.783 rows=10858 loops=1)        Recheck Cond: ((tags @> '{blah}'::text[]) AND (x_key = 1))        Filter: (key = ANY ('{15368196,(a lot more keys here)}'::integer[]))        Buffers: shared hit=50919        ->  BitmapAnd  (cost=6923.33..6923.33 rows=269 width=0) (actual time=132.910..132.910 rows=0 loops=1)              Buffers: shared hit=1342              ->  Bitmap Index Scan on context_tags_idx  (cost=0.00..1149.61 rows=15891 width=0) (actual time=64.614..64.614 rows=264777 loops=1)                    Index Cond: (tags @> '{blah}'::text[])                    Buffers: shared hit=401              ->  Bitmap Index Scan on context_x_id_source_type_id_idx  (cost=0.00..5773.47 rows=268667 width=0) (actual time=54.648..54.648 rows=267659 loops=1)                    Index Cond: (x_id = 1)                    Buffers: shared hit=941  ->  Index Scan using x_pkey on x  (cost=0.00..8.27 rows=1 width=37) (actual time=0.003..0.004 rows=1 loops=10858)        Index Cond: (x.key = 1)        Buffers: shared hit=32575Total runtime: 22117.417 ms

  這次查詢共花費22s,我們可以通過下圖對這22s進行很直觀的了解,其中大部分時間花費在Postgres和OS之間,而磁盤I/O則花費非常少的時間。

  在最低水平,這些查詢看起來就像是這些CPU利用率的峰值。在這里主要是想證實一個關鍵點:數據庫不會等待磁盤去讀取數據,而是做排序、散列和行比較這些事。

  通過Postgres獲取與峰值最接近的行數。

  顯然,我們的查詢在大多數情況下都有條不紊的執行著。

  Postgres的性能問題:位圖堆掃描

  rows_fetched度量與下面的部分計劃是一致的:

Buffers: shared hit=83494  ->  Bitmap Heap Scan on context c  (cost=6923.33..11762.31 rows=1 width=329) (actual time=17128.121..22031.783 rows=10858 loops=1)        Recheck Cond: ((tags @> '{blah}'::text[]) AND (x_key = 1))        Filter: (key = ANY ('{15368196,(a lot more keys here)}'::integer[]))        Buffers: shared hit=50919

  Postgres使用位圖堆掃描(Bitmap Heap Scan)來讀取C表數據。當關鍵字的數量較少時,它可以在內存中非常高效地使用索引構建位圖。如果位圖太大,查詢優化器會改變其查找數據的方式。在我們這個案例中,需要檢查大量的關鍵字,所以它使用了非常相似的方法來檢查候選行并且單獨檢查與x_key和tag相匹配的每一行。而所有的這些“在內存中加載”和“檢查每一行”都需要花費大量的時間。

  幸運的是,我們的表有30%都是裝載在RAM中,所以在從磁盤上檢查行的時候,它不會表現的太糟糕。但在性能上,它仍然存在非常明顯的影響。查詢過于簡單,這是一個非常簡單的key查找,所以沒有顯而易見的數據庫或應用重構,它很難找到一些簡單的方式來解決這個問題。最后,我們使用PGSQL-Performance郵件向社區求助。

  解決方案

  開源幫了我們,經驗豐富的且代碼貢獻量非常多的Tom Lane讓我們試試這個:

SELECT c.key,       c.x_key,       c.tags,       x.name FROM context c JOIN x   ON c.x_key = x.keyWHERE c.key = ANY (VALUES (15368196), -- 11,000 other keys --)  AND c.x_key = 1  AND c.tags @> ARRAY[E'blah'];

  你能發現有啥不同之處嗎?把ARRAY換成了VALUES。

  我們使用ARRAY[...]列舉出所有的關鍵字來進行查詢,但卻欺騙了查詢優化器。Values(...)讓優化器充分使用關鍵字索引。僅僅是一行代碼的改變,并且沒有產生任何語義的改變。

  下面是新查詢語句的寫法,差別就在于第三和第十四行。

Nested Loop  (cost=168.22..2116.29 rows=148 width=362) (actual time=22.134..256.531 rows=10858 loops=1)  Buffers: shared hit=44967  ->  Index Scan using x_pkey on x  (cost=0.00..8.27 rows=1 width=37) (actual time=0.071..0.073 rows=1 loops=1)        Index Cond: (id = 1)        Buffers: shared hit=4  ->  Nested Loop  (cost=168.22..2106.54 rows=148 width=329) (actual time=22.060..242.406 rows=10858 loops=1)        Buffers: shared hit=44963        ->  HashAggregate  (cost=168.22..170.22 rows=200 width=4) (actual time=21.529..32.820 rows=11215 loops=1)              ->  Values Scan on "*VALUES*"  (cost=0.00..140.19 rows=11215 width=4) (actual time=0.005..9.527 rows=11215 loops=1)        ->  Index Scan using context_pkey on context c  (cost=0.00..9.67 rows=1 width=329) (actual time=0.015..0.016 rows=1 loops=11215)              Index Cond: (c.key = "*VALUES*".column1)              Filter: ((c.tags @> '{blah}'::text[]) AND (c.x_id = 1))              Buffers: shared hit=44963Total runtime: 263.639 ms

  從22000ms到200ms,僅僅修改了一行代碼,速度提升了100倍還多。

  產品里新的查詢

  部署后的代碼:

  數據庫看起來更美觀

  Postgres慢查詢將一去不復返了。但有誰愿意因為這個0.1%的倒霉蛋再去折磨呢?我們使用Datadog來驗證修改是否正確,它能夠做出即時驗證。如果你想查看Postgres查詢速度的各種影響,不妨試試Datadog吧。

  英文來源:Datadog


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人久久18免费网站图片| 中文字幕免费精品一区高清| 国产精品亚洲网站| 欧美日本在线视频中文字字幕| 国产精品免费电影| 国内伊人久久久久久网站视频| 亚洲香蕉伊综合在人在线视看| 在线播放国产精品| 亚洲精品日韩av| 中文字幕日韩在线视频| 欧美成人一区二区三区电影| 欧美亚洲国产精品| 国产综合福利在线| 亚洲一级一级97网| 久久久久久一区二区三区| 色综合五月天导航| 日韩美女视频中文字幕| 国产亚洲精品久久久久动| 国产欧亚日韩视频| 成人精品视频99在线观看免费| 91精品中国老女人| 久久777国产线看观看精品| 精品久久久久久久中文字幕| 精品香蕉一区二区三区| 欧美成人免费全部| xxxxxxxxx欧美| 日韩欧美中文字幕在线观看| 国产成人一区二区三区小说| 26uuu亚洲伊人春色| 伊人伊成久久人综合网站| 国产成人综合av| 欧美午夜美女看片| 亚洲аv电影天堂网| 国产精品美女在线| 亚洲成人黄色网| 日韩av在线导航| 国产午夜精品全部视频在线播放| 欧美亚洲视频在线看网址| 最好看的2019的中文字幕视频| 91精品国产综合久久香蕉最新版| 日韩免费在线免费观看| 欧美黑人一级爽快片淫片高清| 欧美日韩一区二区在线| 亚洲在线观看视频| 国产亚洲精品美女| 97视频在线观看免费高清完整版在线观看| 91在线观看免费| 国产欧美精品日韩精品| 韩国v欧美v日本v亚洲| 日韩在线观看视频免费| 精品久久久久久久久久ntr影视| 久久久视频精品| 亚洲在线免费看| 国产精品69久久久久| 欧洲中文字幕国产精品| 亚洲一区二区中文| 成人av资源在线播放| 亚洲国产天堂久久国产91| 日韩av有码在线| 91亚洲国产成人精品性色| 欧美日韩亚洲成人| 日韩av在线一区二区| 国产精品香蕉国产| 国内精品久久影院| 欧美激情精品久久久久久| 久久躁日日躁aaaaxxxx| 欧美猛交ⅹxxx乱大交视频| 国产精品久久9| 成人av.网址在线网站| 国产精品视频久| 亚洲国内精品视频| 97视频在线观看亚洲| 欧美性猛交xxxx黑人| 国产a级全部精品| 日韩欧美福利视频| 亚洲精品v天堂中文字幕| 国产日韩专区在线| 日韩av在线网址| 日韩在线观看免费网站| 欧美成人午夜视频| 亚洲自拍偷拍色片视频| 日韩国产高清污视频在线观看| 欧美在线观看日本一区| 欧美精品制服第一页| 欧美亚洲视频在线看网址| 国产91露脸中文字幕在线| 国产精品久久久久久av福利软件| 自拍偷拍亚洲区| 欧美视频在线观看 亚洲欧| 国产亚洲欧美日韩精品| 亚洲电影天堂av| 亚洲人成网在线播放| 亚洲国产精品人人爽夜夜爽| 久久天天躁狠狠躁老女人| 欧美成人免费小视频| 一区二区成人精品| 欧美一区视频在线| 日韩精品在线视频观看| 亚洲欧美日韩天堂一区二区| 亚洲欧洲国产伦综合| 久久夜色精品国产欧美乱| 精品精品国产国产自在线| 91精品国产高清久久久久久久久| 欧美孕妇毛茸茸xxxx| 亚洲电影免费观看高清完整版在线观看| www.亚洲一区| 成人免费视频xnxx.com| 中文字幕亚洲欧美日韩2019| 日本欧美中文字幕| 日韩精品在线观看网站| 色噜噜狠狠狠综合曰曰曰| 国产精品白嫩初高中害羞小美女| 久久久极品av| 国产成人一区二区三区| 成人精品一区二区三区电影免费| 亚洲精品99久久久久| 日韩中文字幕久久| 日韩免费在线观看视频| 亚洲精品电影在线观看| 欧美高清激情视频| 国内精品久久久久久中文字幕| 国产99久久精品一区二区 夜夜躁日日躁| 国产精品成人播放| 亲爱的老师9免费观看全集电视剧| 97久久伊人激情网| 欧美xxxx18国产| 欧美成人亚洲成人日韩成人| 亚洲视频在线播放| 一本一本久久a久久精品综合小说| 亚洲欧美一区二区精品久久久| 国产精品7m视频| 91精品国产91久久久久久吃药| 亚洲毛片一区二区| 精品毛片三在线观看| 国产精品久久久久久久一区探花| 日韩美女在线看| 国产精品久久77777| 亚洲图片制服诱惑| 日韩精品在线视频观看| 成人在线视频网| 92国产精品视频| 久久精品视频在线播放| 久久婷婷国产麻豆91天堂| 亚洲精品自拍第一页| 欧美成人免费va影院高清| 亚洲精选中文字幕| 一夜七次郎国产精品亚洲| 久久久久久av| 国产精品xxxxx| 日韩欧美国产黄色| 久久久久这里只有精品| 国产做受高潮69| 国模视频一区二区三区| 日本精品久久电影| 日韩成人激情在线| 国产精品国产三级国产aⅴ浪潮| 国产aⅴ夜夜欢一区二区三区| 亚洲最新av在线网站| 毛片精品免费在线观看| 欧美在线视频在线播放完整版免费观看| 久久久亚洲国产天美传媒修理工| 精品久久久中文| 亚洲精品456在线播放狼人| 亚洲激情在线观看|