#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 чтений. По мере увеличения частоты польза уменьшается. С другой стороны, если база данных постоянно перегружена интенсивными операциями с памятью, кэш может часто очищаться. Это всего лишь предположения, будьте уверены, монитор (как и мой комментарий выше).