Я использую: Rails 3.2.13 и PostgreSQL 9.4.7
У меня есть 2 таблицы продуктов, AProducts
и BProducts.
Обе таблицы имеют целое число category_id
, которое является индексированным столбцом,и обе таблицы имеют несколько миллионов записей.
Когда я запрашиваю AProducts
по category_id
, ответ быстрый и использует индекс, но когда я запрашиваю BProducts
, ответ очень очень медленный, и ониспользует последовательное сканирование вместо использования индекса.Я пытаюсь выяснить, почему это происходит для BProducts
, учитывая, что таблица и модель почти идентичны AProducts
.Вот результаты EXPLAIN:
irb(main):2290:0> BProduct.where(:category_id => 700).explain
BProduct Load (219696.7ms) SELECT "b_products".* FROM "b_products" WHERE "b_products"."category_id" = 700
EXPLAIN (1.3ms) EXPLAIN SELECT "b_products".* FROM "b_products" WHERE "b_products"."category_id" = 700
=> "EXPLAIN for: SELECT \"b_products\".* FROM \"b_products\" WHERE \"b_products\".\"category_id\" = 700\n QUERY PLAN\n-----------------------------------------------------------------------------\n Seq Scan on b_products (cost=0.00..1791663.25 rows=926 width=2036)\n Filter: (category_id = 700)\n(2 rows)\n"
Медленный запрос выше занимает 219696,7 мс и не использует индекс.Приведенный ниже запрос для AProduct является быстрым, и он использует индекс.
irb(main):2289:0> AProduct.where(:category_id => 700).explain
AProduct Load (51.0ms) SELECT "a_products".* FROM "a_products" WHERE "a_products"."category_id" = 700
EXPLAIN (1.2ms) EXPLAIN SELECT "a_products".* FROM "a_products" WHERE "a_products"."category_id" = 700
=> "EXPLAIN for: SELECT \"a_products\".* FROM \"a_products\" WHERE \"a_products\".\"category_id\" = 700\n QUERY PLAN\n--------------------------------------------------------------------------------------------------------------------------------\n Index Scan using index_a_products_on_category_id on a_products (cost=0.56..5448.33 rows=1359 width=883)\n Index Cond: (category_id = 700)\n(2 rows)\n"
Я пытаюсь выяснить, как я могу заставить мои запросы BProduct использовать индекс и извлекать записи с той же скоростьюкак AProduct, и почему я не вижу поведения по умолчанию?