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