2013-10-01 67 views
0

所以我有这样的表结构(简体)索引视图寻找空引用不INNER JOIN或子查询

Create Table Transaction 
{ 
    TransactionId INT NOT NULL IDENTITY(1,1) PRIMARY KEY, 
    ReplacesTransactionId INT 
    .. 
    .. 
} 

所以我想创建一个索引视图使得下面的例子将返回旧的数据库只有第二个角色(因为它取代了第一个)

Insert Into Transaction (TransactionId, ReplacesTransactionId, ..) Values (1,0 ..) 
Insert Into Transaction (TransactionId, ReplacesTransactionId, ..) Values (2,1 ..) 

有许多的创建这个查询的方式,但我想创建一个索引视图,这意味着我不能使用子查询,左连接或节选。示例查询(使用LEFT JOIN)可以。

SELECT trans1.* FROM Transaction trans1 
LEFT JOIN Transaction trans2 on trans1.TransactionId = trans2.ReplacesTransactionId 
Where trans2.TransacationId IS NULL 

很明显,我坚持数据库的结构,并希望提高使用数据的应用程序的性能。

有什么建议吗?

+0

如果遇到一个明智的查询不符合索引视图规则的问题,那么很可能任何重新编写查询都会遇到相同规则或另一个同样错误的规则。我看不到修复您所显示的查询。 –

回答

0

这里的内容基本上是一个分层数据集,您要在该数据集中预先遍历层次结构并将结果存储在索引视图中,但AFAIK索引视图不支持这一点。

另一方面,对于改善性能的更大目标而言,这可能不是唯一的攻击角度。首先,最明显的问题是:我们可以假设TransactionId被聚集,ReplacesTransactionId被索引?如果没有,那将是我的前两个变化。如果索引已经很好,那么下一步就是查看左连接的查询计划并查看是否有任何内容跳出。一般而言(没有看到查询计划):一种可能的方法是尝试将SELECT语句转换为“涵盖查询”(请参阅​​https://www.simple-talk.com/sql/learn-sql-server/using-covering-indexes-to-improve-query-performance/)。这很可能意味着一些组合:

  • 减少在SELECT语句中的列数(更换SELECT *)
  • 增加一些“包括”列上ReplacesTransactionId指数(无论是在SSMS,或者使用CREATE INDEX的INCLUDES子句)。

祝你好运!

+0

非常感谢您的帮助。我开始意识到,我试图达到的目标可能是不可能的。很高兴有其他人确认。 – user2834135

+0

我有一个后续的想法 - 即使你被困在结构中,你是否能够创建一个额外的表?我想也许是这样,因为创建一个额外的视图是一个选项。如果是这样,请记住,“索引视图”实际上只是一个内容自动管理的表格。因此,你可以通过创建一个辅助表(即使命名像一个视图,如果你想),然后使用触发器来自动填充它。有点类似的例子,请参阅http://stackoverflow.com/a/19101016/2824445 –