2015-01-19 5 views
0

Ниже представлен запрос, который я написал, хотел узнать, могу ли я улучшить производительность дальше. Может кто-нибудь, пожалуйста, помогите мне?Удалить запрос -Чтобы улучшить производительность

DELETE FROM GLOBAL_TEMP 
WHERE EXISTS (
    SELECT GLOBAL_TEMP.ASSET_ID 
    FROM TEMP AEE 
     WHERE GLOBAL_TEMP.ASSET_ID = AEE.ID_ASSET 
     AND GLOBAL_TEMP.TYPE = 'abcdef' 
     AND AEE.id_temp_notation 
    IN (SELECT ID FROM TEMP2 WHERE IS_DISPLAYABLE = 'N') 
); 
+2

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

+0

«IN» будет медленным, вторая существует или соединение между temp и temp2, вероятно, будет более эффективным. также индексируется temp2 id, как is_displayable в temp2? – xQbert

+0

Больше информации. Объем данных в GLOBAL_TEMP, TEMP и TEMP2; индексы по соответствующим столбцам; план выполнения для инструкции delete. –

ответ

0

Это, вероятно, будет немного более эффективным ... в пункте может быть медленным по сравнению с объединением или существует .. и возвращение 1 (так как мы просто проверка на существование, а не значений), а от поиска каждого значения, вероятно, будет немного быстрее.

DELETE FROM GLOBAL_TEMP 
WHERE EXISTS (
    SELECT 1 
    FROM TEMP AEE 
    INNER JOIN temp2 t2 
    on AEE.ID_temp_notation = t2.id 
    WHERE GLOBAL_TEMP.ASSET_ID = AEE.ID_ASSET 
     AND GLOBAL_TEMP.TYPE = 'abcdef' 
     and t2.is_Displayable='N'); 

Однако, не зная конкретные индексы, полные отношения таблиц и объем данных, наряду с планами выполнения, это «догадка», основанная на «IN», как правило, является медленным.

+0

Предложение IN не обязательно может быть заменено JOIN. Плюс почти во всех случаях, когда он может быть заменен, Oracle будет создавать идентичные планы выполнения. –