从 PHP/AJAX 访问 PostgreSQL 9.1 临时表


Accessing PostgreSQL 9.1 Temporary Tables from PHP / AJAX

>DATABASE

我有一个规范化的Postgres 9.1数据库,并在其中编写了一些函数。特别是一个函数"fn_SuperQuery"(param,param, ...)"返回SET OF RECORD,应该被认为是一个视图(接受参数)。此函数具有大量开销,因为它实际上会在计算自己的结果时创建多个临时表,以便获得大型数据集的性能。

附带说明一下,我曾经专门将WITH (cte) 用于此查询,但我需要能够在某些列上添加索引以实现更高效的连接。

.PHP

我严格使用 PHP 连接到数据库,运行查询,并以 JSON 形式返回结果。每个查询都以连接字符串开头,然后以调用 pg_close 结束。

前端

我正在使用jQuery的.ajax函数来调用PHP文件并接受结果。


我的问题是这样的:

"fn_SuperQuery"(param,param, ...)"实际上是其他几个查询的基础。此应用程序的某些部分需要一次运行多个查询,以便为最终用户生成所有必要的信息。其中许多查询依赖于 "fn_SuperQuery"(param,param, ...)" 的输出 运行此查询的开销非常陡峭,如果给定相同的参数,它将返回相同的数据,这一事实使我认为让用户等待它运行两次是愚蠢的。

我想做的是将"fn_SuperQuery"(param,param, ...)"的结果返回到一个临时表中,然后运行需要其数据的其他查询,然后丢弃临时表。

我知道PostgreSQL...要求每个会话为每个要使用的临时表发出自己的"创建临时表"命令。如果我可以让两个PHP文件连接到同一个数据库会话,那么它们都应该能够看到临时表。

关于如何做到这一点的任何想法?或者也许是我尚未考虑的不同方法?

使用普通表可能会更好吗?不会有太大区别。您可以使用unlogged表加快速度。

在 9.3 中,可能更好的选择是使用物化视图。

临时表是会话专用的。 如果要在不同会话之间共享,请使用普通表(可能未记录)。

如果您担心非规范化,我会考虑做的第一件事就是存储这些临时正常表 ;-)在单独的架构中。 这允许您将非规范化(和工作集数据)分开进行分析等,并避免使用非规范化表污染数据集的其余部分。

或者,您可以查看除非规范化以外的其他方法。 例如,如果数据在一段时间后不会更改,则可以定期为不可更改的数据放置摘要条目。 这不是非规范化,因为如果您需要在继续打开某些形式的报告的同时清除旧的详细记录,它允许您清除旧的详细记录。