Как ускорить комбинированный запрос 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 на запрашиваемом сервере и посмотреть, что он делает именно с запросом.

Итак, вкратце:

  1. Безусловно: убедитесь, что ваш NDS здоров (ndsrepair, TID 3564075 и еще много чего)
  2. проверьте, находятся ли оба запроса в одном разделе
  3. проверьте, есть ли на сервере хотя бы реплика чтения раздела (ов)
  4. попробуйте изменить запрос, как предложено
  5. сделать ndstrace, запрашивая, чтобы увидеть, что занимает так много времени
Другие вопросы по тегам