2013-08-16 40 views
0

我在網上搜索,我無法找到一個比較基準的Grails標準的findAll和findAllByGrails的標準對的findAll和findAllBy基準

那麼,什麼是最快的?

// groovy enhance collection method 
parent.childs.findAll{ it.someProperty == someValue } 

Child.findAllByParentAndSomeProperty(parent, someValue) 

Child.createCriteria().list{ 
    eq('parent', parent) 
    eq('someProperty ', someValue) 
} 

UPDATE

作爲parent.childs.findAll是一個常規增強採集方法,忽略了最低調用數據庫。像:

[1,2,3,4,5].findAll{ it > 3} == [4, 5] 

所以我最好打電話給DB或循環通過已加載的集合。

+7

爲什麼不自己測試一下? –

+2

您可以啓用sql輸出來查看生成的查詢。如果有差異,我認爲它很小。 –

+0

我相信如果他們使用相同的查詢,他們將會有相同的表現。瓶頸將在數據庫中。如果性能很重要,可能需要手動編寫自己的HQL或SQL以獲得更好的控制。 – JavaDev

回答

3

他們都一樣。這是因爲您的所有示例都是針對相同底層實現的包裝 - 它們全都轉化爲「真正的」Hibernate Criteria查詢(或您正在使用的NoSQL庫中的類似核心實現)。他們都是語法糖。

findAllByParentAndSomeProperty比其他人第一次運行時慢幾毫秒,因爲有一些工作需要將方法名稱解析爲條件參數,但動態查找器會緩存給將來調用,所以這在一般情況下是不相關的。

但正如評論者所指出的那樣,您最好查看運行的實際SQL,並在關注性能時做適當的基準測試。一般情況並不適用於任何情況,並且很容易創建一個看起來很高效的查詢,但會產生意外的額外數據庫流量和緩慢。

+0

由於parent.childs.findAll是一種常規增強的收集方法,它不會調用數據庫(如[1,2,3,4,5] .findAll {it> 3} == [4,5])。這就是我的問題的全部。我最好打電話給DB或通過已加載的集合進行循環。我會更新我的問題更清楚 – Thermech