Sql server 为什么在SQL Server中执行此查询需要这么长时间?

Sql server 为什么在SQL Server中执行此查询需要这么长时间?,sql-server,stored-procedures,query-optimization,Sql Server,Stored Procedures,Query Optimization,我想减少执行时间。我的问题是: SELECT StoreID, ItemLookupCode, sum(TotalQuantity) TotalQuantity, sum(ExtendedPrice) ExtendedPrice, sum(ExtendedCost) ExtendedCost FROM [HQMatajer].[dbo].[JCF_ItemDailySalesParent] WHERE time >= CONVER

我想减少执行时间。我的问题是:

SELECT 
    StoreID,
    ItemLookupCode,
    sum(TotalQuantity) TotalQuantity,
    sum(ExtendedPrice) ExtendedPrice,
    sum(ExtendedCost) ExtendedCost
FROM 
    [HQMatajer].[dbo].[JCF_ItemDailySalesParent]
WHERE
    time >= CONVERT(DATETIME, '2015-01-01 00:00:00', 102) AND
    time <= CONVERT(DATETIME, '2015-12-31 00:00:00', 102)
GROUP BY 
    ItemLookupCode, StoreID
索引定义

[StoreID]             [nchar](150)      NOT NULL,
[ItemLookupCode]      [nvarchar](25)    NULL,
[ExtendedDescription] [varchar](3000)   NULL,
[DepartmentID]        [int]             NULL,
[DepartmentName]      [nvarchar](30)    NULL,
[CategoryID]          [int]             NULL,
[CategoryName]        [nvarchar](30)    NULL,
[SupplierID]          [int]             NULL,
[SupplierCode]        [nvarchar](17)    NULL,
[SupplierName]        [nvarchar](30)    NULL,
[Time]                [datetime]        NOT NULL,
[TotalQuantity]       [float]           NULL,
[ExtendedPrice]       [float]           NULL,
[ExtendedCost]        [float]           NULL`
CREATE NONCLUSTERED INDEX [JCF_AllColumns] ON [dbo].[JCF_ItemDailySalesParent]
(
[Time]                ASC,
[ItemLookupCode]      ASC,
[StoreID]             ASC,
[ExtendedDescription] ASC,
[DepartmentID]        ASC,
[DepartmentName]      ASC,
[CategoryID]          ASC,
[CategoryName]        ASC,
[SupplierID]          ASC,
[SupplierCode]        ASC,
[SupplierName]        ASC,
[TotalQuantity]       ASC,
[ExtendedPrice]       ASC,
[ExtendedCost]        ASC
)

我正在使用SQL Server 2012。

无需对每一列进行索引,请尝试以下索引:

    CREATE NONCLUSTERED INDEX [JCF_AllColumns] ON [dbo].[JCF_ItemDailySalesParent]
    (
    [Time]                ASC,
    [TotalQuantity]       ASC,
    [ExtendedPrice]       ASC,
    [ExtendedCost]        ASC
    )
    INCLUDE(
    [ItemLookupCode]  ,
    [StoreID]             
)
在WHERE子句中,您不需要CONVERT函数,这应该可以工作

SELECT 
    StoreID,
    ItemLookupCode,
    sum(TotalQuantity) TotalQuantity,
    sum(ExtendedPrice) ExtendedPrice,
    sum(ExtendedCost) ExtendedCost
FROM 
    [HQMatajer].[dbo].[JCF_ItemDailySalesParent]
WHERE
    time >= '20150101' AND
    time <= '20151231'
GROUP BY 
    ItemLookupCode, StoreID
选择
StoreID,
ItemLookupCode,
总和(总数量)总数量,
总和(扩展价格)扩展价格,
总和(扩展成本)扩展成本
从…起
[HQMatajer].[dbo].[JCF_ItemDailySalesParent]
哪里
时间>='20150101'和

时间无需对每一列进行索引,请尝试以下索引:

    CREATE NONCLUSTERED INDEX [JCF_AllColumns] ON [dbo].[JCF_ItemDailySalesParent]
    (
    [Time]                ASC,
    [TotalQuantity]       ASC,
    [ExtendedPrice]       ASC,
    [ExtendedCost]        ASC
    )
    INCLUDE(
    [ItemLookupCode]  ,
    [StoreID]             
)
在WHERE子句中,您不需要CONVERT函数,这应该可以工作

SELECT 
    StoreID,
    ItemLookupCode,
    sum(TotalQuantity) TotalQuantity,
    sum(ExtendedPrice) ExtendedPrice,
    sum(ExtendedCost) ExtendedCost
FROM 
    [HQMatajer].[dbo].[JCF_ItemDailySalesParent]
WHERE
    time >= '20150101' AND
    time <= '20151231'
GROUP BY 
    ItemLookupCode, StoreID
选择
StoreID,
ItemLookupCode,
总和(总数量)总数量,
总和(扩展价格)扩展价格,
总和(扩展成本)扩展成本
从…起
[HQMatajer].[dbo].[JCF_ItemDailySalesParent]
哪里
时间>='20150101'和

时间您已经创建了数据类型,您可以避免nchar类型。您只在存储ID上存储数字。只有四位数

[StoreID][nchar](150)不为空

将数据类型更改为varchar(10)nchar是unicode格式。它将使大小加倍。正如您所说,nchar大小为150。这将为所有字符创建一个内存,即使您使用的字符数不超过4个

由于nchar(150)的大小,它将在索引上创建多个页面(不需要的b树页面)

所以换成下面的约束

[StoreID][varchar](10)不为空

并创建以下索引

在[dbo].[JCF_ItemDailySalesParent]上创建非聚集索引[JCF_AllColumns]
(
[时代]ASC,
[总数量]ASC,
[扩展价格]ASC,
[扩展成本]ASC
)
包括(
[ItemLookupCode],
[StoreID]
)


您已经创建了数据类型,可以避免nchar类型。您只在存储ID上存储数字。只有四位数

[StoreID][nchar](150)不为空

将数据类型更改为varchar(10)nchar是unicode格式。它将使大小加倍。正如您所说,nchar大小为150。这将为所有字符创建一个内存,即使您使用的字符数不超过4个

由于nchar(150)的大小,它将在索引上创建多个页面(不需要的b树页面)

所以换成下面的约束

[StoreID][varchar](10)不为空

并创建以下索引

在[dbo].[JCF_ItemDailySalesParent]上创建非聚集索引[JCF_AllColumns]
(
[时代]ASC,
[总数量]ASC,
[扩展价格]ASC,
[扩展成本]ASC
)
包括(
[ItemLookupCode],
[StoreID]
)


尝试按如下方式创建索引:

CREATE NONCLUSTERED INDEX [JCF_foo] ON [dbo].[JCF_ItemDailySalesParent] (
    [Time],
    [StoreID],
    [ItemLookupCode]
) INCLUDE (
    [TotalQuantity],
    [ExtendedPrice],
    [ExtendedCost]
)
这应该使优化器能够使用仅索引查询

还可以尝试此操作,这可能会启用动态分组:

CREATE NONCLUSTERED INDEX [JCF_foo] ON [dbo].[JCF_ItemDailySalesParent] (
    [StoreID],
    [ItemLookupCode],
    [Time]
) INCLUDE (
    [TotalQuantity],
    [ExtendedPrice],
    [ExtendedCost]
)

尝试按如下方式创建索引:

CREATE NONCLUSTERED INDEX [JCF_foo] ON [dbo].[JCF_ItemDailySalesParent] (
    [Time],
    [StoreID],
    [ItemLookupCode]
) INCLUDE (
    [TotalQuantity],
    [ExtendedPrice],
    [ExtendedCost]
)
这应该使优化器能够使用仅索引查询

还可以尝试此操作,这可能会启用动态分组:

CREATE NONCLUSTERED INDEX [JCF_foo] ON [dbo].[JCF_ItemDailySalesParent] (
    [StoreID],
    [ItemLookupCode],
    [Time]
) INCLUDE (
    [TotalQuantity],
    [ExtendedPrice],
    [ExtendedCost]
)

为什么是负号?这取决于几件事。您的硬件、索引方法等。您的问题没有找到最佳解决方案的线索。@NimaRostami您是否给了否定的分数?能否请您显示所涉及表的表结构,并提供如何创建这些索引的确切定义?另外:您使用的是哪个版本的SQL Server?2008,2008 R2,2012,2014,2016???@mohamedfaisal是的,我做了。但是我把它去掉了。为什么是负号?这取决于几个因素。您的硬件、索引方法等。您的问题没有找到最佳解决方案的线索。@NimaRostami您是否给了否定的分数?能否请您显示所涉及表的表结构,并提供如何创建这些索引的确切定义?另外:您使用的是哪个版本的SQL Server?2008,2008 R2,2012,2014,2016???@mohamedfaisal是的,我做了。但是我删除了它。
此行关键字“ASC”附近语法不正确
包括([ItemLookupCode]ASC,//error[StoreID]ASC)
此行关键字“ASC”附近语法不正确
包括([ItemLookupCode]ASC,//error[StoreID]ASC)
为什么您的用户名与提问者的用户名完全相同?只是巧合还是你是同一个人?你怎么知道StoreID是4个字符?为什么你的用户名与提问者的用户名完全相同?只是巧合还是你是同一个人?你怎么知道StoreID是4个字符?请投我一票,我想我们在这个问题上浪费了时间。请投我一票,我想我们在这个问题上浪费了时间。