Sql 什么';接下来的代码有什么区别?
第一个代码不能在MonetDB中执行:Sql 什么';接下来的代码有什么区别?,sql,monetdb,Sql,Monetdb,第一个代码不能在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
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。
非常感谢 如果唯一的区别是cos,则将此数字另存为数据库字段并在其上添加索引。区别在于,第一个查询对所连接的每一行执行
cos()
(这可能是数百万次执行,具体取决于符合条件的行数),而第二个查询对整个查询只执行一次'cos(),所以速度要快得多
如果希望快速执行第一个查询,请尝试将条件移动到WHERE子句,以便每行图像只调用一次cos()
:
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子句。谢谢Bohermian,如果图像表很大,但图像表只有一行,请告诉我下一步怎么做,好吗,对于最后一个条件涉及3个表,如何创建内部查询来选择条件中涉及的列?