У меня чертовски SQL-запрос, который я хотел бы оптимизировать. Давай поговорим об этом - PullRequest
3 голосов
/ 27 декабря 2011

Итак, вот вопрос, который наверняка заставит экспертов по SQL перепрыгивать меня, называя меня ленивым, но я в тупике.Наш интернет-магазин сломался и сгорел сегодня утром, и вот подозрительный запрос.Я думал об этом весь день и не придумал никаких гениальных оптимизаций.Могу ли я получить помощь?Какие-нибудь важные показатели?Способы реструктурировать это?Я понимаю, что это все равно, что спросить, что находится на другой стороне стены, а затем дать вам телескоп, указывающий в другом направлении, но решил, что это стоит того:

SELECT DISTINCT (SELECT filename FROM (SELECT DISTINCT y.value AS label, x.value AS filename 
                        FROM   `catalog_product_super_link` AS z 
                        INNER JOIN `catalog_product_entity_varchar` AS y 
                        ON z.product_id = y.entity_id 
                        INNER JOIN `catalog_product_entity_varchar` AS x 
                        ON z.product_id = x.entity_id 
                        WHERE  parent_id = (SELECT entity_id 
                                             FROM   `catalog_product_entity`
                                             WHERE  sku LIKE 'F11-ARC-7710%' 
                                             LIMIT  0, 1) 
                        AND y.attribute_id = (SELECT attribute_id 
                                               FROM   `eav_attribute` 
                                               WHERE  attribute_code = 'image_label' 
                                               AND entity_type_id = (SELECT entity_type_id FROM `eav_entity_type` WHERE entity_type_code = 'catalog_product') LIMIT 0, 1) 
                        AND x.attribute_id = (SELECT attribute_id 
                                               FROM   `eav_attribute` 
                                               WHERE  attribute_code = 'image' 
                                               AND entity_type_id = (SELECT entity_type_id FROM `eav_entity_type` WHERE entity_type_code = 'catalog_product'))) AS images WHERE c.value LIKE CONCAT(label,'%') LIMIT 0, 1) AS image,
                        pricing_value, 
                        is_percent, 
                        value_index, 
                        c.value AS label,
                        d.sort_order AS sort_order
                        FROM   `catalog_product_super_attribute_pricing` AS a 
                        INNER JOIN `catalog_product_super_attribute_label` AS b 
                        ON a.product_super_attribute_id = b.product_super_attribute_id 
                        INNER JOIN `eav_attribute_option_value` AS c 
                        ON value_index = c.option_id 
                        INNER JOIN `eav_attribute_option` AS d
                        ON c.option_id = d.option_id 
                        WHERE  a.product_super_attribute_id = (SELECT product_super_attribute_id 
                                                               FROM   `catalog_product_super_attribute` 
                                                               WHERE  product_id = 5928 
                                                               AND attribute_id = 143 LIMIT 0, 1) 

                        UNION ALL

                        SELECT DISTINCT (SELECT filename FROM (SELECT DISTINCT y.value AS label, x.value AS filename 
                                         FROM   `catalog_product_super_link` AS z 
                                         INNER JOIN `catalog_product_entity_varchar` AS y 
                                         ON z.product_id = y.entity_id 
                                         INNER JOIN `catalog_product_entity_varchar` AS x 
                                         ON z.product_id = x.entity_id 
                                         WHERE  parent_id = (SELECT entity_id 
                                                             FROM   `catalog_product_entity`
                                                             WHERE  sku LIKE 'F11-ARC-7710%' 
                                                             LIMIT  0, 1) 
                                         AND y.attribute_id = (SELECT attribute_id 
                                                               FROM   `eav_attribute`
                                                               WHERE  attribute_code = 'image_label' 
                                                               AND entity_type_id = (SELECT entity_type_id FROM `eav_entity_type` WHERE entity_type_code = 'catalog_product') LIMIT 0, 1) 
                                         AND x.attribute_id = (SELECT attribute_id 
                                                               FROM   `eav_attribute` 
                                                               WHERE  attribute_code = 'image' 
                                                               AND entity_type_id = (SELECT entity_type_id FROM `eav_entity_type` WHERE entity_type_code = 'catalog_product'))) AS images
                                                               WHERE label LIKE CONCAT((SELECT value FROM `eav_attribute_option_value` WHERE option_id = c.value LIMIT 0, 1),'%') LIMIT 0, 1) AS image,
                                        0 AS pricing_value, 
                                        0 AS is_percent, 
                                        c.value AS value_index, 
                                        (SELECT value FROM `eav_attribute_option_value` WHERE  option_id = c.value LIMIT  0, 1) AS label,
                                        (SELECT sort_order FROM `eav_attribute_option` WHERE option_id = c.value LIMIT 0, 1) AS sort_order
                        FROM   `catalog_product_entity` AS a 
                        INNER JOIN `cataloginventory_stock_status` AS b 
                        ON a.entity_id = b.product_id 
                        INNER JOIN `catalog_product_entity_int` AS c 
                        ON a.entity_id = c.entity_id 
                        INNER JOIN `cataloginventory_stock_item` AS d 
                        ON a.entity_id = d.product_id 
                        WHERE  c.attribute_id = (SELECT attribute_id 
                                                 FROM   `eav_attribute` 
                                                 WHERE  attribute_code = 'choose_size' 
                                                 AND entity_type_id = (SELECT entity_type_id FROM `eav_entity_type` WHERE entity_type_code = 'catalog_product') LIMIT 0, 1) 
                        AND a.entity_id IN (SELECT DISTINCT product_id 
                                            FROM   `catalog_product_super_link` 
                                            WHERE  parent_id = (SELECT entity_id FROM `catalog_product_entity` WHERE sku LIKE 'F11-ARC-7710%' LIMIT  0, 1)) 
                        AND (b.qty > 0 OR d.manage_stock = 0) 
                        AND (SELECT value 
                             FROM   `eav_attribute_option_value` 
                             WHERE  option_id = c.value 
                             LIMIT  0, 1) NOT IN (SELECT c.value 
                                                  FROM `catalog_product_super_attribute_pricing` AS a
                                                  INNER JOIN `catalog_product_super_attribute_label` AS b ON a.product_super_attribute_id = b.product_super_attribute_id 
                                                  INNER JOIN `eav_attribute_option_value` AS c ON value_index = c.option_id 
                                                  WHERE  a.product_super_attribute_id = (SELECT product_super_attribute_id FROM `catalog_product_super_attribute`
                                                                                 WHERE product_id = 5928 
                                                                                         AND attribute_id = 143))
                        ORDER BY sort_order

