Sql 在存储过程中使用视图而不是表?
在存储过程中查询视图而不是原始表是一种好做法吗?(即使视图没有提供任何不同的数据) 我一直认为这可能是个好主意,因为它是一个额外的抽象层,类似于在类函数中使用属性而不是成员变量 但是现在我正在研究由ASP.NET成员资格提供程序创建的存储过程,它们总是直接查询表Sql 在存储过程中使用视图而不是表?,sql,database,database-design,stored-procedures,views,Sql,Database,Database Design,Stored Procedures,Views,在存储过程中查询视图而不是原始表是一种好做法吗?(即使视图没有提供任何不同的数据) 我一直认为这可能是个好主意,因为它是一个额外的抽象层,类似于在类函数中使用属性而不是成员变量 但是现在我正在研究由ASP.NET成员资格提供程序创建的存储过程,它们总是直接查询表 我知道在使用视图时无法轻松插入数据,但如果存储过程仅查询数据,是否仍应直接使用表?如果是,主要原因是什么?(性能?不同的数据库优化器以不同的方式优化查询,因此这不是一个简单的答案。但是一般来说,添加抽象层会阻止优化器正确使用索引 在Sq
我知道在使用视图时无法轻松插入数据,但如果存储过程仅查询数据,是否仍应直接使用表?如果是,主要原因是什么?(性能?不同的数据库优化器以不同的方式优化查询,因此这不是一个简单的答案。但是一般来说,添加抽象层会阻止优化器正确使用索引 在Sql Server中,如果有where子句包含以下调用:
- 是空的
- 比如说“%某物”
- 不存在
在以下两种情况下,我在存储过程中使用了视图: 1-用于多个过程中需要的复杂联接或条件
2-替换重命名的表。例如,我有两个表,分别称为“member”和“non_member”。后来,我决定将它们合并到一个“用户”表中。为了避免修改我曾经编写的每个进程,我创建了名为“member”和“non_member”的视图,它们使用where子句适当地过滤“user”表。所有程序都像以前一样运行,没有任何更改。当我有时间时,我可以将它们更改为直接访问新表。视图只是一个扩展为外部查询的宏 如果您的视图包含多个联接,那么当您将If联接到其他视图时,当您在存储过程的SQL中实际看到3个联接时,您会突然有一个20或30路联接。您还会发现每个查询都是不同的:为什么每次查询都要连接相同的20或30个表 通常,除非视图被索引/具体化,并且优化者可以使用它,否则没有任何好处 诸如在单个表上由视图屏蔽的计算应该在计算列中:为什么要继续计算它?对于一个视图中多个表上的计算,应为其编制索引 使用存储过程已经意味着没有基表访问(所有权链接) 视图的良好用途是避免用户直接访问表,或屏蔽模式更改,或提供一些基本的安全性(例如基于SUSER_SNAME),但不是为了性能或思想(至少在SQL Server中),我的理解是存储过程是在编译时优化的,因此,总体上比视图更有效。我不确定,但我怀疑,通过对视图执行SPRC,您可能会丢失通过这种方式获得的任何优化 此外,为什么?正如前面的海报所建议的那样,如果所包含的一个或多个视图本身由多个联接组成,那么执行的联接可能比需要的要多,这一点并不明显 另外,我的理解是,使用视图的主要原因之一是以用户可以使用的格式显示表数据,同时保护表数据不受意外更改的影响。由于存储过程的结果集不受插入和更新的约束,因此这一点没有意义 由于设计的存储过程接受参数,不允许用户直接与表数据交互,并且可以执行您可能在视图中使用的任何查询逻辑(以及更多),因此在我看来(除了一些例外)这样做的主要原因是使编码更容易,以性能和可维护性为潜在成本(如果有人更改了其中一个视图,而没有意识到您的存储过程依赖于它怎么办?) 我建议将其全部编码到存储过程中,除非有令人信服的理由这样做 “我会去测试这个(在Sql Server中)-我会在5分钟后回来。”-嘿,很酷,谢谢。我就在这儿等D