使用OpenQuery在视图上创建索引

时间:2010-05-04 18:54:48

标签: sql-server tsql indexing query-optimization

SQL Server不允许使用架构绑定创建视图查询使用OpenQuery的视图,如下所示。

alt text

有没有办法或解决方法在这样的视图上创建索引?

3 个答案:

答案 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查询不是最快的......