2011-03-03 64 views
1

每次用户访问页面时,我都会使用logtime对其进行登录,现在我想查找ID为“MyID”的用户的最新不同100页。对SQL性能的建议

我使用以下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 

============================================= ========================

事情变了。现在,网址将结合不同表中的字段,如

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 

任何想法?

+1

屏幕截图请..或发布两个表及其FK的等 – 2011-03-03 11:05:27

+0

您好我已经添加了表模式,例如数据和查询所需的结果。请指教。 – Charlie 2011-03-17 09:46:54

回答

0

我假定您正在使用MsSql,将您的查询放入数据库引擎优化顾问。它将为您提供改进性能的所有必要建议,使您可以根据需要创建索引和统计信息。

1

不需要内部查询 - 仅由PageName/URL进行分组。您的架构的

SELECT TOP 100 
    PageName, URL 
FROM PageActivity 
GROUP BY PageName, URL 
WHERE UserID = 'MyId' 
ORDER BY LogTime DESC 
+0

但我想只有不同的页面名称和URL。 – Charlie 2011-03-17 09:35:00

+0

Charlie,GROUP BY将返回不同页面名称/ URL对的列表。它通常是DISTINCT的替代品。但是我不能100%确定这个查询是否按预期工作...... ORDER BY通常发生在分组之后,并且组中没有LogTime。 – 2011-03-17 10:14:52

+0

'GROUP BY'应该跟在'WHERE'后面。至少在T-SQL中它绝对应该。 – 2011-03-17 13:00:58