Могут ли выражения Common Table использоваться здесь для производительности? - PullRequest
3 голосов
/ 01 июля 2011

Можно ли использовать выражения COMMON Table, чтобы SQL Server не выполнял следующий синтаксический анализ строки дважды для каждой записи?Я предполагаю «нет».

SELECT DISTINCT
    Client_ID
    ,RIGHT('0000000' + RIGHT(Client_ID
                             ,PATINDEX('%[^0-9]%'
                                       ,REVERSE('?' + Client_ID)) - 1)
           ,7) AS CorrectedClient
FROM
    membob_vw
WHERE
    Client_ID <> RIGHT('0000000' + RIGHT(Client_ID
                                         ,PATINDEX('%[^0-9]%'
                                                   ,REVERSE('?' + Client_ID)) - 1)
                       ,7)
ORDER  BY
    1
    ,2 

Каждый раз, когда я пытаюсь отформатировать SQL как «блок кода», он выглядит хорошо (отображается на нескольких строках) до обновления страницы, после чего SQLотображается, по крайней мере для меня, все в ОДНОЙ строке - и я не могу понять, что это так.

Показывает ли это таким образом для людей, которые используют браузер, новый, чем IE6?Моя компания навязывает мне этот POS-браузер и запрещает мне использовать другие.

Ответы [ 2 ]

3 голосов
/ 01 июля 2011

НЕТ, CTE не будет ничего делать с точки зрения производительности для этого запроса.Может показаться странным / неэффективным вводить одно и то же большое строковое выражение дважды.Тем не менее, SQL Server будет выполнять строковое выражение только один раз в строке, он был оптимизирован для подобных вещей.

РЕДАКТИРОВАТЬ
CTE уменьшит дублирующийся код:

;WITH AllRows AS (
SELECT DISTINCT
    Client_ID
    ,RIGHT('0000000' + RIGHT(Client_ID
                             ,PATINDEX('%[^0-9]%'
                                       ,REVERSE('?' + Client_ID)) - 1)
           ,7) AS CorrectedClient
FROM
    membob_vw
)
SELECT * FROM AllRows WHERE Client_ID<>CorrectedClient
ORDER  BY
    1
    ,2 

, но не будет работать лучше.ИСПОЛЬЗУЙТЕ SET SHOWPLAN_ALL ON, и я готов поспорить, что вы видите один и тот же план запросов для каждой версии.

БУДЬТЕ ОСТОРОЖНЫ, пытаясь сделать запросы красивыми и сократить лишние фрагменты кода! простые выглядящие изменения SQL могутимеют серьезные неблагоприятные последствия для производительности!всегда проверяйте производимые изменения (выполнение и / или план запроса).Я видел тривиальные изменения, внесенные в запросы, которые выполняются мгновенно, в результате чего их выполнение занимает минуты.Ключ к SQL - производительность, а не красивый код.Если приложение работает медленно, кого волнует, хорошо ли выглядит код.

1 голос
/ 01 июля 2011

Если вы собираетесь многократно выполнять этот запрос, и особенно если Client_ID редко обновляется, вам следует рассмотреть вычисляемый столбец или предварительно вычислить CorrectedClient и сохранить его отдельно.

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