1

我在一次采访中被问到这个问题,并认为值得在这里分享。

我在 ASP.Net 中使用 Sql Server 2008,我的要求是无条件选择表数据,选项如下,

  1. 存储过程

  2. 看法

我也检查了这个问题,但无法得到我正在寻找的确切答案。

我应该选择哪一个来只执行选择查询而没有任何条件,为什么在安全性、性能等方面?

4

4 回答 4

1

我会使用视图。您还错过了一个选项 - 表值函数。

这里有 3 种可能性 - 视图、表值函数或存储过程。

视图是基本的——它不能被参数化。但是它可以很容易地作为更大查询的一部分组成,并且可以(通常)期望优化器产生最佳计划,就像您在查询中包含视图主体一样(实际上,它通常喜欢宏“扩展”到您的查询中)。

表值函数可以参数化,但不会在数据库中产生任何副作用。然而,它仍然可以组合成查询,并且(如果它是一个内联 TVF,并且你有顺风)优化器仍然可以,希望,产生一个最佳计划。

存储过程非常强大——它可以做任何事情,它可以对数据库进行更改,它可以根据需要计算结果。但是,您唯一的选择是执行它。它的执行发生在单独的范围内,并且不能组合成更大的查询。

因此,我建议使用满足您需求的上述功能中最不强大的 - 因为它提供了最大的范围,可以在以后将其作为其他查询的一部分重用。


回复:性能 - 如果您只是SELECT *对视图进行简单处理或只是在执行存储过程,则应该没有任何明显的差异。

回复:安全性 - 同样,差别不大 - 您可以像在存储过程中一样轻松地GRANT/DENY SELECT在视图上。EXEC

于 2013-07-19T06:48:41.623 回答
1

此链接包含您需要的大部分内容:

存储过程和视图有什么区别?

对于上述情况,我想您应该继续使用 View,因为 View 只是表格的快照,不会暴露整个表格,因此更快更安全。视图只是数据的表示和来源,当涉及到表和视图上的事务时,存储过程更加强大......

于 2013-07-19T06:23:45.887 回答
1

与视图或常规 SELECT 语句相比,存储过程提供了最佳性能增益。

为什么?

1) 当一个常规的 SELECT 语句被传递到数据库时,它必须被编译然后执行,这增加了开销。

2) SELECT 语句和视图的编译计划和可执行计划相同。

3) 预编译存储过程以加快执行速度

于 2013-07-19T06:29:48.617 回答
0

如果您的查询是选择表中的所有数据,则无法通过使用存储过程获得优化,因为它很可能会执行完整的表扫描,因为它不会使用任何索引。您可以通过在 NC 索引列上放置一个虚拟 where 子句(如“Where INDEX_WhatEverNameIs > 0”)使其使用 NC 索引

如果我对谁应该看到它有某种限制,将使用一个视图。在这种情况下,您可以回答为视图,因为您可以选择一个索引视图,它将其存储在内存中并每次都提供相同的服务。

于 2013-07-19T07:08:15.703 回答