我的查询类似于以下内容:
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语句使用程序传入的变量(基于用户的登录ID)。
对于何时应该使用视图而不是使用SQL语句,是否有任何严格的规则?在针对常规表和针对视图运行SQL语句时会出现什么样的性能增益问题。 (请注意,所有连接/ where条件都与索引列相对,因此不应成为问题。)
编辑澄清......
以下是我正在使用的查询:
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)
)
答案 0 :(得分:51)
根据数据库供应商的不同,通常,对视图执行查询会将View中定义的SQL与附加到您针对View传递的sql的Where子句谓词和Order By子句排序表达式组合在一起,提出一个完整的SQL查询来执行。然后执行它,好像它本身已传递给查询processsor,因此应该没有区别。
视图是一种组织工具,而不是性能增强工具。
当SQL语句引用时 非索引视图,解析器和查询 优化器分析两者的来源 SQL语句和视图和 然后将它们分解为单个 执行计划。没有一个计划 对于SQL语句和单独的 计划视图。
答案 1 :(得分:8)
常规(非索引/物化)视图只是别名;他们没有提供任何性能优势。从视图中选择会生成与直接从表中选择完全相同的查询计划。
答案 2 :(得分:0)
除了意见外,PrimaryKey AND子句不是多余的吗?如果PrimaryKey值在列表中,那么它不会在其他列表中吗?我认为将这两个条款合并为一个可以提高性能。