我发现我只需要记录一个客户会话ID和一个已查看的产品ID,以便实现这一目标。这是我的表脚本:
CREATE TABLE [dbo].[pagevisits](
[ID] [int] IDENTITY(1,1) NOT NULL,
[xsession] [int] NULL,
[xpagename] [int] NULL
) ON [PRIMARY]
我想出了一个似乎正常的查询
select top 5 xpagename, COUNT(xpagename)as total
FROM pagevisits
WHERE pagevisits.xsession in (SELECT pagevisits.xsession
FROM pagevisits \
WHERE pagevisits.xpagename = 20
AND pagevisits.xsession != 539447381 )
AND pagevisits.xpagename != 20
GROUP BY xpagename
ORDER BY total DESC
然而,作为SQL的新手,我担心因为这个表可能会变得非常大,这会扼杀服务器吗?有没有更好的方法来做到这一点,还是我还好吗?
答案 0 :(得分:1)
我不确定为什么你需要一个内部SELECT。如果要在现有会话中选择客户访问的页面(假设:会话ID已知),而不是当前页面,您可以:
select top 5 xpagename, COUNT(xpagename)as total
FROM pagevisits
WHERE pagevisits.xsession = 539447381
AND pagevisits.xpagename != 20
GROUP BY xpagename
ORDER BY total DESC
其中539447381是当前会话ID,20是当前页面。
如果可以在xpagename和xsession上添加聚簇索引,则可以提高性能:
CREATE CLUSTERED INDEX [custom] ON [dbo].[pagevisits]
(
[xsession] ASC,
[xpagename] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
PS:问题标题说“客户也看过”,因此我的回答。如果预期结果是返回查看当前页面的其他客户访问的前5页,那么问题中给出的查询就足够了,但添加聚簇索引以获得更好的性能(用聚簇索引搜索替换表扫描)。