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的问题是它只匹配第一个实例。由于需要获得该类别中所有项目的全部销售额,不幸的是,这是不可行的。