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 server 我想提高查询的执行时间_Sql Server - Fatal编程技术网

Sql server 我想提高查询的执行时间

Sql server 我想提高查询的执行时间,sql-server,Sql Server,我要加载15亿条记录,我想缩短执行时间 SELECT TOP (20) a.code AS No_, lastyear = ( SELECT SUM(c.[Sales Amount (Actual)]) FROM [Uneek Clothing Company Ltd$Value Entry] c WHERE c.[Source Type] = 1 AND c.[Global Dimension 1 Code] = a

我要加载15亿条记录,我想缩短执行时间

SELECT TOP (20) a.code AS No_, 
                lastyear =
(
    SELECT SUM(c.[Sales Amount (Actual)])
    FROM [Uneek Clothing Company Ltd$Value Entry] c
    WHERE c.[Source Type] = 1
          AND c.[Global Dimension 1 Code] = a.Code
          AND c.[Source No_] = 'WOR07'
          AND c.[Posting Date] BETWEEN '01/01/2018' AND '7/16/2018'
), 
                CurrentYear =
(
    SELECT SUM(c.[Sales Amount (Actual)])
    FROM [Uneek Clothing Company Ltd$Value Entry] c
    WHERE c.[Source Type] = 1
          AND c.[Global Dimension 1 Code] = a.Code
          AND c.[Source No_] = 'WOR07'
          AND c.[Posting Date] BETWEEN '01/01/2019' AND '7/16/2019'
)
FROM [Uneek Clothing Company Ltd$Item Category] a
ORDER BY CurrentYear DESC;

使用正在查找数据的字段在表上创建索引。为了提高速度,可以包括需要引用的货币字段。例如:

CREATE INDEX Idx_SourceType_GlobalDimension1Code_SourceNo_PostingDate
ON [Uneek Clothing Company Ltd$Value Entry] (
    [Source Type], 
    [Global Dimension 1 Code],
    [Source No_],
    [Posting Date]
    )
INCLUDE ([Sales Amount (Actual)])

我不想抢走@laugh Vergil的风头,但在他/她的答案上我有一个建议(我没有排名可以评论)。创建索引时,应使列按递减顺序排列。我的猜测是,为了最大限度地提高性能,您的索引应该如下所示:

CREATE INDEX Idx_SourceType_GlobalDimension1Code_SourceNo_PostingDate
ON [Uneek Clothing Company Ltd$Value Entry] (
    [Source No_],
    [Posting Date]
    [Global Dimension 1 Code],
    [Source Type], 
)
INCLUDE ([Sales Amount (Actual)])
这假设[Source No_uz]是另一个表上的唯一键,[Posting Date]是一个日期(非常唯一),代码和类型是非常小的类似查找的值,只有几个不同的可能值


然而,需要注意的是,这个索引是专门为这个查询设计的。如果您从将来的查询中删除[Source No_uuz],您可能还需要创建另一个索引来处理该特定情况。对于DBA来说,索引维护是一场持续的战斗,有更聪明的人(又名)来帮助您克服这些挑战。

尝试检查查询的执行计划并优化它索引表了吗?如果是,在哪些栏目?这里有太多的信息缺失,任何人都无法提供帮助。不,该表未编制索引,请详细说明您需要哪些信息。这就是为什么我更喜欢其他索引字段顺序。由于[Source Type]、[Global Dimension 1 Code]和[Source No.]都是在单个值上查找的,但[Posting Date]是一个范围,因此查找前三个值将得到一个连续的索引项块,按范围值排序。这将导致对第一个键进行索引查找,然后对最后一个键进行连续顺序扫描。将日期放在不同的位置意味着要搜索的各个键将在索引中分开,并且必须执行多次搜索。这是发布日期的一个好观点,我非常感谢您提出这一点。我想,我仍然会在特殊性方面支持[源代码编号],[全局维度1代码],然后是[源代码类型]的顺序。但这也是由于对数据库的不完全了解。