2015-01-23 2 views
1

У меня есть один и тот же сценарий SQL:SQL обновление оптимизирует и выберите запросы

.... 

update table_1 set atrDate_1 = date_1 
where atr_1 = param_1 
and atr_2 <= param_2 
and atr_3 > param_3 
and ... 

select * from table_1 
where atr_1 = param_1 
and atr_2 <= param_2 
and atr_3 > param_3 
and ... 
.... 

В этом сценарии у меня есть два запроса. Как вы можете видеть, что условия в этих запросах равны.

Мои бизнес-правила требуют выполнения этих запросов в том порядке, в котором я вам показываю. Но я думаю, что эти запросы не являются оптимальными, потому что мне нужно использовать равные условия в запросах.

Возможно, вы знаете, как оптимизировать мои запросы?

Спасибо.

+0

Вы создали какой-либо индекс? –

+0

@SalmanA Да, у меня есть индекс в 'table_1'. У меня есть индекс на 'atr_1' и' atr_2' – netwer

+0

Является ли это сервером баз данных Advantage или Microsoft SQL Server? Если ваш вопрос не имеет ничего общего с Microsoft SQL Server, то здесь тег 'tsql' здесь неправильный. –

ответ

1

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

Затем вы можете использовать эту временную таблицу в качестве фильтра, который может быть быстрее, чем применение предикатов фильтра несколько раз.

SELECT 
    id 
INTO #ids 
FROM table_1 
WHERE 
     atr_1 = param_1 
    AND atr_2 <= param_2 
    AND atr_3 > param_3 
    AND ... 

UPDATE 
    t1 
SET 
    atrDate_1 = date_1 
FROM #ids tmp 
JOIN table_1 t1 ON id = tmp.id 

SELECT 
    t1.* 
FROM #ids tmp 
JOIN table_1 t1 ON id = tmp.id 
+0

Благодарим вас за ответ. Я думаю, что это решение более полезно для меня. – netwer

0

вам не нужен второй select заявление вместо этого использовать Output заявление в update

UPDATE table_1 
SET atrDate_1 = date_1 
output inserted.* 
WHERE atr_1 = param_1 
     AND atr_2 <= param_2 
     AND atr_3 > param_3 
     ..... 
+0

Благодарим вас за ответ. Я попробую ваше решение. – netwer

0

Я хотел бы предложить вам создать следующие показатели:

CREATE INDEX IX_table1_1_2_3 ON table1 (atr_1,atr_2,atr_3) 
CREATE INDEX IX_table1_1_3_2 ON table1 (atr_1,atr_3,atr_2) 

Затем держать глаза на какие используются. SQL Server, вероятно, будет использовать оба значения в зависимости от значений внутри столбцов atr_2 и atr_3 и значения, заданного для параметров.

Смежные вопросы