2016-02-10 3 views
0

У меня есть активные записи запросКак я могу ускорить этот запрос?

Catalog::Product.joins(:product_properties).where("catalog_product_properties.name != ''").uniq.count 

он генерирует этот SQL

SELECT DISTINCT COUNT(DISTINCT "catalog_products"."id") FROM "catalog_products" INNER JOIN "catalog_product_properties" ON "catalog_product_properties"."catalog_product_id" = "catalog_products"."id" WHERE (catalog_product_properties.name != '') 

, которые выполняют ~ 1,8 второго

Я пытаюсь переписать это, и у меня есть этот

Catalog::Product.connection.select_all("SELECT COUNT(*) FROM (SELECT DISTINCT catalog_products.id FROM catalog_products INNER JOIN catalog_product_properties ON catalog_product_properties.catalog_product_id = catalog_products.id WHERE (catalog_product_properties.name != '')) AS temp") 

, которые выполняют около ~ 1 секунды, но он все еще слишком длинный. у нас около 200 тыс. записей, как я могу ускориться?

извините за мой плохой английский

ответ

0

Этот запрос:

SELECT DISTINCT COUNT(DISTINCT "catalog_products"."id") 
FROM "catalog_products" INNER JOIN 
    "catalog_product_properties" 
     ON "catalog_product_properties"."catalog_product_id" = "catalog_products"."id" 
WHERE (catalog_product_properties.name != '') 

Не нужны join (предполагая, что соответствующие внешнего ключа). Это можно записать в виде:

SELECT COUNT(DISTINCT "catalog_products_properties"."catalog_product_id") 
FROM "catalog_product_properties" 
WHERE (catalog_product_properties.name <> '') 

Этот запрос, в свою очередь, могут извлечь выгоду из индекса на catalog_product_properties(name, catalog_product_id).

Увы, я не знаком с Ruby, но это не должно быть очень сложно выразить.

+0

Спасибо Гордон, это хорошо solution.But этот запрос выполнить один и тот же, как мой запрос выше :) 1 second.I считалось невозможным загаданное быстрый запрос – user5542173

0

Вы должны написать:

Catalog::ProductProperty.where("catalog_product_properties.name != ''").count(:catalog_product_id, distinct: true) 
Смежные вопросы