久久久久在线观看_又色又爽又黄的免费视频播放_一区中文字幕_日韩电影在线播放

今日頭條 焦點資訊 營銷之道 企業報道 淘寶運營 網站建設 軟件開發 400電話
  當前位置: 首頁 » 資訊 » 網站建設 » 正文

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

放大字體  縮小字體 發布日期:2018-02-18  來源:新格網  作者:新格網  瀏覽次數:498  【去百度看看】
核心提示:修改一行代碼,且沒有改變語義,把查詢速度提升了100倍,這樣的事情你遇到過嗎?本文作者分享了他們的成功案例,雖然99.9%的查詢都是高效的,只有0.1%查詢速度較慢,也會影響用戶體驗。對此,他們進行了監測和分析。

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

事出有因

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

查詢與計劃

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

1 2 3 4 5 6 7 8 9 10 SELECt c.key,        c.x_key,        c.tags,        x.name  FROM context c  JOIN x    ON c.x_key = x.key WHERe 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列的值是否與數組中的值匹配:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 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=32575 Total runtime: 22117.417 ms
 
 
[ 資訊搜索 ]  [ 加入收藏 ]  [ 告訴好友 ]  [ 打印本文 ]  [ 違規舉報 ]  [ 關閉窗口 ]

 
0條 [查看全部]  相關評論

 
網站首頁 | 關于我們 | 聯系方式 | 使用協議 | 版權隱私 | 網站地圖 | 排名推廣 | 廣告服務 | 積分換禮 | 網站留言 | RSS訂閱 | 吉ICP備11001726號-6
企業800網 · 提供技術支持