【问题标题】:Accessing PostgreSQL 9.1 Temporary Tables from PHP / AJAX从 PHP / AJAX 访问 PostgreSQL 9.1 临时表
【发布时间】:2013-11-03 23:59:38
【问题描述】:

数据库

我有一个标准化的 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 ... requires each session to issue its own CREATE TEMPORARY TABLE command for each temporary table to be used. 如果我可以让两个 PHP 文件连接到同一个数据库会话,那么它们应该都能看到临时表。

知道如何做到这一点吗? ...或者可能是我尚未考虑的不同方法?

【问题讨论】:

    标签: php jquery ajax postgresql postgresql-9.1


    【解决方案1】:

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

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

    【讨论】:

    • 将它放在“正常”表中将是非规范化,而不是一种选择。我将研究物化视图;不过我暂时只限9.1。
    • 我的意思是创建新表,使用它,删除它。像临时表。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-03-04
      • 1970-01-01
      • 2012-04-25
      • 2013-10-16
      • 2010-10-03
      • 1970-01-01
      • 2022-11-22
      • 2013-05-17
      相关资源
      最近更新 更多