Sql server 2012 MS SQL Server 2012查询速度/优化
首先,我很抱歉,如果其他地方已经回答了这个问题,但是我今天找不到任何东西。如果答案是肯定的,那就是我,而不是搜索系统 我遇到了这样一个问题,即在到达某个特定点之前,存储过程中的操作相当快。Sql server 2012 MS SQL Server 2012查询速度/优化,sql-server-2012,Sql Server 2012,首先,我很抱歉,如果其他地方已经回答了这个问题,但是我今天找不到任何东西。如果答案是肯定的,那就是我,而不是搜索系统 我遇到了这样一个问题,即在到达某个特定点之前,存储过程中的操作相当快。 我有一个餐馆连锁店的POS销售数据数据库。 在我们拥有的各种表中,我需要用于此查询的表有: 项目(各种项目的定义;每行包括项目所属的销售类别;请参见下面的注意事项) 类别(各种类别项目的定义可以在中) CategoryItem(以上两者之间的映射) HstItem(项目的历史销售额) 注意事项:每个项目可分为
我有一个餐馆连锁店的POS销售数据数据库。 在我们拥有的各种表中,我需要用于此查询的表有: 项目(各种项目的定义;每行包括项目所属的销售类别;请参见下面的注意事项)
类别(各种类别项目的定义可以在中)
CategoryItem(以上两者之间的映射)
HstItem(项目的历史销售额) 注意事项:每个项目可分为两类: 销售类别:每个项目一次可以在一个销售类别中。
报告类别:每个项目可以同时处于任意数量的这些类别中 我需要获取特定报告类别的6个日期范围的销售总额(截至日期的一周、截至日期的一年、截至日期的一段时间、截至日期的一年、截至日期的一年)。
综上所述,对于我的所有代码,查询/过程运行的时间相当长,直到到达报告类别的部分。
我的select语句当前包括以下WHERE子句:
where hstitem.itemid in (select fkitemid from categoryitem where categoryitemid = ##)
我正在寻找一种更高效/更快的执行方法
非常感谢您的帮助。提前谢谢
编辑:
完整的原始查询如下所示:
insert into #GnG (GStoreID, CurWkGNG, CurWkGNGLY,CurYTDGNG,CurYTDGNGLY,CurrPTDGNG,CurrPTDGNGLY)
select
hgi.FKStoreId,
CurWkGnG = sum(case when hgi.DateOfBusiness between @SDate and @EDate then hgi.price else 0 end),
CurWkGnGLY = sum(case when hgi.DateOfBusiness between @SDateLY and @EDateLY then hgi.price else 0 end),
CurYTDGnG =
case
when convert(varchar(10),opendate,126) between convert(varchar(10),@LYTDStart,126) and convert(varchar(10),@LYTDEnd,126) then sum(case when hgi.DateOfBusiness between DATEADD(day, (DATEPART(week, opendate) * 7 + DATEPART(weekday, opendate)) - (DATEPART(week, DATEADD(year, 1, opendate)) * 7 + DATEPART(weekday, DATEADD(year, 1, opendate))), DATEADD(year, 1, opendate)) and @CYTDEnd then hgi.price else 0 end)
else sum(case when hgi.DateOfBusiness between @CYTDStart and @CYTDEnd then hgi.price else 0 end)
end,
CurYTDGnGLY = sum(case when hgi.DateOfBusiness between @LYTDStart and @LYTDEnd then hgi.price else 0 end),
CurrPTDGnG = sum(case when hgi.DateOfBusiness between @CurrPtDStart and @CurrPtDEnd then hgi.price else 0 end),
CurrPTDGnGLY = sum(case when hgi.DateOfBusiness between @CurrPtDLYStart and @CurrPtDlyEnd then hgi.price else 0 end)
from hstGndItem hgi
join #StoresIncluded si
on hgi.FKStoreID = si.StoreID
where hgi.fkitemid in
(select fkitemid from categoryitem where categoryitemid = 25)
group by hgi.fkstoreid, opendate, comping
order by hgi.fkstoreid
尝试将“IN”转换为内部联接,如下所示:
FROM hstitem h inner join categoryitem c on c.fkitemid = h.itemid
where c.categoryitemid = ##
您可以使用
WHERE EXISTS
而不是中的来检查表中是否存在ID:
WHERE EXISTS
(
SELECT ci.fkitemid
FROM categoryitem ci
WHERE ci.categoryitemid = ## AND ci.fkitemid = hstitem.itemid
)
IN
子句和使用EXISTS
之间的区别在于,在找到匹配项后,WHERE EXISTS
中的子查询将提前退出,而IN
子句将等待子查询完成。对于我在这里的响应滞后,我深表歉意。
我找到了答案。我不知道它是否正确,但它对我们有用。
我删除了使用where中的子选择的代码,现在正在生成一个新表来保存应该拉取的值。填充表格的新代码每天早上6点左右运行。然后,我让主代码简单地连接到该表以提取单个答案,而不是基于子查询执行数学运算
谢谢大家的建议。谢谢你们在问题中提出疑问。建议的答案对你有帮助吗?您可以使用中显示的内容来跟踪查询时间。很抱歉。办公室里一直很忙。我确实尝试过将where中的子查询转换为join,但这部分存储过程的运行时间没有明显的差别。以上编辑中的代码在my 102 live stores中运行大约需要8分钟。这很酷,您使用的是where EXISTS
,而不是中的。使用where EXISTS的问题是它只匹配第一个实例。由于需要获得该类别中所有项目的全部销售额,不幸的是,这是不可行的。