Производительность VIEW по сравнению с оператором SQL - программирование
Подтвердить что ты не робот

Производительность VIEW по сравнению с оператором SQL

У меня есть запрос, который выглядит примерно так:

select <field list> 
from <table list>
where <join conditions>
and <condition list>
and PrimaryKey in (select PrimaryKey from <table list>
    where <join list> 
    and <condition list>)
and PrimaryKey not in (select PrimaryKey from <table list>
    where <join list>
    and <condition list>)

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

Один из разработчиков моей команды считает, что представление будет лучше. Я не согласен с тем, что оператор SQL использует переменные, переданные программой (на основе идентификатора входа пользователя).

Существуют ли какие-либо жесткие и быстрые правила при использовании представления в сравнении с использованием инструкции SQL? Какие проблемы с производительностью возникают при выполнении собственных SQL-запросов по сравнению с обычными таблицами и представлениями. (Обратите внимание, что все соединения/условия не соответствуют индексированным столбцам, поэтому это не должно быть проблемой.)

EDIT для уточнения...

Вот запрос, с которым я работаю:

select obj_id
from object
where obj_id in( 
(select distinct(sec_id) 
        from security 
        where sec_type_id = 494
        and (
            (sec_usergroup_id = 3278 
            and sec_usergroup_type_id = 230)
            or
            (sec_usergroup_id in (select ug_gi_id 
            from user_group 
            where ug_ui_id = 3278)
            and sec_usergroup_type_id = 231)
        )
        and sec_obj_id in (
        select obj_id from object 
        where obj_ot_id in (select of_ot_id 
            from obj_form 
            left outer join obj_type 
            on ot_id = of_ot_id 
            where ot_app_id = 87
            and of_id in (select sec_obj_id 
                from security
                where sec_type_id = 493
                and (
                    (sec_usergroup_id = 3278 
                    and sec_usergroup_type_id = 230)
                    or
                    (sec_usergroup_id in (select ug_gi_id 
                        from user_group 
                        where ug_ui_id = 3278)
                    and sec_usergroup_type_id = 231)
                    )                
            )   
            and of_usage_type_id  = 131
        )
        )   
        )
)
or 
(obj_ot_id in (select of_ot_id 
        from obj_form
        left outer join obj_type 
        on ot_id = of_ot_id 
        where ot_app_id = 87
        and of_id in (select sec_obj_id 
            from security
            where sec_type_id = 493
            and (
                (sec_usergroup_id = 3278 
                and sec_usergroup_type_id = 230)
                or
                (sec_usergroup_id in (select ug_gi_id 
                    from user_group 
                    where ug_ui_id = 3278)
                and sec_usergroup_type_id = 231)
                )
        )
        and of_usage_type_id  = 131

    )
    and
    obj_id not in (select sec_obj_id 
        from security 
        where sec_type_id = 494)
)
4b9b3361

Ответ 1

В зависимости от поставщика базы данных, в общем случае выполнение запроса по представлению объединяет SQL, определенный в представлениях с предложениями предложения Where и предложения Order By, добавляемых к sql, который вы передаете против View, чтобы придумайте комбинированный полный SQL-запрос для выполнения. Затем он выполняется так, как если бы он сам передавался процессу запросов, поэтому не должно быть разницы.

Представления - это организационный инструмент, а не инструмент повышения производительности.

От Разрешение просмотра SQL Server

Когда оператор SQL ссылается на неиндексированное представление, парсер и запрос оптимизатор анализирует источник как оператора SQL и представления и затем разрешить их в один план выполнения. Существует не один план для оператора SQL и отдельной план для просмотра.

Ответ 2

Обычный (не индексы/материализованный). Представления - это просто псевдонимы; они не предлагают каких-либо преимуществ по производительности. Выбор из представления генерирует точно такой же план запроса, что и выбор непосредственно из таблицы.

Ответ 3

Отклонения в сторону, не являются ли избыточные предложения PrimaryKey AND? Если значение PrimaryKey является IN в списке, не будет ли он в другом списке? Я думаю, что сжатие этих двух статей в одном повысит производительность.