0

第一段代码无法在 MonetDB 中执行:

   SELECT rc0.id as runcat, x0.id as xrtcat
    FROM extractedcatalog x0 
    INNER JOIN image i0
          ON i0.id = 1 AND i0.id = x0.image
    INNER JOIN runningcatalog rc0
                 ON rc0.zone BETWEEN x0.zone-1
                                  AND x0.zone+1
                 AND rc0.wm_decl BETWEEN x0.decl - i0.rb_smaj
                                     AND x0.decl + i0.rb_smaj
                 AND rc0.x*x0.x +rc0.y*x0.y +rc0.z*x0.z >cos(radians(i0.rb_smaj));

连接终止!

但是下面的代码可以很快执行,为什么????

SELECT rc0.id as runcat, x0.id as xrtcat
FROM extractedcatalog x0 
INNER JOIN image i0
      ON i0.id = 1 AND i0.id = x0.image
INNER JOIN runningcatalog rc0
             ON rc0.zone BETWEEN x0.zone-1
                              AND x0.zone+1
             AND rc0.wm_decl BETWEEN x0.decl - i0.rb_smaj
                                 AND x0.decl + i0.rb_smaj
             AND rc0.x*x0.x +rc0.y*x0.y +rc0.z*x0.z >cos(radians(0.0055));

在表格图像中,只有一行:id=1,rb_smaj=0.0055。非常感谢!

4

2 回答 2

0

如果唯一的区别是 cos,则将此数字保存为数据库字段并在其上放置索引。

于 2013-12-22T05:29:57.533 回答
0

不同之处在于,第一个查询cos()在连接的每一行上执行(可能是数百万次执行,具体取决于有多少行符合条件),但第二个查询对整个查询只执行一次 `cos(),因此速度快得多。

如果您希望第一个查询快速执行,请尝试简单地将条件移动到 WHERE 子句,以便每行cos()仅调用一次image

SELECT rc0.id as runcat, x0.id as xrtcat
FROM extractedcatalog x0 
INNER JOIN image i0
      ON i0.id = 1 AND i0.id = x0.image
INNER JOIN runningcatalog rc0
    ON rc0.zone BETWEEN x0.zone-1 AND x0.zone+1
    AND rc0.wm_decl BETWEEN x0.decl - i0.rb_smaj AND x0.decl + i0.rb_smaj
WHERE rc0.x*x0.x +rc0.y*x0.y +rc0.z*x0.z > cos(radians(i0.rb_smaj))

如果这不起作用,请尝试创建一个内部查询来选择条件中涉及的列以及cos()结果,并在其上放置一个 where 子句。

于 2013-12-22T05:47:05.807 回答