0

数据库

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

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

PHP

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

前端

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


我的问题是这样的:

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

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

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

关于如何做到这一点的任何想法?...或者也许我还没有考虑另一种方法?

4

2 回答 2

1

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

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

于 2013-10-25T14:17:15.070 回答
0

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

如果您担心非规范化,我首先要做的就是将这些临时普通表存储在单独的模式中;-)。这允许您将非规范化(和工作集数据)分开以进行分析等,并避免使用非规范化表污染数据集的其余部分。

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

于 2013-12-01T07:58:03.990 回答