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个字符?请投我一票,我想我们在这个问题上浪费了时间。请投我一票,我想我们在这个问题上浪费了时间。