2 аналогичные таблицы с индексированным category_id - 2 разных запроса, сгенерированных Postgres - PullRequest
0 голосов
/ 14 мая 2018

Я использую: 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, и почему я не вижу поведения по умолчанию?

1 Ответ

0 голосов
/ 14 мая 2018

Может быть, ваша таблица на самом деле не проиндексирована?

Проверьте это на консоли rails: ActiveRecord::Base.connection.indexes(:table_name)

Вы также можете сделать это непосредственно на postgres: SELECT indexname FROM pg_indexes;

...