开发者

Suggestion for SQL performance

开发者 https://www.devze.com 2023-02-14 08:43 出处:网络
Everytime the user visits the page I log it with logtime, and now I want to find the latest distinct 100 pages that 开发者_如何学Pythona user with ID \"MyID\".

Everytime the user visits the page I log it with logtime, and now I want to find the latest distinct 100 pages that 开发者_如何学Pythona user with ID "MyID".

I use the following SQL to select distinct record but the performance is not good. Could anyone have any suggestion for the improvement?

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

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

Table schema is as follows

ID         int(PK)
PageName   varchar
Key        varchar
Username   varchar
Url        text
LogTime    datetime

So if I have the following records

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

The result I want from the query would be

PageName    Url
PageA       PageA.html
PageB       PageB.html

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

Things get changed. Now the Url will be combined with field from different table like

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

Any ideas?


There's no need for the inner query - just group by PageName/URL.

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


I assume that you are working on MsSql, put your query into Database Engine Tuning Advisor. It will give you all the necessary recommendation to improve performance allowing you to create indexes and statistics as required.

0

精彩评论

暂无评论...
验证码 换一张
取 消