简体   繁体   中英

rails query Timeout::Error: execution expired

I have one simple query, but its showing the Timeout::Error: execution expired , also i am using rack::timeout

SELECT  SUM(total_checks) as totalcheck FROM "orders"  WHERE 
(orders.order_status_id NOT IN (15, 17)) AND (orders.check_id = 36) AND 
(orders.pass_id = '49') AND (orders.created_at BETWEEN '2016-02-29 
22:00:00.000000' AND '2016-03-02 22:00:00.000000') LIMIT 1

also, i have total orders around 9762797, is there any issue with this query?

Got when did that explain analyze

----------
Limit  (cost=153.76..153.77 rows=1 width=5) (actual time=14622.323..14622.324
rows=1 loops=1)
->  Aggregate  (cost=153.76..153.77 rows=1 width=5) (actual 
time=14622.322..14622.322 rows=1 loops=1)

 ->  Index Scan using idx_orders_check_and_pass on orders 
(cost=0.43..153.76 rows=1 width=5) (actual time=2739.717..14621.649 rows=141 
loops=1)
       Index Cond: ((check_id = 36) AND (pass_id = 49))
       Filter: ((order_status_id <> ALL ('{15,17}'::integer[])) AND 
(created_at >= '2016-02-29 22:00:00'::timestamp without time zone) AND 
(created_at <= '2016-03-02 22:00:00'::timestamp without time zone))
       Rows Removed by Filter: 42396
Total runtime: 14622.524 ms

(7 rows)

You have quite big table to run SUM on. I would suggest to use some caching mechanism to avoid using this query, because 14 seconds is a lot.

For example, I would suggest creating new table total_orders_checks and store total checks there. You would need to update it every time you update orders table total_checks value and it might not suit your app design, but you'll definitely get total_checks out of it much faster.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM