如何加快组合ldap查询?

时间:2013-04-11 15:03:59

标签: performance ldap edirectory

此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 个答案:

答案 0 :(得分: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,看看有多长时间