Есть ли на сервере sql переключатель DEBUG для включения отладочной информации в результаты запроса? - PullRequest
2 голосов
/ 18 апреля 2011

Я пишу довольно сложный набор представлений, которые я буду использовать для создания некоторых очень сложных избранных характеристик. Чтобы избежать ошибок, я включил в представления как идентификатор некоторых полей, так и ОПИСАНИЕ. ОПИСАНИЕ нужно только для отладки, потому что оно мне не нужно в конечном запросе. Конечно, все работает, но для повышения производительности я бы хотел, чтобы можно было легко включать / удалять описания, чтобы не поддерживать 2 больших набора запросов (один для отладки и один для реального).

Так что мне было интересно, можно ли было иметь что-то вроде:

select
  FieldA,
  FieldB #ifdef DEBUG,
  FieldC,
  FieldD #endif

, так что если переключатель DEBUG включен, я получаю:

select
  FieldA,
  FieldB,
  FieldC,
  FieldD

в противном случае я получаю:

select
  FieldA,
  FieldB 

Это типично для компиляторов, но в любом случае есть ли метод, позволяющий эффективно имитировать это в T-sql?

Ответы [ 3 ]

2 голосов
/ 18 апреля 2011

НЕТ, и по уважительной причине.

, когда вы пишете процедуру с запросом:

select   FieldA,   FieldB,   FieldC,   FieldD ...

оптимизатор смотрит на кучу вещей, чтобы построить план запроса, которыйвключает столбцы, которые вы возвращаете.Если столбцы изменятся:

select   FieldA,   FieldC ....

план запроса также может измениться.Если ВСЕ возвращаемые столбцы находятся в индексе, тогда запрос фактически не попадает в таблицу (см. Охватывающий индекс).Другими элементами, влияющими на план запроса, являются доступные индексы, статистика, хранящаяся в таблице и индексе, а также какие и как вы фильтруете (где и объединять) в запросе.Добавьте туда OR, и вы можете иногда убить производительность.

Цель с SQL состоит в том, чтобы написать его так, чтобы он работал быстро, а не так, чтобы он не был избыточным и / или легким в обслуживании из кода кодера.перспектива.Вы можете легко и радикально изменить эффективность запроса, сделав тривиальные изменения.Такие вещи, как while x=1 begin... end, легко и предсказуемо переводятся в машинный код.Однако многие оптимизации, используемые при преобразовании select x from ... join .. join.., трудно предсказать даже для опытных разработчиков.эти оптимизации могут даже меняться при изменении данных.

, если вы действительно хотите что-то подобное, вам нужно сделать следующее:

1) написать свои процедуры так:

select
  FieldA,
  FieldB--||DEBUG||--,
  --||DEBUG||--FieldC,
  --||DEBUG||--FieldD

2) работать со всеми вашими процедурами в виде текстовых файлов (не только с объектами процедур в SSMS)
3) использовать утилиту поиска и замены, чтобы включить либо --||DEBUG||-- комментарий (помните что-нибудь в той же строке после --закомментировано) или замените его пустой строкой.
4) затем можно запустить сценарии процедуры с отладочной информацией или без нее.

2 голосов
/ 18 апреля 2011

Из набора инструментов:

Одной из функций в бесплатном SSMS Tools Pack является интеграция решения Racerx в SSMS.С его помощью вы можете создавать так называемые разделы отладки, как в примере с Racerx.Затем с помощью Combobox вы решаете, какую версию скрипта вы хотите выполнить: Debug или «Release», соответственно с разделами debug или без них.

Выглядит так:

select
  FieldA,
  FieldB
#-BeginDebug Put Description Here
  ,
  FieldC,
  FieldD
#-EndDebug
FROM t
0 голосов
/ 18 апреля 2011

Вы можете добавить параметр @debug в хранимую процедуру. Ваше утверждение будет выглядеть так:

IF @Debug=0
SELECT FiledA, FieldB
ELSE
SELECT FiledA, FieldB,FieldC,FieldD
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...