<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      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++))
      do
      jot -r 1 1000 600000 >>rand.file
      done

      然后根據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/null
      LOG:  duration: 2.879 ms
      ?  try psql study -f test_1000.sql -o /dev/null
      LOG:  duration: 11.974 ms
      ?  try psql study -f test_10000.sql -o /dev/null
      LOG:  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_tmp where t9.c1 = t_tmp.id;

      時間如何呢?

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

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

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

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

      100行的數據如下:

      ?  try psql study -f test_create_100.sql -o /dev/null
      LOG:  duration: 2.020 ms
      LOG:  duration: 1.028 ms
      LOG:  duration: 1.074 ms
      LOG:  duration: 1.912 ms

       

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

       

       

      posted @ 2016-04-06 08:45  db2zos  閱讀(2397)  評論(2)    收藏  舉報
      主站蜘蛛池模板: 亚洲综合成人av在线| 亚洲国产精品久久久天堂麻豆宅男 | 99精品国产兔费观看久久99| 国产成人8X人网站视频| 鄂托克旗| 亚洲精品一区二区三区蜜| 国产精品视频亚洲二区| 国产精品一码在线播放| 男女性高爱潮免费网站| 国产jizzjizz视频| 国产亚洲一二三区精品| 中文字幕在线亚洲精品| 免费无码影视在线观看mov| 成人网站网址导航| 国产无遮挡又黄又爽在线视频| 老熟女多次高潮露脸视频| 亚洲av成人无码精品电影在线| 日本人妻巨大乳挤奶水免费| 亚洲AV无码国产在丝袜APP| 在线看免费无码av天堂的| 中国老熟妇自拍hd发布| 久久热这里只有精品国产| 亚洲国产精品久久久天堂麻豆宅男 | 亚洲综合国产伊人五月婷| 成人年无码av片在线观看| 亚洲丶国产丶欧美一区二区三区| 色先锋av影音先锋在线 | 久久精品免视看成人国产| 在线播放亚洲人成电影| WWW丫丫国产成人精品| 97久久综合亚洲色hezyo| 亚洲国产成人va在线观看天堂 | 国产一区二区三区免费观看| 国产成人无码aa精品一区| 国产精品爽爽爽一区二区| 最新午夜男女福利片视频| 成人无码视频97免费| 人人澡人摸人人添| 999精品色在线播放| 久久人妻精品国产| 国产高清小视频一区二区|