选择什么:Postgresql中动态SQL的存储过程

时间:2016-06-28 07:37:52

标签: database postgresql stored-procedures

这是Postgres特定的问题。我处于经典设计环境的中间,我必须决定是使用存储过程还是动态SQL(Prepared语句)。我已经阅读了很多关于相同内容的博客,并得出结论,通过当前高级数据库系统的实现,没有任何特定属性可以权衡一个而不是另一个。 因此我的问题是特定于Postgresql。

What I want to ask is, are there advantages or disadvantages of using Stored Procedures in Postgres? 

关于我的设计的更多信息:由于我们正在使用Postgres特定的函数,如width_bucket,并依赖于Postgres提供的其他各种分区和继承,我们不太可能在将来切换到任何其他数据库提供程序。我们的查询将是复杂的查询,涉及从实时/非实时数据构建图形和报告。 还会建立一些分析。此外,我们还计划对数据库进行分片和分区。 我希望使用存储过程的观点与我上面描述的系统和环境类型,特定于Postgresql。 我还想了解Postgres中的查询优化和执行是如何工作的。

1 个答案:

答案 0 :(得分:1)

好的,所以你的问题是是否在客户端创建sql并将其发送到服务器,而不是存储过程。请注意,通常如果您使用存储过程,您仍然必须创建调用它们的sql,因此它不仅仅是一个/或。所以这是关于存储过程的关系接口。

此外值得注意的是,一个关键问题是这是一个应用程序拥有的数据库还是许多应用程序可能使用的东西。在前者中,您可能不担心封装,但在后者中,您希望将数据库视为具有服务接口。

因此,如果它是“我的应用程序有一个数据库并且所有材料使用都通过我的应用程序”,那么请对基础表使用动态SQL。

但是,如果您的数据库有一个或多个应用程序,则需要确保可以在不破坏任何或所有数据库的情况下更改数据库结构。这通常意味着在某种抽象接口后面封装访问。这可以是VIEW或存储过程的使用。

视图的优点是它们可以在SQL中直接操作,并且非常灵活。这允许在它们后面进行广泛的检索(以及一些工作存储)数据。应用程序不需要知道数据的物理存储方式,也不需要知道如何访问数据。

存储过程具有相同的封装优势,但提供了更有限的接口。他们还有一个问题,通常人们以需要固定数量的参数的方式使用它们,因此添加参数需要密切协调db和应用程序的更新(Oracle的基于版本的版本是解决此问题但PostgreSQL没有任何问题类似)。但是,人们可以通过一些工作来发现参数并在运行时适当地处理它们。

总而言之,这是一个广泛的问题,具体细节将比一般性更重要。