所以我有一个像这样(简化)
的表结构的遗留数据库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/)。这很可能需要一些组合: