SQL Server: Charindex по сравнению со стандартным оператором where clause, что более эффективно?

У меня есть около 9 функций с табличными значениями, которые используются в более чем 30 отчетах SSRS, которые я пытаюсь сделать более эффективными.

Одним из основных утверждений, общих для функций, является то, что существует множество операторов case с индексами символов, которые ищут имя программы из определенной таблицы для определения значения (т.е. когда charindex ('XXX', product)> 0, то '1').

Моя идея сделать это более эффективным состояла в том, чтобы добавить оператор case в программном центре в другую функцию и использовать его вместо исходной таблицы для упрощения обслуживания при развертывании новых продуктов (т. Это также устранило бы charindexes, добавив новую функцию (т.е. когда programhub = 'XXX', затем '1').

Когда я начал тестировать это, я не заметил каких-либо существенных различий в скорости (на самом деле казалось, что старый способ был быстрее, вероятно, из-за кеша).

Я попытался сравнить планы выполнения и статистику, но они тоже похожи, большая часть затрат приходится на сканирование кластерного индекса.

Есть какие-нибудь советы по общей эффективности? Есть ли способ обойти сканирование кластерного индекса или уменьшить нагрузку? Как я могу точно сказать, какой запрос лучше для системы?

Правильный способ - извлечь код из столбца продукта, сохранить его как новый столбец и добавить индекс поверх него. Тогда ваш запрос будет похож на SELECT * FROM tab WHERE new_indexed_col = 'XXX' или SELECT * FROM tab WHERE new_indexed_col LIKE 'XXX%'

Lukasz Szozda 13.09.2018 16:52

Я предполагаю, что у вас есть что-то вроде WHERE CHARINDEX(YourColumn,'a') или что-то в этом роде? Это не будет поисковый запрос; поэтому любые индексы, которые у вас есть в таблице, нельзя будет использовать, и, следовательно, это повлияет на производительность.

Larnu 13.09.2018 16:54

Кажется странным, что имя программы спрятано где-то в другой строке. Перемещение его в новый столбец (если возможно, потенциально строка содержит список программ?) И размещение на нем индекса, как указано @LukaszSzozda, или добавление его в другой индекс, который уже используется, может улучшить производительность. Причина, по которой ваш подход не показывает никаких преимуществ, МОЖЕТ БЫТЬ, потому что вы также фильтруете другие поля в таблице (или других таблицах, с которых оптимизатор считает более легким начать), и система учитывает только требование имени программы в конце.

deroby 01.10.2018 22:52
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
67
0

Другие вопросы по теме