我在一次采访中被问到这个问题,并认为值得在这里分享。
我使用的是带有ASP.Net的Sql Server 2008,我的要求是选择没有任何条件的表数据,选项如下,
存储过程
查看
我也检查了这个question,但无法得到我想要的确切答案。
我应该选择哪一个只执行选择查询而没有任何条件以及为什么在安全性,性能等方面呢?
答案 0 :(得分:1)
此链接包含您需要的大部分内容:
What is the difference between a stored procedure and a view?
对于上面的场景,我猜你应该继续使用View,因为view只是表的快照,不会暴露整个表,因此更快更安全。视图只是数据的表示和来源,当存储过程涉及表和视图上的事务时,它们的功能更加充满...
答案 1 :(得分:1)
与视图或常规SELECT语句相比,存储过程可提供最佳性能提升。
为什么?
1)当一个普通的SELECT语句传递给数据库时,它必须被编译然后执行,这会增加开销。
2)SELECT语句和视图的编译和可执行计划相同。
3)预编译存储过程以加快执行速度
答案 2 :(得分:1)
我会使用一个视图。你也错过了一个选项 - 一个表值函数。
这里有3种可能性 - 视图,表值函数或存储过程。
视图是基本的 - 它不能参数化。但它可以很容易地组成一个更大的查询的一部分,并且优化器可以(通常)期望生成一个最佳的计划,就好像你在查询中包含了视图的主体一样(实际上,它经常被一个宏所喜欢) “扩展”到您的查询中。)
表值函数可以参数化,但不能在数据库中产生任何副作用。但是,它仍然可以组成查询,并且(如果它是内联TVF,并且你有尾风),优化器仍然可以,希望产生最佳计划。
存储过程功能强大 - 它可以执行任何操作,它可以对数据库进行更改,但它可以根据需要计算结果。但是,您唯一的选择是执行它。它的执行发生在一个单独的范围内,不能组成一个更大的查询。
因此,我建议使用满足您需求的上述功能最少的功能 - 因为它提供了最大范围,可以在以后将其作为其他查询的一部分重用。
Re:性能 - 如果您只是对视图执行简单SELECT *
或者只是执行存储过程,则不应存在任何明显的差异。
Re:安全 - 再次,差别不大 - 您可以轻松GRANT
/ DENY
SELECT
在视图上EXEC
存储过程。< / p>
答案 3 :(得分:0)
如果您的查询是要选择表中的所有数据,则无法通过使用存储过程获得优化,因为它很可能执行完整的表扫描,因为它不会使用任何索引。您可以通过在NC索引列上放置一个虚拟where子句来使其使用NC索引,例如“Where INDEX_WhatEverNameIs&gt; 0”
如果我对谁应该看到某种限制,我会使用一个视图。 在这种情况下,您可以回答为View,因为您可以选择一个索引视图,该视图会将其存储在内存中并且每次都提供相同的信息。