SQL索引视图 - 检查我是否正确执行此操作

时间:2015-12-23 11:57:42

标签: sql sql-server

我正在为部分存储过程创建索引(或持久化)视图。我希望它会缩短执行时间,因为Web应用程序会因某些查询而超时。超时是由必须连接的相关数据引起的,并且在很多非常不同的行中进行了索引,并且索引某些源表只做了很多。

反正。请原谅一些语法是不完全正确的,我必须从内存中做到这一点,我只是想提出这个想法。我的观点目前看起来像这样:

CREATE VIEW myView WITH SCHEMABINDING
SELECT K1, K2, S1, S2, S3, S4 
FROM...

原始查询在其SELECT语句中使用S1-S4,在K1和K2中使用连接字段。具体来说,原始查询类似于:

SELECT tX.S1, tX.S2, tX.S3, tX.S4, t1.S5, t1.S6
FROM table t1
LEFT JOIN anotherTable t2 ON t1.key=t2.key
INNER JOIN yetAnotherTable t3 ON t1.key=t3.key
INNER JOIN [various other tables which reference tX that I am putting into the persisted view]

我的目的是改变这个观点:

SELECT view.S1, view.S2, view.S3, view.S4, t1.S5, t1.S6
FROM table t1
LEFT JOIN anotherTable t2 ON t1.key=t2.key
INNER JOIN myView v1 ON t1.key=view.k1 AND t1.key = view.k2

我正在离开左连接,部分原因是因为我不确定如何将其构建到持久视图中,但无论如何这种连接都没有很大的代价。

所以我的问题。

  1. 我是否正确使用持久视图?基本上,我做得对吗?
  2. SQL Server会计算此视图所需的索引,还是我需要自己执行此操作?
  3. 如果我需要创建自己的索引,我应该在k1和k2上创建单独的索引,每个索引都有各自的S列吗?
  4. 例如。

    CREATE NONCLUSTERED INDEX
    ON view.k1
    INCLUDE (S1, S3)
    

    或者将它全部打成一片可以吗?

    CREATE NONCLUSTERED INDEX
    ON view.k1, view.k2
    INCLUDE (S1, S2, S3, S4)
    

    非常感谢任何其他指示。

0 个答案:

没有答案