Производительность: Должен ли я объединить несколько поисковых запросов в один?

#sql-server

#sql-server

Вопрос:

У меня есть два поисковых запроса, которые можно объединить в один. Я часто вижу это в сохраненных процедурах, с которыми я имею дело (бизнес-приложения), и я хотел получить некоторые мнения о том, есть ли какая-либо реальная выгода в их консолидации.

Когда я запускаю их оба, вариант 1 дает мне 1300 операций чтения (2 раза), но поскольку данные уже кэшированы, второй набор из 1300 операций чтения не стоит дорого, они всегда будут просто логическими операциями чтения.

Вариант 2 дает мне 1300 логических операций чтения только один раз. Стоит ли их объединять, или это просто вопрос предпочтений, без какой-либо реальной выгоды в любом случае? Я настоятельно предпочитаю обращаться к таблице только один раз (вариант 2). Я просто анальный?

 DECLARE @lookupValue1 INT
        , @lookupValue2 INT
        , @key INT = 1000
        , @recType INT = 'X';

-- Option 1:  two separate simple lookups
SELECT  @lookupValue1 = LookupValue 
FROM    DB1.dbo.T1 
WHERE   KeyValue = @key 
        AND RecType = 'Default';

SELECT  @lookupValue2 = LookupValue 
FROM    DB1.dbo.T1
WHERE   KeyValue = @key
        AND RecType = @recType;

-- Option 2: one combined slightly convoluted lookup
SELECT  @lookupValue1 = MAX(CASE WHEN RecType = 'Default' THEN LookupValue END)
        , @lookupValue2 = MAX(CASE WHEN RecType = @recType THEN LookupValue END)
FROM    DB1.dbo.T1
WHERE   KeyValue = @key
        AND RecType IN ('Default', @recType);
 

Ответ №1:

Есть ли гарантия уникальности комбинации (KeyValue, recType)? Если они «должны быть уникальными», но не принудительно применены в БД, кто-то может испортить это позже.

  • Вариант 1 выдаст ошибку и предотвратит непреднамеренное поведение
  • Вариант 2 скроет проблему?

Если ограничение принудительно, подойдет любой способ.

кстати: я хотел предложить кэширование в качестве альтернативы, но, похоже, бизнес-логика находится в БД, а не в приложениях.

Комментарии:

1. 1 Спасибо, банда, хорошая мысль. В настоящее время в БД нет принудительного обеспечения уникальности, и я верну это разработчикам. Это, безусловно, повлияет на решение. Я немного подожду, прежде чем принять ваш ответ, мне любопытно, есть ли какие-либо другие мнения по этому поводу с точки зрения производительности.

2. С точки зрения производительности вы не дали убедительного обоснования, учитывая тривиальность 1300 чтений. Однако, если какой-либо план запроса показывает достаточно высокий процент доступа к поиску или при поиске часто возникают блокировки, тогда можно рассмотреть вариант 2 «да». imho первым шагом в оптимизации является поиск узкого места.

3. Спасибо. Я ценю ваш вклад.

4. Вы знаете о кэше БД, поэтому при вызове 100x option1 = 2600 чтений, option2 = 1300 чтений. По мере увеличения частоты польза уменьшается. С другой стороны, если база данных постоянно перегружена интенсивными операциями с памятью, кэш может часто очищаться. Это всего лишь предположения, будьте уверены, монитор (как и мой комментарий выше).