Как ускорить комбинированный запрос ldap?
Этот запрос ldap является мгновенным:
"Find all groups which user1 is not member"
(&
(objectclass=groupOfNames)
(!(member=cn=user1))
)
Как это:
"Find these groups"
(&
(objectclass=groupOfNames)
(|(cn=group1) (cn=group2) (cn=group3) ... )
)
Но их объединение приводит к нескольким минутам обработки!
"From these groups, find all which the user1 is not a member"
(&
(objectclass=groupOfNames)
(!(member=cn=user1))
(|(cn=group1) (cn=group2) (cn=group3) ... )
)
Я понятия не имею, почему сервер ldap душит комбинированный запрос. Есть идеи, что можно сделать?
Сервером является Novell eDirectory, если это поможет.
1 ответ
Странно, что на получение результата уходит несколько минут. У вас есть более пары миллионов объектов?
Одна из возможностей может заключаться в том, что поиск 1 ищет только в одном разделе вашего дерева, поиск 2 в другом, и оба вместе, очевидно, будут рассматривать оба, что должно быть хорошо, если запрашиваемый сервер хотя бы прочитал Реплика на этих разделах.
Также, пожалуйста, попробуйте следующий вариант:
(&
(&
(objectclass=groupOfNames)(!(member=cn=user1))
)
(&
(objectclass=groupOfNames)(|(cn=group1) (cn=group2) (cn=group3) ... )
)
)
Он должен дать вам ответ, к которому вы изначально обращались, но немного проще.
Если это не помогает, вы должны выполнить ndstrace на запрашиваемом сервере и посмотреть, что он делает именно с запросом.
Итак, вкратце:
- Безусловно: убедитесь, что ваш NDS здоров (ndsrepair, TID 3564075 и еще много чего)
- проверьте, находятся ли оба запроса в одном разделе
- проверьте, есть ли на сервере хотя бы реплика чтения раздела (ов)
- попробуйте изменить запрос, как предложено
- сделать ndstrace, запрашивая, чтобы увидеть, что занимает так много времени