2013-08-16 2 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) 
} 

ОБНОВЛЕНИЕ

В parent.childs.findAll является заводной расширение метод сбора, это dosen't вызвать базу данных , Нравится:

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

Мне лучше позвонить по БД или пройти через уже загруженную коллекцию.

+7

Почему бы не проверить это самостоятельно? –

+2

Вы можете включить вывод sql для просмотра генерируемых запросов. Если есть разница, я думаю, что это минимально. –

+0

Я считаю, что они будут иметь одинаковую производительность, если они будут использовать один и тот же запрос. Узкое место будет в базе данных. Если производительность важна, можете вручную написать свой собственный HQL или SQL для лучшего контроля. – JavaDev

ответ

3

Они все равно. Это потому, что все ваши примеров являются оболочками для одной и той же базовой реализации - все они преобразованы в «реальный» Hibernate Criteria запросы (или реализацию аналогичного ядра в библиотеке NoSQL, который вы используете) под капотом. Они все синтаксический сахар.

findAllByParentAndSomePropertyfindAllByParentAndSomeProperty будет на несколько миллисекунд медленнее, чем другие при первом запуске, так как есть некоторая работа, связанная с разбором имени метода в параметрах критериев, но динамические искатели кэшируются для будущих вызовов, поэтому это не имеет отношения к общему случаю.

Но как комментаторам указывают, что вы лучше от глядя на фактический SQL, который бежать, и делать правильные ориентиры, когда вы беспокоитесь о производительности. Общий случай не применим в любой ситуации, и легко создать запрос, который выглядит как эффективный, но который генерирует неожиданный дополнительный трафик базы данных и медленность.

+0

Как parent.childs.findAll является заводной способ повысить сбор, это dosen't вызвать базу данных (например, [1,2,3,4,5] .findAll {это> 3} == [4, 5]). Вот и все вопросы моего вопроса. Мне лучше позвонить в БД или пропустить уже загруженную коллекцию. Я обновлю свой вопрос, чтобы яснее – Thermech

Смежные вопросы