带union all的sql视图不使用表扫描

eoxn13cs  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(283)

我有一个视图(myview),其中union all位于3个表上。这3个表有或多或少相似的列。但它们都有createddate列。当我表演的时候

SELECT TOP 10 … FROM myView WHERE (CreatedDate >= '2020-01-01 22:00:00' AND CreatedDate <= '2020-06-26 21:00:00') ORDER BY CreatedDate DESC

我有这样的执行计划。在表2中有数百万条记录,这是非常缓慢的。

我尝试在每个表的createddate desc上创建非聚集索引,但仍然是表扫描。将所有数据包含到索引的“包含列”中–这不是一个选项,因为1列是包含大量数据的xml列。有没有什么方法可以使这个速度变快或使用那个索引?

cu6pst1q

cu6pst1q1#

尝试使用cte,以便只选择始终包含在非聚集索引中的聚集索引列之前,然后与包含其他列的视图进行联接,如下所示:

;WITH CTE AS (
SELECT TOP 10 (ONLY PK_CLUSTERED )
FROM 
          myView     
WHERE 
           (CreatedDate >= '2020-01-01 22:00:00' 
           AND CreatedDate <= '2020-06-26 21:00:00')     
ORDER BY  
           CreatedDate
) 
SELECT C.*, V.Column1, V.Column2, 
FROM
         CTE C
          INNER JOIN myView V ON V.PK_CLUSTERED = C.PK_CLUSTERED

或者,您可以修改您的索引,包括您正在选择的列。。。比如:

CREATE NONCLUSTERED INDEX IX_table_CreatedDate 
ON YourTable
(
     CreatedDate ASC
)
INCLUDE 
(
    Column1
    ,Column2
    ,Column3
)
GO

相关问题