увеличить скорость запроса - PullRequest
2 голосов
/ 27 октября 2011

Хорошо, у меня есть таблица:

ID Name    Description   Picture
1  Alex     Alex desc..     2
2  Maria      NULL          3
3  John      John desc..   NULL

изображение таблицы имеет идентификатор и изображение varbinary.

Мне нужно выбрать: если описание существует, то описание, остальное изображение Я делаю это:

select Id,
       Name, 
       Case when Description is null then pic.Image else Description 
      from person per join picture pic on per.Picture = pic.Id

Итак, выглядит как ненужное объединение, если описание не является нулевым. В любом случае. какие-либо предложения по улучшению этого простого запроса? Кроме того, Какие хорошие простые в использовании инструменты для сравнения производительности между двумя версиями запросов?

Ответы [ 3 ]

4 голосов
/ 27 октября 2011

Насколько я знаю, нет способа условно объединиться в одном запросе. Я бы, наверное, переписал, что у вас есть:

SELECT per.ID, per.Name, COALESCE(per.Description, pic.Image) as desc
FROM Person as per
LEFT JOIN Picture as pic
ON per.picture = pic.ID

Я не уверен, как сравнивается производительность, но она выглядит немного чище.

Что касается сравнения запросов, я бы порекомендовал посмотреть на план выполнения для обоих и посмотреть, выполняет ли какой-либо из них сканирование. Вот некоторая информация об использовании планов выполнения для настройки производительности:

Вы также можете использовать Помощник по настройке базы данных как быстрый способ проверить, есть ли у вас необходимые индексы.

Будьте осторожны, чтобы не тратить слишком много времени на оптимизацию. Хотя по мере роста базы данных хорошо следить за текущей производительностью и производительностью, легко потратить на это много времени, не получая слишком много взамен. Если у вас хорошая структура базы данных и хорошо написанные запросы, оптимизация в будущем не должна быть слишком сложной.

1 голос
/ 27 октября 2011

Но объединение необходимо, если описание не является нулевым .... и это то, что ваш код должен делать правильно?

Вы можете примерно определить время ваших запросов, упаковав ихс парой операторов select getdate () и выполнением математических операций (или написанием SQL-кода для выполнения математических операций за вас).

0 голосов
/ 27 октября 2011

Вы также можете сделать что-то вроде этого:

 select Id, Name, Description
 from person
 where description is not null
 union all
 select Id, Name, pic.image
 from person per 
 join picture pic on per.Picture = pic.Id
 where description is null

Не уверен, какова будет производительность, но вы делаете соединение только при необходимости, но за счет UNION. Объединение всех устранит необходимость сортировки отдельных строк, что должно повысить производительность.

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