查询未使用视图索引,而是使用正常的 table 主键索引
Query is not using view index instead it is using normal table Primary Key index
我正在使用直接查询开发 Power BI 报表,即每次打开报表时,都会在我的数据库上执行查询,返回的行将显示在报表上。
我正在使用 Azure SQL 数据库作为数据源。
下面是我从中获取数据的 table 结构:
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]
由于我的 table.
中有大量数据,因此此查询需要更长的时间
为了优化其性能,我创建了一个定义如下的视图:
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
)
所以现在当我执行查询时,即由我的报告执行,即下面的查询,预期结果是查询应该使用视图索引。但是,当我查看查询执行计划时,它显示 table 仍在使用 table 主键索引。
SELECT SUM([t0].[Rounding])
AS [a0]
FROM
(
(Select * From reporting.FactPaymentDetailsTable)
)
AS [t0]
谁能帮我解决这个问题。
我对销售数据采用的方法完全相同,在那种情况下,查询使用的是视图索引。我无法弄清楚为什么我的查询在这种情况下没有使用视图索引。
非常感谢任何帮助。
非常感谢。
在这种情况下,执行计划可能认为使用 table 的索引比视图的索引更快,试试这个关键字:"WITH (NOEXPAND)" 强制执行计划使用视图的索引.
如果需要更详细的信息,this article 可能会有帮助
您可能想尝试添加列存储索引而不是索引视图。索引视图非常适合加快特定查询的速度,但它们会对锁定和并发性产生很大影响(特别是在您的情况下),因为对 table 的每次更新都需要更新该视图,特别是该视图上的同一行.列存储和批处理模式处理应该为您提供第二条路径,该路径具有针对大型数据集查询的更优化的执行引擎,其中存储结构被压缩并且一些答案已为您预先聚合。请试一试,看看它是否更适合您。
我正在使用直接查询开发 Power BI 报表,即每次打开报表时,都会在我的数据库上执行查询,返回的行将显示在报表上。
我正在使用 Azure SQL 数据库作为数据源。
下面是我从中获取数据的 table 结构:
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]
由于我的 table.
中有大量数据,因此此查询需要更长的时间为了优化其性能,我创建了一个定义如下的视图:
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
)
所以现在当我执行查询时,即由我的报告执行,即下面的查询,预期结果是查询应该使用视图索引。但是,当我查看查询执行计划时,它显示 table 仍在使用 table 主键索引。
SELECT SUM([t0].[Rounding])
AS [a0]
FROM
(
(Select * From reporting.FactPaymentDetailsTable)
)
AS [t0]
谁能帮我解决这个问题。
我对销售数据采用的方法完全相同,在那种情况下,查询使用的是视图索引。我无法弄清楚为什么我的查询在这种情况下没有使用视图索引。
非常感谢任何帮助。
非常感谢。
在这种情况下,执行计划可能认为使用 table 的索引比视图的索引更快,试试这个关键字:"WITH (NOEXPAND)" 强制执行计划使用视图的索引.
如果需要更详细的信息,this article 可能会有帮助
您可能想尝试添加列存储索引而不是索引视图。索引视图非常适合加快特定查询的速度,但它们会对锁定和并发性产生很大影响(特别是在您的情况下),因为对 table 的每次更新都需要更新该视图,特别是该视图上的同一行.列存储和批处理模式处理应该为您提供第二条路径,该路径具有针对大型数据集查询的更优化的执行引擎,其中存储结构被压缩并且一些答案已为您预先聚合。请试一试,看看它是否更适合您。