Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.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
Postgresql:子查询的另一种选择,使查询更高效?_Sql_Database_Postgresql - Fatal编程技术网

Postgresql:子查询的另一种选择,使查询更高效?

Postgresql:子查询的另一种选择,使查询更高效?,sql,database,postgresql,Sql,Database,Postgresql,因此,我有下表和模式: CREATE TABLE stages ( id serial PRIMARY KEY, cid VARCHAR(6) NOT NULL, stage varchar(30) NOT null, status varchar(30) not null, ); 使用以下测试数据: INSERT INTO stages (id, cid, stage, status) VALUES ('1', '1', 'first stage', 'accept

因此,我有下表和模式:

CREATE TABLE stages (
  id  serial PRIMARY KEY,
  cid VARCHAR(6)  NOT NULL,
  stage varchar(30)  NOT null,
  status varchar(30) not null,
);
使用以下测试数据:

INSERT INTO stages (id, cid, stage, status) VALUES
  ('1', '1', 'first stage', 'accepted'),
  ('2', '1', 'second stage', 'current'),
  ('3', '2', 'first stage', 'accepted'),
  ('4', '3', 'first stage', 'accepted'),
  ('5', '3', 'second stage', 'accepted'),
  ('6', '3', 'third stage', 'current')
  ;
现在的用例是,我们希望为每个阶段查询此表,例如,我们将为'first stage'查询此表,然后尝试获取在后续阶段中不存在的所有CID,例如'second stage'

结果集:

cid | status
2   | 'accepted'
cid | status
1   | 'current'
在运行第二阶段的查询时,我们将尝试获取第三阶段中不存在的所有CID,以此类推

结果集:

cid | status
2   | 'accepted'
cid | status
1   | 'current'
目前,我们通过在where子句中生成一个exists子查询来实现这一点,该子查询的性能不是很好

问题是,除了我们目前正在使用的方法之外,还有更好的替代方法吗?还是我们只需要专注于优化当前的方法?另外,我们可以做哪些进一步的优化来提高exists子查询的性能

谢谢

您可以使用
lead()

您可以使用
lead()


目前,我们通过在where子句中生成一个exists子查询来实现这一点,该子查询的性能不高。
修复您的表定义;添加自然键(可能只是一个索引)也可能摆脱这些愚蠢的固定大小字符串用作关键字字段。哦,是的,所有这些都已经优化了。这些阶段基本上是外键,有适当的索引。上面的例子是一个简化的版本,因为它更容易理解。如果在你的问题中甚至没有一个查询,DDL也不能反映你的实际模型,我们怎么可能优化这个秘密查询?哦,好吧,现在我明白你的意思了。道歉。提供这种DDL的目的不是隐藏实际的模型,而是隐藏复杂性,以便使示例更易于理解。就这些。但现在我意识到,所有这些外键实际上都将在优化中发挥作用。
目前,我们通过在where子句中生成一个exists子查询来实现这一点,该子查询的性能不是很好。
修复表定义;添加自然键(可能只是一个索引)也可能摆脱这些愚蠢的固定大小字符串用作关键字字段。哦,是的,所有这些都已经优化了。这些阶段基本上是外键,有适当的索引。上面的例子是一个简化的版本,因为它更容易理解。如果在你的问题中甚至没有一个查询,DDL也不能反映你的实际模型,我们怎么可能优化这个秘密查询?哦,好吧,现在我明白你的意思了。道歉。提供这种DDL的目的不是隐藏实际的模型,而是隐藏复杂性,以便使示例更易于理解。就这些。但现在我意识到,所有这些外键实际上都将在优化中发挥作用。太好了!我不知道铅的方法!谢谢我相信这会奏效的!美好的我不知道铅的方法!谢谢我相信这会奏效的!嗯,我试图理解这里的执行计划-exists查询在本例中实际执行得更好。嗯,我试图理解这里的执行计划-exists查询在本例中实际执行得更好。