Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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 “一个”中的博士后优化;A或存在(B)“;查询_Postgresql - Fatal编程技术网

Postgresql “一个”中的博士后优化;A或存在(B)“;查询

Postgresql “一个”中的博士后优化;A或存在(B)“;查询,postgresql,Postgresql,我在我的Postgres优化中遇到了很多问题 基本上,我有三个表,它们将简化为: Place:id、名称(字符串)、选择(布尔值) 书签:id、用户(整数)、位置(整数) 用户:id、名称(字符串) Place表有数百万行(并且还在增长),但其中相对较少的行将select设置为true 我在这些表上有几个索引,显然是在所有id上,加上位置上的部分索引,其中“select”=true,以及书签(user,place)组合上的唯一索引。还有更多,但我认为它们与这里无关 当我执行以下类型的查询时:

我在我的Postgres优化中遇到了很多问题

基本上,我有三个表,它们将简化为:

  • Place
    :id、名称(字符串)、选择(布尔值)
  • 书签
    :id、用户(整数)、位置(整数)
  • 用户
    :id、名称(字符串)
Place
表有数百万行(并且还在增长),但其中相对较少的行将
select
设置为true

我在这些表上有几个索引,显然是在所有
id
上,加上
位置上的部分索引,其中“select”=true
,以及
书签(user,place)组合上的唯一索引。还有更多,但我认为它们与这里无关

当我执行以下类型的查询时:

SELECT * 
FROM place 
WHERE "select" 
LIMIT 10;
SELECT * 
FROM place 
WHERE exists (SELECT id 
              FROM bookmark 
              WHERE user IN (1,2,3,4) 
                AND bookmark.place = place.id) 
LIMIT 10;
需要3毫秒

当我执行以下类型的查询时:

SELECT * 
FROM place 
WHERE "select" 
LIMIT 10;
SELECT * 
FROM place 
WHERE exists (SELECT id 
              FROM bookmark 
              WHERE user IN (1,2,3,4) 
                AND bookmark.place = place.id) 
LIMIT 10;
它也燃烧得很快

但是,如果我在这两种情况下都执行
,例如:

SELECT * 
FROM place 
WHERE "select" 
   OR exists (SELECT id 
              FROM bookmark 
              WHERE user IN (1,2,3,4) 
                AND bookmark.place = place.id) 
LIMIT 10;
它会减慢到1秒以上

除了在我的代码中执行两个查询并合并结果外,还有什么方法可以优化这个问题吗?

旧问题

使用
联合

(SELECT * FROM place
 WHERE select
 LIMIT 10)
UNION
(SELECT * FROM place
 WHERE exists (SELECT 1 FROM bookmark
               WHERE user IN (1,2,3,4)
                 AND bookmark.place = place.id)
 LIMIT 10)
LIMIT 10;

谢谢你的链接!