pgsql存储过程 - 内部,c或sql语言是最好的?

时间:2013-06-30 07:58:46

标签: postgresql

我有一个生产pgsql服务器,它具有以下存储过程语言支持:

  1. 内部
  2. C
  3. SQL
  4. 我找不到内部和c的示例,只是pl / pgsql或者在极少数情况下是sql。我会尝试让提供商安装其他语言,但提供商通常不会提供,所以我认为这不会发生......所以我被这些语言所困扰......

    我应该选择哪一个?为什么? (如果你有一个很好的教程,那么请在你的答案或评论中写下来)

    select * from pg_language
    

    enter image description here

    顺便说一句,我没有教程就测试c和内部,所以也许有一个简单的解决方案:我不能使用它们,因为它们不受信任。

    编辑 - 解决方案后

    create language对我有用的东西。之后,我通过以下查询检查了可用的语言:

    select * from pg_pltemplate
    

    enter image description here

    您可以阅读有关创建语言here的更多信息。

    我将使用plpgsql,我在这里找到了一本关于postgresql的好书:The PostgreSQL Programmer's Guide , Edited by Thomas Lockhart

3 个答案:

答案 0 :(得分:3)

通常,您可以使用四种,五种PL语言 - SQL,PL / pgSQL,PL / Python或PL / Perl,C。

  • SQL - 简短的一行函数 - 由于内联(如宏)可以超快(
  • PL / pgSQL - 适用于业务逻辑实现(如果您喜欢或不喜欢,它可以加速您的应用程序到期:更少的网络流量,更少的数据类型转换,更少的进程间通信 - PLpgSQL使用与Postgres兼容的类型并执行函数在PostgreSQL SQL执行器过程中) - 对于具有大量SQL查询的代码很有用,因为SQL的原生支持(你可以喜欢它或者你可以更喜欢ORM - 我个人不喜欢ORM - 它是我所知道的主要性能杀手)。
  • PL / Python或PL / Perl - 适用于PL / pgSQL不好或缺少必要功能的特殊任务 - 我喜欢PL / Perl因为在PostgreSQL中使用CPAN存档的可能性 - 需要发送main或需要做SOAP调用 - 一切都在CPAN。
  • C - 需要最高性能或访问PostgreSQL内部 - 然后使用C函数。一些通用字符串,日期,数学例程的快速实现是C语言中最简单的。

您可以在

中找到的C代码示例

C语言可用于实现自己的数据类型,必要的操作和索引支持。你可以找到很多PostgreSQL扩展 - 非常有名的是PostGIS。

答案 1 :(得分:2)

查看您的pg_language列表,显示默认值:如果我使用createdb,PostgreSql 8.4 / Debian创建新数据库,则输出相同。列表可能已包含PL / pgSQL的另一行,具体取决于版本和/或数据中心(由a_horse_with_no_name指出)。

所以你有

  • “内置功能”(内部)
  • “动态加载的C函数”(c)
  • “SQL语言函数”(sql)

如果你跑

  

CREATE LANGUAGE plpgsql;

PL / pgSQL将会出现另一行(如果你有privilege)。

例如,如果您安装了PL / Java,那么您将获得

  • “Java trusted”(java)
  • “Java untrusted”(javau)

也出现在列表中。


选择语言的一些指导原则

  • 如果您需要更高级别的语言,请考虑 Scala (分别需要支持基于PL / Java或JVM的存储过程)。因此,您不仅可以在SQL中使用功能范例,还可以在存储的函数/过程中使用功能范例。当然,像Java一样,你也有OOP。

  • 如果您使用的是 Java ,请查看Java存储过程(需要PL / Java)。举个例子,看看here。与PL / pgSQL相比,您有完整的OOP。

PL / Java往往难以安装,因此数据中心并不十分欣赏它。这是值得的,因为您可以为客户端/应用程序服务器和存储过程/函数使用相同的语言:不需要学习另一种语言。例如,您可以以相同的方式访问结果集。唯一不同的是JDBC URL。与PL / pgSQL相比,如果其他数据库也支持基于JVM的存储过程,则这些存储过程是可移植的。

  • 如果您必须从已有语言中选择一种,请考虑 PL / pgSQL 。它通常始终安装,您不必处理内存分配。

  • 如果必须与操作系统/库接口,则 C 。要获得展示,请查看here。这并不是很困难,它只是围绕着功能的更多功能。

  • 如果你想要 C ++ ,它会变得更难,因为PostgreSql和C / C ++模块之间的接口使用C调用约定,所以你应该有一个位于PostgreSql之间的C文件和你的C ++模块。要获得展示,请查看here

如果您不使用PL / pgSQL,最困难的部分是安装(PL / Java)和接口代码(PL / Java,PL / C,PL / C ++)。如果您最初进行了设置,那么在存储过程/函数中使用您真正想要的语言真的很愉快。值得这么麻烦。

答案 2 :(得分:1)

如果您从某些软件工具(例如,从Java到JDBC)访问数据库,那么您也可以更好地简化查询,在客户端执行更多工作并避免使用数据库端脚本。

理由是这些服务器端脚本更难以测试(单元测试需要数据库),调试(通常比调试器下的代码更复杂)和维护(升级等)。服务器端脚本中的错误经常被忽略,因为它们是分开的, 这些脚本很少被客户端开发人员看到。

但是,无论如何,我们过去都使用过PL / PSQL,因为可以使用自动脚本通过JDBC连接自动在服务器上安装所有代码。