Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 索引视图。查询忽略视图而使用表_Sql_Sql Server_Indexing_Views_Indexed View - Fatal编程技术网

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

    另寻帖子

  • 我不明白为什么我可以看到索引'index\u current\u balance',因为表中没有这样的索引

  • 另寻帖子

    p.S.已经尝试在表中创建索引,这很有帮助。它使查询的运行速度从0.2 Es.operator cost提高到0.009,但无论如何,它必须更快

    p、 很抱歉让你点击这个链接,我的名声不允许我正确地浏览过去的图片=\

    p、 s.s.s与SQL Server 2014合作

    p、 s.s.s.s刚意识到我不需要求和0-s。期望它们具有格罗姆功能

    提前感谢。

    此查询:

    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(*)来选择列表。