代码之家  ›  专栏  ›  技术社区  ›  dance2die

使用OpenQuery在视图上创建索引

  •  3
  • dance2die  · 技术社区  · 14 年前

    SQL Server不允许在视图查询使用的模式绑定下创建视图 openquery >a>as shown below.

    在这种视图上是否有创建索引的方法或方法? OpenQuery 如下所示。

    alt text

    在这种视图上是否有创建索引的方法或方法?

    3 回复  |  直到 14 年前
        1
  •  5
  •   ErikE Russ Cam    14 年前

    你能做的最好的事情就是定期将你感兴趣的广告数据导出到一个表中。

    当然,该表可以拥有您喜欢的所有索引。如果您每10分钟运行一次导出,并且获得过期9分钟59秒的数据的可能性不是问题,那么您的查询将非常快。

    唯一需要关注的是在导出期间管理锁定和并发性。一种策略可能是将数据导出到新表中,然后通过重命名将其交换到适当的位置。另一种可能是使用同义词(SQL2005和更高版本)执行类似的操作,只需将同义词指向两个交替表。

    提供您正在执行的查询的数据来自SQL Server之外完全不同的系统。SQL Server无法对其不拥有的数据创建索引视图。对于初学者来说,当某些内容发生更改时,如何通知它以便更新其索引?必须有一些通知和更新机制,这是不可信的,因为SQL Server无法合理地为这样一个分布式、缓慢、非SQL Server事务向外部系统维护ACID。

    因此,我建议您通过自己安排的每x分钟刷新一次数据的作业来模拟这种情况。

    --回复你的评论--

    不查询就无法判断是否添加了新用户。如果Active Directory支持一些生成事件的API,我从来没有听说过。

    但是,每次查询时,都可以将所有用户的最大创建时间存储在一个表中,然后通过动态SQL,只查询创建日期在该日期之后的新用户。从理论上讲,这个查询应该非常快,因为它将在整个线路中提取很少的数据。您只需查看用户创建日期的确切广告字段以及该字段条件的语法。

    如果管理动态SQL过于困难,非常简单的vbscript、vb或.NET应用程序也可以按计划为您查询Active Directory并更新数据库。

        2
  •  3
  •   John Hartsock    14 年前

    下面是索引视图和其他需求的基础知识。请注意,您尝试执行的操作可能属于派生表的类别,因此无法使用“openquery”创建索引视图。

    此列表来自 http://www.sqlteam.com/article/indexed-views-in-sql-server-2000

    1.视图定义必须始终从相同的基础数据返回相同的结果。

    2.视图不能使用非确定性函数。

    3.视图上的第一个索引必须是聚集的唯一索引。

    4.如果使用group by,则必须在选择列表中包含新的count\u big(*)。

    5.视图定义不能包含以下内容

    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
    
        3
  •  2
  •   gbn    14 年前

    在这种情况下,SQL Server无法知道远程数据源中的任何更改(数据、模式、任何内容)。对于本地表,它可以使用SchemaBinding等来确保底层表保持不变,并且可以跟踪数据更改。

    如果您需要经常查询视图,那么我将使用一个定期刷新的本地表。事实上,我还是会用桌子。在最好的情况下,广告查询不是最快的…