每次用户访问该页面时,我都会使用logtime进行记录,现在我想查找ID为“MyID”的用户的最新不同的100页。
我使用以下SQL来选择不同的记录,但性能不佳。任何人都可以对改进提出任何建议吗?
Select distinct Top 100 Url,PageName,
(select top 1 inner_pa.LogTime from PageActivity inner_pa with(nolock)
where inner_pa.Key = pa.Key
and inner_pa.UserID='MyID'
order by inner_pa.LogTime Desc) as LogTime
From PageActivity pa WITH(NOLOCK)
Where pa.UserId='MyID'
Order By LogTime DESC
==================================
表模式如下
ID int(PK)
PageName varchar
Key varchar
Username varchar
Url text
LogTime datetime
所以,如果我有以下记录
ID PageName Key UserName Url LogTime
1 PageA post MyID PageA.html 2011/1/1/12:10:10
2 PageA post MyID PageA.html 2011/1/1/12:10:15
3 PageB post MyID PageB.html 2011/1/1/12:10:30
4 PageB post MyID PageB.html 2011/1/1/12:10:45
4 PageB post OtherID PageB.html 2011/1/1/12:10:48
我想从查询中得到的结果是
PageName Url
PageA PageA.html
PageB PageB.html
=============================================== ======================
事情变了。现在,Url将与来自不同表格的字段组合,如
Select distinct Top 100 pa.PageName,
pu.URL + '=' + pa.Key as URL,
(select top 1 inner_pa.LogTime from PageActivity inner_pa with(nolock)
where inner_pa.Key = pa.Key
and inner_pa.UserID='MyID'
order by inner_pa.LogTime Desc) as LogTime
From PageActivity pa WITH(NOLOCK)
Join PageUrl pu on pa.UrlID = pu.ID
Where pa.UserId='MyID'
Order By LogTime DESC
有什么想法吗?
答案 0 :(得分:1)
不需要内部查询 - 只需按PageName / URL分组。
SELECT TOP 100
PageName, URL
FROM PageActivity
GROUP BY PageName, URL
WHERE UserID = 'MyId'
ORDER BY LogTime DESC
答案 1 :(得分:0)
我假设您正在使用MsSql,将您的查询放入数据库引擎优化顾问。它将为您提供所有必要的建议,以提高性能,允许您根据需要创建索引和统计信息。