У меня есть около 9 функций с табличными значениями, которые используются в более чем 30 отчетах SSRS, которые я пытаюсь сделать более эффективными.
Одним из основных утверждений, общих для функций, является то, что существует множество операторов case с индексами символов, которые ищут имя программы из определенной таблицы для определения значения (т.е. когда charindex ('XXX', product)> 0, то '1').
Моя идея сделать это более эффективным состояла в том, чтобы добавить оператор case в программном центре в другую функцию и использовать его вместо исходной таблицы для упрощения обслуживания при развертывании новых продуктов (т. Это также устранило бы charindexes, добавив новую функцию (т.е. когда programhub = 'XXX', затем '1').
Когда я начал тестировать это, я не заметил каких-либо существенных различий в скорости (на самом деле казалось, что старый способ был быстрее, вероятно, из-за кеша).
Я попытался сравнить планы выполнения и статистику, но они тоже похожи, большая часть затрат приходится на сканирование кластерного индекса.
Есть какие-нибудь советы по общей эффективности? Есть ли способ обойти сканирование кластерного индекса или уменьшить нагрузку? Как я могу точно сказать, какой запрос лучше для системы?
Я предполагаю, что у вас есть что-то вроде WHERE CHARINDEX(YourColumn,'a')
или что-то в этом роде? Это не будет поисковый запрос; поэтому любые индексы, которые у вас есть в таблице, нельзя будет использовать, и, следовательно, это повлияет на производительность.
Кажется странным, что имя программы спрятано где-то в другой строке. Перемещение его в новый столбец (если возможно, потенциально строка содержит список программ?) И размещение на нем индекса, как указано @LukaszSzozda, или добавление его в другой индекс, который уже используется, может улучшить производительность. Причина, по которой ваш подход не показывает никаких преимуществ, МОЖЕТ БЫТЬ, потому что вы также фильтруете другие поля в таблице (или других таблицах, с которых оптимизатор считает более легким начать), и система учитывает только требование имени программы в конце.
Правильный способ - извлечь код из столбца продукта, сохранить его как новый столбец и добавить индекс поверх него. Тогда ваш запрос будет похож на
SELECT * FROM tab WHERE new_indexed_col = 'XXX'
илиSELECT * FROM tab WHERE new_indexed_col LIKE 'XXX%'