2016-10-19 7 views
0

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

List<User> users = User.executeQuery("select user " + 
        "from User as user where user.id = any(" + 
        "select otherTable.user.id from OtherTable as otherTable)") 

Как сделать этот запрос более эффективным?

+0

Если этот запрос работает, то он, вероятно, довольно эффективен. –

+0

Возможно, это было мое тестовое оборудование? Потребовалось более секунды, чтобы работать на H2 с 50 000 строк OtherTable на моем ПК, но окончательное оборудование будет MS SQL на лучшее оборудование. – Anonymous1

+0

Вы можете использовать индекс в SQL Server для ускорения запроса. –

ответ

2

Это SQL может быть более effcient,

select distinct u.id from user as u 
inner join other_table ot 
on u.id = ot.id 

Вот HQL,

select distinct user 
from User as user 
inner join user.otherTable as ot 

Использование Criteria API

User.createCriteria().listDistinct { 
    createAlias("otherTable","ot") 
    eq('id','ot.id') 
} 

И выше, потребует правильного отображения вашего домена классы. В случае, если у вас нет этого, OtherTable, отображаемый в User. Попробуйте это,

select distinct user from User user, OtherTable ot 
where user.id = ot.user_id 

Возможно, вы заметили, что мы полностью избегаем полного сканирования таблиц; и это единственный запрос - в отличие от того, который вы опубликовали, который использует подзапрос. Присоединение к обоим объектам/таблицам с id должно быть более эффективным - предполагается, что столбцы id индексируются.

+0

Это лучший aproach, в заявлении, которое другие предоставили, не является эффективным. – quindimildev

+0

Мне нужно только вернуть отдельных пользователей. Предлагаемый запрос возвращает все остальные значения, которые соответствуют. К сожалению, этот запрос намного медленнее с ключевым словом и без него. – Anonymous1

+0

@ Anonymous1, да, он может содержать дубликаты; Я изменил соответствующим образом. –

0

Попробуйте следующий запрос:

List<User> users = User.executeQuery("select user " + 
        "from User as user where" + 
        "user.id in (select distinct otherTable.user.id from OtherTable as otherTable)") 

Надеется, что это поможет!

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

  • Нет связанных вопросов^_^