Улучшение производительности сводного обзора - PullRequest
0 голосов
/ 02 мая 2020

У меня есть структура ключ-значение для хранения динамических c объектов (стандарт EAV). Я сделал вид для этой сущности с помощью команды Pivot. Я попытался установить индекс для этого представления, но это невозможно из-за использования сводной таблицы.

Есть ли способ перетащить мои данные в SQL во время вставки, Обновить? Поскольку производительность очень важна для этих данных.

enter image description here

enter image description here

CREATE VIEW View_Products WITH SCHEMABINDING
AS
SELECT [Children Bicycles], [Comfort Bicycles], [Cruisers Bicycles]
        , [Cyclocross Bicycles], [Electric Bikes], [Mountain Bikes], [Road Bikes]
FROM (
    SELECT category_name, product_id
    FROM dbo.production.products p
    INNER JOIN dbo.production.categories c ON c.category_id = p.category_id
) t
PIVOT (
    COUNT(product_id) FOR category_name IN (
        [Children Bicycles], [Comfort Bicycles], [Cruisers Bicycles]
        , [Cyclocross Bicycles], [Electric Bikes], [Mountain Bikes], [Road Bikes]
    )
) AS pivot_table

1 Ответ

1 голос
/ 02 мая 2020

Не совсем. Если у вас нет очень глупых ошибок проектирования таблиц (которых у вас НЕ НЕТ) или у вас нет индексов, которые действительно имеют смысл - вы не можете многое сделать.

То, что вы МОЖЕТЕ сделать, - это не использовать Pivot. Pivot - это конструкция времени выполнения, и у меня был неоднократно сценарий ios, где я не выполнял вычисления времени выполнения по требованию. Т.е. ваш Vew_Products является представлением, но МОЖЕТ быть таблицей, которая поддерживается триггерами. Это будет распределять производительность от запроса к вставке / обновлению / удалению (с небольшим влиянием), но в конечном итоге это может снизить производительность по запросу. В зависимости от приложения это может быть очень полезно.

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

...