2011-03-03 78 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