gpt4 book ai didi

sql - T-SQL 查询优化

转载 作者:行者123 更新时间:2023-12-05 08:24:34 26 4
gpt4 key购买 nike

我正在对我们为客户提供的内部网络分析系统进行一些升级(在没有首选供应商或 Google Analytics 的情况下),并且我正在处理以下查询:

select 
path as EntryPage,
count(Path) as [Count]
from
(
/* Sub-query 1 */
select
pv2.path
from
pageviews pv2
inner join
(
/* Sub-query 2 */
select
pv1.sessionid,
min(pv1.created) as created
from
pageviews pv1
inner join Sessions s1 on pv1.SessionID = s1.SessionID
inner join Visitors v1 on s1.VisitorID = v1.VisitorID
where
pv1.Domain = isnull(@Domain, pv1.Domain) and
v1.Campaign = @Campaign
group by
pv1.sessionid
) t1 on pv2.sessionid = t1.sessionid and pv2.created = t1.created
) t2
group by
Path;

我已经用 PageViews 表中的 200 万行测试了这个查询,运行大约需要 20 秒。我注意到在执行计划中进行了两次聚集索引扫描,两次都访问了 PageViews 表。该表中的 Created 列上有一个聚集索引。

问题是,在这两种情况下,它似乎都遍历了所有 200 万行,我认为这是性能瓶颈。有什么我可以做的来防止这种情况发生,或者我是否已经达到优化的极限?

作为引用,查询的目的是找到每个 session 的第一个页面 View 。

编辑: 在经历了很多挫折之后,尽管在这里收到了帮助,但我无法使这个查询工作。因此,我决定简单地在 session 表中存储对入口页面(现在是导出页面)的引用,这允许我执行以下操作:

select
pv.Path,
count(*)
from
PageViews pv
inner join Sessions s on pv.SessionID = s.SessionID
and pv.PageViewID = s.ExitPage
inner join Visitors v on s.VisitorID = v.VisitorID
where
(
@Domain is null or
pv.Domain = @Domain
) and
v.Campaign = @Campaign
group by pv.Path;

此查询运行时间不超过 3 秒。现在,我要么必须在记录页面浏览量时实时更新进入/退出页面(最佳解决方案),要么每隔一段时间运行一次批量更新。无论哪种方式,它都解决了问题,但不像我想要的那样。

编辑 编辑:添加一个缺失的索引(从昨晚清理后)将查询减少到仅仅几毫秒)。呜呜呜!

最佳答案

首先,

    where pv1.Domain = isnull(@Domain, pv1.Domain) 

不会是 SARG。正如我所记得的那样,您无法优化函数的匹配。

关于sql - T-SQL 查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/339560/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com