Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 只运行一次昂贵的查询并从中返回多个结果_Sql_Postgresql_Common Table Expression - Fatal编程技术网

Sql 只运行一次昂贵的查询并从中返回多个结果

Sql 只运行一次昂贵的查询并从中返回多个结果,sql,postgresql,common-table-expression,Sql,Postgresql,Common Table Expression,我有一个昂贵的查询,它从一个包含许多连接的查询中获取所有行。通过此查询,我需要返回两个结果: 来自查询本身的所有数据,限制在n行 查询中特定列的不同值的数组 这两个操作使用完全相同的基本查询。我不想运行两次基本查询,因为它很昂贵,但我不想将其存储为表,因为在返回这两个操作之后,我不需要它,而且查询也经常发生。我使用CTE运行查询,然后将两个操作合并到同一个结果中。由于第二个操作列类型(postgres数组)与任何基本查询列类型都不相同,因此需要添加新的、大部分为空的列,这会带来一些问题。它看起来

我有一个昂贵的查询,它从一个包含许多连接的查询中获取所有行。通过此查询,我需要返回两个结果:

  • 来自查询本身的所有数据,限制在n行
  • 查询中特定列的不同值的数组
  • 这两个操作使用完全相同的基本查询。我不想运行两次基本查询,因为它很昂贵,但我不想将其存储为表,因为在返回这两个操作之后,我不需要它,而且查询也经常发生。我使用CTE运行查询,然后将两个操作合并到同一个结果中。由于第二个操作列类型(postgres数组)与任何基本查询列类型都不相同,因此需要添加新的、大部分为空的列,这会带来一些问题。它看起来也很粗糙。似乎只有两种解决方案:

  • 使用基本查询创建一个临时表,查询两次以返回这两个操作,然后删除它
  • 分别运行这两个操作,然后运行基本查询两次

  • 这似乎应该是SQL中的一个常见问题。我是否误解了查询是如何优化的?

    您知道解决方案:创建一个临时表,然后将其删除


    我不会说这是SQL中的常见问题,但SQL肯定支持它。你知道该怎么做。如果需要持久化结果,请使用临时表。

    您知道解决方案:创建一个临时表,然后将其删除

    我不会说这是SQL中的常见问题,但SQL肯定支持它。你知道该怎么做。如果需要持久化结果,则使用临时表

    我是否误解了查询是如何优化的

    查询优化远远超出了作为候选解决方案公开的范围。 查询优化从分析查询速度慢的原因开始,为此,您需要回答以下问题:

    • 你有正确的索引吗
    • 你的数据更新了吗
    • 你的where子句写得正确吗,这样它们才是可写的
    • 您是否检查过其他类型优化的执行计划(检查您的联接、缺少的索引、统计数据)
    我是否误解了查询是如何优化的

    查询优化远远超出了作为候选解决方案公开的范围。 查询优化从分析查询速度慢的原因开始,为此,您需要回答以下问题:

    • 你有正确的索引吗
    • 你的数据更新了吗
    • 你的where子句写得正确吗,这样它们才是可写的
    • 您是否检查过其他类型优化的执行计划(检查您的联接、缺少的索引、统计数据)

    简单规则!您甚至可以让PostgreSQL在事务结束时自动删除临时表。@谢谢,
    在postgres中创建临时表
    可能是最好的解决方案隐式规则!您甚至可以让PostgreSQL在事务结束时自动删除临时表。@LaurenzAlbe谢谢,
    在postgres中创建临时表
    可能是最好的解决方案