Sql 索引视图。查询忽略视图而使用表
我的任务是优化此查询:Sql 索引视图。查询忽略视图而使用表,sql,sql-server,indexing,views,indexed-view,Sql,Sql Server,Indexing,Views,Indexed View,我的任务是优化此查询: Declare @sumBalance NUMERIC = (select SUM(CURRENT_BALANCE) as Balance from dbo.ACCOUNT_DETAILS) select @sumBalance Declare @sumBalance NUMERIC = (select SUM(CURRENT_BALANCE) as Balance from dbo.ACCOUNT_DETA
Declare @sumBalance NUMERIC = (select SUM(CURRENT_BALANCE) as Balance
from dbo.ACCOUNT_DETAILS)
select @sumBalance
Declare @sumBalance NUMERIC = (select SUM(CURRENT_BALANCE) as Balance
from dbo.ACCOUNT_DETAILS);
select @sumBalance;
我读到过聚合函数的最佳解决方案是使用索引视图而不是表
我使用SCHEMABINDING创建了视图:
CREATE VIEW dbo.CURRENT_BALANCE_VIEW
WITH SCHEMABINDING
AS
SELECT id,CURRENT_BALANCE
FROM dbo.ACCOUNT_DETAILS
之后,我创建了两个索引:
第一个是身份证
CREATE UNIQUE CLUSTERED INDEX index_ID_VIEW ON dbo.View(ID);
当前的第二列是我的第二列
CREATE NONCLUSTERED INDEX index_CURRENT_BALANCE_VIEW
ON dbo.CURRENT_BALANCE_VIEW(ID);
在这里,我遇到了新问题:
Declare @sumBalance NUMERIC = (select SUM(CURRENT_BALANCE) as Balance
from dbo.CURRENT_BALANCE_VIEW)
select @sumBalance
Statistics
另寻帖子Declare @sumBalance NUMERIC = (select SUM(CURRENT_BALANCE) as Balance
from dbo.ACCOUNT_DETAILS)
select @sumBalance
Declare @sumBalance NUMERIC = (select SUM(CURRENT_BALANCE) as Balance
from dbo.ACCOUNT_DETAILS);
select @sumBalance;
不容易优化。唯一有帮助的索引是:
create index idx_account_details_current_balance on account_details(current_balance);
这是查询的覆盖索引,可用于SUM()
。但是,仍然需要扫描索引才能执行SUM()
。扫描索引应该比扫描表快,因为它可能要小得多
SQL Server 2012+有一个名为columnstore indexes的功能,该功能具有相同的效果
对于聚合函数使用索引视图的建议似乎不是什么好建议。例如,如果上面的查询使用了MIN()
或MAX()
,那么上面的索引应该是查询的最佳索引,并且应该运行得非常快
编辑:
你的参考文章很有道理。如果要为此目的创建索引视图,请使用聚合创建它
这有点奇怪,因为它返回一行。我认为以下措施会奏效:
create index idx_account_details on current_balance_view(bal);
如果没有,您可能需要为索引引入一个伪列
然后:
应具有预计算的值。如果使用SQL Server标准版,则必须使用NOEXPAND提示才能使用视图的索引 例如:
SELECT *
FROM dbo.CURRENT_BALANCE_VIEW (NOEXPAND);
第二个:第三个:这些真的是你的疑问吗?你试图在整个
账户详细信息
表中得到一个总和?是的。我的任务是检查平衡,它必须始终等于0。我还需要一个触发器变量。谢谢你的建议。正如我已经说过的,索引速度提高了22.2倍,但无论如何,我需要它更快,至少100-500倍。关于我从这里得到的观点的信息我可以请你回答我帖子中1到3个问题吗。我找不到任何解释它发生原因的信息。将按照您的建议尝试columnstore索引。不幸的是,我无法使用columnstore,因为:CREATE INDEX语句失败,因为在此版本的SQL Server中无法创建columnstore索引。有关不同SQL Server版本中功能支持的详细信息,请参阅联机丛书。然后尝试为ID的虚拟列创建索引时出现错误:无法在视图“MFS_DEMO_IT.dbo.CURRENT_BALANCE_view”上创建索引,因为其选择列表未正确使用COUNT_BIG。考虑添加CurtTyBigBy(*)来选择列表。