久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

如何探討select in 在postgresql的效率問題

159次閱讀
沒有評論

共計 2234 個字符,預計需要花費 6 分鐘才能閱讀完成。

如何探討 select in 在 postgresql 的效率問題,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

在知乎上看到這樣一個問題:

MySQL 查詢 select * from table where id in (幾百或幾千個 id) 如何提高效率?修改

電商網站,一個商品屬性表,幾十萬條記錄,80M,索引只有主鍵 id,做這樣的查詢如何提高效率?

select * from table where id in (幾百或幾千個 id)

這些 id 沒啥規律,分散的。。。。

看了一下答案,感覺有好多不靠譜的,但是口說無憑,所以在我的電腦上寫了幾個查詢測試一下。我用的是 Postgresql9.4,但感覺 mysql 應該也差不多,首先創建一個簡單表,只有簡單的 3 列,在這個問題的下面好多人提到了需要看表的大小,其實這個問題和表大小無關,只和 index 的大小有關,因為是 index 是建立在 int 上的,所以只和紀錄數目有關。

Table  public.t9 Column | Type | Modifiers--------+----------------+-----------c1 | integer |c2 | character(100) |c3 | character(200) |Indexes: i1  UNIQUE, btree (c1)insert into t9 values(generate_series(1000,500000,1),repeat(a ,90),repeat(b ,180));

之后生成一些隨機數,Mac 上用 jot,Linux 上用 shuf

for ((i=0;i 100000;i++))dojot -r 1 1000 600000  rand.filedone

然后根據 rand.file 生成查詢語句:

select * from t9 where c1 in (494613,575087,363588,527650,251670,343456,426858,202886,254037,...1);

分別生成 3 個 sql 文件,in 內變量的數目分別是 100,1000 和 10000 個,執行這 3 個 sql 文件,看看時間

try psql study -f test_100.sql -o /dev/nullLOG: duration: 2.879 mstry psql study -f test_1000.sql -o /dev/nullLOG: duration: 11.974 mstry psql study -f test_10000.sql -o /dev/nullLOG: duration: 355.689 ms

可以看到只有在 in 內數據到了 10,000 個的時候數據時間會有比較大的變化,但也不過是在 300 多 ms 內完成。

那如果按照有些回答那樣,先建一個臨時表,然后用 in subquery,并且希望這時候可以兩表 join 呢?為了簡單我直接用兩表 join 了

drop table t_tmp;create table t_tmp(id int);insert into t_tmp (id) values(494613),(575087),(363588),(345980),...(1);select t9.* from t9, t_tmpwhere t9.c1 = t_tmp.id;

時間如何呢?

try psql study -f test_create_10000.sql -o /dev/nullLOG: duration: 2.078 msLOG: duration: 1.233 msLOG: duration: 224.112 msLOG: duration: 322.108 ms

除去 drop 和 create 的時間,依然花費了 500+ 的時間,這里的前提還是我用的 ssd 盤,所以寫 LOG 的時間會快很多。為什么會這么慢呢?用 explain 看一下,這時候數據量較大,直接走 Merge join 了

那 1000 行數據的效率如何呢?

try psql study -f test_create_1000.sql -o exp.outLOG: duration: 2.476 msLOG: duration: 0.967 msLOG: duration: 2.391 msLOG: duration: 8.780 ms

100 行的數據如下:

try psql study -f test_create_100.sql -o /dev/nullLOG: duration: 2.020 msLOG: duration: 1.028 msLOG: duration: 1.074 msLOG: duration: 1.912 ms

可以看到在 100 個值和 1000 個值的情況下 create table 的方式不會比直接在 in 里面寫所有的變量好多少,explain 看的話是在用 NLJ 了。但在數據量更大(按照原問題,這里 in 的數量其實無法預知)的情況下效率只會更低,再加上額外的表維護成本和多余的 SQL 語句,DBA 肯定不喜歡的,還是相信數據庫,放心大膽直接用 in list 來搞定這些問題吧。

看完上述內容,你們掌握如何探討 select in 在 postgresql 的效率問題的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注丸趣 TV 行業資訊頻道,感謝各位的閱讀!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-17發表,共計2234字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 于田县| 宁乡县| 桐庐县| 东丰县| 康马县| 洪湖市| 建始县| 建昌县| 敖汉旗| 麻阳| 内黄县| 来安县| 安吉县| 华坪县| 宁安市| 厦门市| 合山市| 孟州市| 酉阳| 嘉义县| 石城县| 绵阳市| 建德市| 馆陶县| 连山| 房产| 五莲县| 邳州市| 芒康县| 达孜县| 正安县| 中卫市| 武清区| 临桂县| 融水| 博客| 漯河市| 江孜县| 阿巴嘎旗| 泉州市| 浪卡子县|