У меня есть приложение на основе RubyOnRails 4.0. У меня две модели: магазины и продукты. В системе около 1,5 миллионов продуктов, что делает его довольно медленным, если я не использую индексы должным образом.Создать индекс postgres для таблицы с внутренним соединением в RubyOnRails
Некоторые основные сведения
- магазин has_many Продукты
- Store.affiliate_type_id используется где 1 = Дочернее 2 = Не аффилированные
- продукты имеют атрибуты, такие как "category_connection_id" (целое число) и «is_available "(boolean)
В модели FeededProduct:
scope :affiliated, -> { joins(:store).where("stores.affiliate_type_id = 1") }
Этот запрос занимает около 500 мс, который в основном прерывает сайт:
FeededProduct.where(:is_available => true).affiliated.where(:category_connection_id => @feeded_product.category_connection_id)
корреспондент PostGreSQL:
FeededProduct Load (481.4ms) SELECT "feeded_products".* FROM "feeded_products" INNER JOIN "stores" ON "stores"."id" = "feeded_products"."store_id" WHERE "feeded_products"."is_available" = 't' AND "feeded_products"."category_connection_id" = 345 AND (stores.affiliate_type_id = 1)
Update. Postgresql EXPLAIN:
QUERY PLAN
-------------------------------------------------------------------------------------------------
Hash Join (cost=477.63..49176.17 rows=21240 width=1084)
Hash Cond: (feeded_products.store_id = stores.id)
-> Bitmap Heap Scan on feeded_products (cost=377.17..48983.06 rows=38580 width=1084)
Recheck Cond: (category_connection_id = 5923)
Filter: is_available
-> Bitmap Index Scan on cc_w_store_index_on_fp (cost=0.00..375.25 rows=38580 width=0)
Index Cond: ((category_connection_id = 5923) AND (is_available = true))
-> Hash (cost=98.87..98.87 rows=452 width=4)
-> Seq Scan on stores (cost=0.00..98.87 rows=452 width=4)
Filter: (affiliate_type_id = 1)
(10 rows)
Вопрос: Как я могу создать индекс, который будет принимать внутреннее соединение во внимание и сделать это быстрее?
'EXPLAIN ANALYZE' возвращает более полезные сведения. –
Спасибо, но я не смог найти хороший способ сделать это в RubyOnRails. Любой совет здесь? – Christoffer
В PostgreSQL используйте 'explain analysis' вместо' explain'. –