Заранее спасибо!

Ответы [ 4 ]

6 голосов
/ 27 декабря 2011

это будет почти невозможно без дополнительной информации и даже вашего тестового стенда ...

НО в дополнение к выполнению плана объяснения и добавлению индексов, как предлагают другие - я вижу некоторые вещи, которые, вероятно, могутвытащить оттуда, чтобы улучшить вещи:

например, вы повторили подвыборы: как этот:

(SELECT entity_id 
FROM   `catalog_product_entity`
WHERE  sku LIKE 'F11-ARC-7710%' 
LIMIT  0, 1) 

рассмотрите возможность вытащить их на самый высокий уровень предложения FROM, а затем присоединитьсячтобы получить результаты.ОДНАЖДЫ не много раз.если вы сделаете это для 3 или 4 вариантов, вы должны увидеть улучшение.

еще одна вещь, которая выглядит не совсем правильно, это DISTINCT, вложенная очень глубоко во вложенные элементы ... они, вероятно, вам не нужны иони, вероятно, добавляют накладные расходы.

3 голосов
/ 27 декабря 2011

Быстрый ответ.

Можете ли вы сделать это в эквиваленте PLSQL?Можете ли вы устранить эти подзапросы?

Сначала сделайте их и сохраните результаты.Предполагая, что они возвращают одну строку.

Затем напишите меньший запрос, передав переменные.

3 голосов
/ 27 декабря 2011

О, мой.

Мне нечего предложить, кроме индексов для каждого столбца в предложениях WHERE и EXPLAIN PLAN, чтобы посмотреть, есть ли TANLE SCAN.СОЕДИНЕНИЯ или больше будут работать плохо.Я считаю больше предложений INNER JOIN, чем в вашем.У меня были бы серьезные оговорки по этому запросу.Можно ли денормализовать?Что насчет VIEW?Может ли это помочь вам здесь?Вы знаете свою схему и проблему лучше, чем я.

1 голос
/ 27 декабря 2011

Этот вопрос, на который я ответил на днях, может вам немного помочь:

Как я могу оптимизировать этот SQL-запрос с помощью вложенных SELECT?

Речь идет о создании вложенныхзапросы более эффективны.Я подозреваю, что если бы вы обрабатывали вложенные выборки отдельно, а затем использовали результаты для формирования более простого запроса, это помогло бы.Предоставленный тур-запрос намного сложнее, так что, скорее всего, он намного сложнее, но, надеюсь, это начало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...