查询没有使用视图索引,而是使用普通表主键索引

Posted

技术标签:

【中文标题】查询没有使用视图索引,而是使用普通表主键索引【英文标题】:Query is not using view index instead it is using normal table Primary Key index 【发布时间】:2019-07-29 08:22:01 【问题描述】:

我正在使用直接查询开发 Power BI 报表,即每次打开报表时,都会在我的数据库上执行查询,并且返回的行将显示在报表上。

我使用 Azure SQL 数据库作为数据源。

下面是我从中获取数据的表结构:

CREATE TABLE [reporting].[FactPaymentDetailsTable](
    [CheckPayId] [int] NOT NULL,
    [PaymentID] [int] NOT NULL,
    [Department] [nvarchar](50) NULL,
    [PaymentName] [nvarchar](50) NULL,
    [TipAmt] [decimal](15, 4) NOT NULL,
    [PayAmt] [decimal](15, 4) NOT NULL,
    [BusinessDate] [date] NULL,
    [Rounding] [decimal](21, 5) NOT NULL,
 CONSTRAINT [PK_FactPaymentDetailsTable] PRIMARY KEY CLUSTERED 
(
    [CheckPayId] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

现在我的报告正在发送以下查询以显示视觉效果:

SELECT SUM([t0].[Rounding])
 AS [a0]
FROM 
(
(Select * From reporting.FactPaymentDetailsTable)
)
 AS [t0] 

由于我的表中有大量数据,因此此查询需要更长的时间。

为了优化其性能,我创建了一个定义如下的视图:

create view [reporting].[TotalRoundingAmountView] with schemabinding
as
select SUM(rounding) as Rounding, COUNT_BIG(*) as CountBig
from reporting.FactPaymentDetailsTable

并在上面定义的视图上创建了一个索引:

CREATE UNIQUE CLUSTERED INDEX [ix_RoundingTotal] ON reporting.[TotalRoundingAmountView]
(
    Rounding 
)

所以现在当我执行查询时,即由我的报告执行,即下面的查询,预期的结果是查询应该使用视图索引。但是,当我查看查询执行计划时,它显示该表仍在使用表主键索引。

SELECT SUM([t0].[Rounding])
 AS [a0]
FROM 
(
(Select * From reporting.FactPaymentDetailsTable)
)
 AS [t0] 

谁能帮帮我。

我对销售数据采用的方法完全相同,在这种情况下,查询使用的是视图索引。我无法弄清楚为什么我的查询在这种情况下没有使用视图索引。

非常感谢任何帮助。

非常感谢。

【问题讨论】:

【参考方案1】:

在这种情况下执行计划可能会认为使用表的索引而不是视图的索引更快,试试这个关键字:“WITH (NOEXPAND)”来强制执行计划使用视图的索引。

如果需要更详细的信息,this article 可能会有所帮助

【讨论】:

【参考方案2】:

您可能想尝试添加列存储索引而不是索引视图。索引视图非常适合使特定查询更快,但它们会对锁定和并发性(特别是在您的情况下)产生很大影响,因为对表的每次更新都需要更新该视图,特别是该视图上的同一行。列存储和批处理模式处理应该为您提供第二条路径,该路径具有针对大型数据集查询的更优化的执行引擎,其中存储结构被压缩并为您预先聚合了一些答案。请尝试一下,看看它是否更适合您。

【讨论】:

以上是关于查询没有使用视图索引,而是使用普通表主键索引的主要内容,如果未能解决你的问题,请参考以下文章

删除ORECLE表主键ID的索引

mysql 写锁

主键索引和普通索引的差异

在oracle数据库中普通索引和唯一索引,请问哪个效率更高?

一文教你学会Hive视图和索引

MySQL----(索引,慢查询)