0

所以我有一个像这样的表结构的遗留数据库(简化)

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

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

有什么建议么?

4

1 回答 1

0

您在这里拥有的本质上是一个分层数据集,您希望在其中预先遍历层次结构并将结果存储在索引视图中,但是 AFAIK,索引视图不支持这一点。

另一方面,这可能不是实现提高性能这一更大目标的唯一途径。首先,最明显的问题:我们可以假设它TransactionId是聚集的并且ReplacesTransactionId是索引的吗?如果没有,那将是我的前两个更改。如果索引已经很好,那么下一步将是查看左连接的查询计划,看看是否有任何问题。

一般而言(没有看到查询计划):一种可能的方法是尝试将您的 SELECT 语句转换为“覆盖查询”(参见https://www.simple-talk.com/sql/learn-sql-服务器/使用覆盖索引来提高查询性能/)。这很可能需要以下组合:

  • 减少 SELECT 语句中的列数(替换 SELECT *)
  • 在 ReplacesTransactionId 上的索引中添加一些“包含”列(在 SSMS 中或使用 CREATE INDEX 的 INCLUDES 子句)。

祝你好运!

于 2013-10-01T17:56:36.400 回答