答案 0 :(得分:5)
您可以做的最好的事情是安排定期将您感兴趣的AD数据导出到表格中。
表格当然可以包含您喜欢的所有索引。如果您每10分钟运行一次导出,并且获得9分59秒过期数据的可能性不是问题,那么您的查询将会非常快速。
唯一关注的部分是在导出期间管理锁定和并发。一种策略可能是将数据导出到新表中,然后通过重命名将其交换到位。另一种可能是使用SYNONYMs(SQL 2005及更高版本)来执行类似的操作,只需将SYNONYM指向两个交替的表即可。
提供您正在执行的查询的数据来自SQL Server之外的完全不同的系统。 SQL Server无法为其不拥有的数据创建索引视图。对于初学者来说,当某些内容发生变化以便更新其索引时会如何通知?必须有一些通知和更新机制,这是不可信的,因为SQL Server无法合理地维护ACID用于这种分布式,慢速,非SQL服务器事务到外部系统。
因此,我建议通过您自己的预定作业来模仿这样的事情,每隔X分钟刷新一次数据。
- 回应你的评论 -
您无法判断是否在未查询的情况下添加了新用户。如果Active Directory支持某些生成事件的API,我从未听说过它。
但是,每次查询时,您都可以将所有用户的最大创建时间存储在表中,然后通过动态SQL,仅查询具有创建日期的新用户。理论上,这个查询应该非常快,因为它可以在线路上提取非常少的数据。您只需要查看用户创建日期的确切AD字段以及该字段上条件的语法。
如果管理动态SQL太难了,一个非常简单的vbscript,VB或.Net应用程序也可以按计划查询活动目录并更新数据库。
答案 1 :(得分:3)
以下是索引视图及其要求的基础知识。请注意您尝试执行的操作可能属于派生表的类别,因此无法使用“OpenQuery”创建索引视图
此列表来自http://www.sqlteam.com/article/indexed-views-in-sql-server-2000
1.View定义必须始终从相同的基础数据返回相同的结果。
2.Views不能使用非确定性函数。
3. View上的第一个索引必须是一个集群的UNIQUE索引。
4.如果您使用分组依据,则必须在选择列表中包含新的COUNT_BIG(*)。
5.View定义不能包含以下内容
a.TOP
b.Text, ntext or image columns
c.DISTINCT
d.MIN, MAX, COUNT, STDEV, VARIANCE, AVG
e.SUM on a nullable expression
f.A derived table
g.Rowset function
h.Another view
i.UNION
j.Subqueries, outer joins, self joins
k.Full-text predicates like CONTAIN or FREETEXT
l.COMPUTE or COMPUTE BY
m.Cannot include order by in view definition
答案 2 :(得分:2)
在这种情况下,SQL Server无法知道远程数据源中的任何更改(数据,架构等)。对于本地表,它可以使用SCHEMABINDING等来确保基础表保持不变并且它可以跟踪datachanges。
如果您需要经常查询视图,那么我将使用定期刷新的本地表。事实上,无论如何我都会使用一张桌子。在最好的时候,AD查询不是最快的......