2013-12-22 24 views
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。 非常感謝!

回答

0

如果唯一的區別是cos,則將此數字保存爲數據庫字段並在其上放置索引。

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子句。

+0

感謝Bohermian,你的權利,如果圖像表是大的,但圖像表只有1行,我試過你的代碼,你能告訴我下一步該怎麼做,最後一個條件涉及3個表格,如何創建一個內部查詢來選擇條件中涉及的列? – user2706760