2012-05-30 46 views
2

以下查詢在postgresql 9.1上大約需要300-400ms。 該表包含〜2M行。 這種表現是否合理?可以改進嗎?postgresql抓取100個隨機行

SELECT "Products"."Id" 
     , "Products"."Title" 
     , "Products"."ThumbHeight" 
     , "Products"."LargeImageWidth" 
     , "Products"."LargeImageHeight" 
     , "Products"."Url" 
     , "Products"."BrowseNodeId" 
FROM "Products" 
WHERE "Products"."Id" = ANY(ARRAY(SELECT (random()*2233071)::int 
       FROM generate_series(1, 100))); 

這裏是解釋計劃:

-------------------------------------------------------------------------------- 
Bitmap Heap Scan on "Products" (cost=60.48..100.46 rows=10 width=268) 
    Recheck Cond: ("Id" = ANY ($0)) 
    InitPlan 1 (returns $0) 
    -> Function Scan on generate_series (cost=0.00..17.50 rows=1000 width=0) 
    -> Bitmap Index Scan on "Products_pkey" (cost=0.00..42.97 rows=10 width=0) 
    Index Cond: ("Id" = ANY ($0)) 

解釋分析:

Bitmap Heap Scan on "Products" (cost=60.48..100.46 rows=10 width=268) (actual time=77.702..80.944 rows=100 loops=1) 
    Recheck Cond: ("Id" = ANY ($0)) 
    InitPlan 1 (returns $0) 
    -> Function Scan on generate_series (cost=0.00..17.50 rows=1000 width=0) (actual time=0.097..0.348 rows=100 loops=1) 
    -> Bitmap Index Scan on "Products_pkey" (cost=0.00..42.97 rows=10 width=0) (actual time=77.601..77.601 rows=104 loops=1) 
     Index Cond: ("Id" = ANY ($0)) 
Total runtime: 81.409 ms 

編號是主鍵: "Products_pkey" PRIMARY KEY, btree ("Id")

謝謝!

回答

0

這裏是我使用的情況下效果很好的解決方案(選擇100個隨機產品網頁):

  1. 複製表
  2. 洗牌錶行
  3. 從隨機範圍添加自動遞增列
  4. 選擇(例如100-200,1567000-1567100)

查詢時間下降到2ms

這是我用過的命令集:

create table RandProducts as select * from "Products" order by random(); 
alter table RandProducts add column RandId serial8; 
create index on RandProducts(randid); 

然後得到100個隨機行中我只是做這樣的事情:

select * from Products where RandId between 8000 and 8100; 
1

相比嘗試使用此方法查詢:

SELECT "Products"."Id" 
     , "Products"."Title" 
     , "Products"."ThumbHeight" 
     , "Products"."LargeImageWidth" 
     , "Products"."LargeImageHeight" 
     , "Products"."Url" 
     , "Products"."BrowseNodeId" 
FROM "Products" 
ORDER BY random() 
LIMIT 100 
+0

時間:24109.466毫秒 – michaelr524

+1

這是當你在尋找性能時,最糟糕的解決方案,特別是對於大型表格。 – michaelr524