假设我正在使用
Get-ADUser -Filter "ObjectClass -eq 'user' -and 'Name -like '*foo*'"
查询 Active Directory。
颠倒
ObjectClass
和 Name
的顺序是否会更改传递到 Active Directory 的查询顺序,从而影响性能?根据 this StackOverflow post,PowerShell 在传递到服务器之前将 -Filter
转换为 LDAP 查询。
假设确实如此,该语句按什么顺序求值?从左到右,还是其他?
一些高级指示:
公平地假设评估是从左到右的(我没有来源支持这一点),但是将类似PowerShell的
-Filter
表达式在幕后转换为LDAP查询是否甚至保留了该顺序不明显,从概念性 about_Active_Directory_Filter帮助主题的
-Filter
部分中的 Filter Examples
参数和相应的 LDAP 查询的并置来看:-Filter
中的子表达式顺序并没有一致地保留在那里 - 尽管这可能只是文档中存在不准确之处。
一般来说,鉴于
-and
操作是短路,如果将执行速度更快的测试放在LHS上,您将获得更好的性能:
这确保了如果较快的测试结果是否定的,则无需执行相对较慢的测试。
至少假设而言,在当前的情况下,
ObjectClass -eq 'user'
可能会更快,因为与-like
的通配符匹配比与-eq
的相等比较更复杂
但是,
-eq
和 -like
在 LDAP 端都翻译为 same 运算符,=
;有关详细信息,请参阅链接帮助主题中的 Supported Operators
。
无论如何,在这种情况下,在实践中可能没有太大区别。
链接的帮助主题还有一个
Optimizing Filters
部分,摘录如下:
您可以使用这些指南来增强搜索过滤器行为。
- 避免使用 Recursive 参数,因为它会加剧资源使用 搜索操作。
- 避免使用按位 AND 运算符和按位 OR 运算符。了解更多 信息,请参阅本主题的支持的运算符部分。
- 避免使用逻辑 NOT 运算符。
- 将搜索分解为多个具有更窄条件的查询。