索引视图在没有INNER JOIN或子查询的情况下查找空引用

时间:2013-10-01 09:21:43

标签: sql sql-server tsql views indexed

所以我有一个像这样(简化)

的表结构的遗留数据库
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

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

有什么建议吗?

1 个答案:

答案 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子句)。
祝你好运!