可以說,我有我的MSSQL 2016(後來Azure的SQL)加入和組多個表
[ForumBoards] 1-n [ForumThreads] 1-n [ForumPosts] n-1 [Users]
這種關係我們有:50米板,20萬個主題,100萬發的帖子和50K用戶
的目標現在是一個板內
- 有ID和名稱所有電路板
- 一板內一些職位
- 最新張貼板
- 用戶ID和最新帖子
的名字在我的首秀
SELECT
Boards.Id AS BoardsId,
Board.Name AS BoardsName,
LP.*
ThreadsCount = (SELECT Count(*) FROM ForumBoards AS SubB
JOIN ForumThreads AS SubT ON SubB.Id = SubT.BoardId
WHERE SubB.Id = Boards.Id AND SubT.BoardId = SubB.Id),
PostsCount = (SELECT Count(*) FROM ForumBoards AS SubB
JOIN ForumThreads AS SubT ON SubB.Id = SubT.BoardId
JOIN ForumPosts AS SubP ON SubT.Id = SubP.ThreadId
WHERE SubB.Id = Boards.Id AND SubT.BoardId = SubB.Id AND SubP.ThreadId = SubT.Id)
FROM ForumBoards as Boards
OUTER APPLY(
SELECT
TOP 1 SubP.Id AS LatestPostId,
SubP.PostedOn AS LatestPostPostedOn,
SubP.ThreadId AS LatestPostThreadId,
SubT.Topic AS LatestPostThreadTopic,
SubU.Id AS LatestPostUserId,
SubU.Username AS LatestPostUsername
FROM ForumBoards AS SubB
JOIN ForumThreads AS SubT ON SubB.Id = SubT.BoardId
JOIN ForumPosts AS SubP ON SubT.Id = SubP.ThreadId
JOIN Users AS SubU ON SubP.UserId = SubU.Id
WHERE SubB.Id = Boards.Id AND SubT.BoardId = SubB.Id AND SubP.ThreadId = SubT.Id AND SubU.Id = SubP.UserId
ORDER BY SubP.PostedOn DESC) AS LP
它有一個令人難以置信的糟糕表現。
沒有
WHERE SubB.Id = Boards.Id AND SubT.BoardId = SubB.Id AND SubP.ThreadId = SubT.Id AND SubU.Id = SubP.UserId
它花費45ms,大約有6秒。
另一個節目是這樣一個
SELECT
B.Id,
B.Name as BoardName,
Count(*) as ThreadsCount,
(SELECT Count(*)
FROM
ForumBoards Boards, ForumThreads Threads, ForumPosts Posts
WHERE Boards.Id = Threads.BoardId AND Threads.Id = Posts.ThreadId AND Boards.Id = B.Id) AS PostsCount
FROM ForumBoards B, ForumThreads T
WHERE B.Id = T.BoardId
GROUP BY B.Id, B.Name
這是確定的,約172ms - 但沒有最新帖子。
但我認爲我在對衝的錯誤一面。並提示我如何達到我的目標?
你已經創建非聚集索引在連接操作中使用的列(它也與相關查詢有關)? – hastrb
@AliaksandrBortnik MSSQL query ex plan recommended to create CREATE NONCLUSTERED INDEX IX_ForumThreads_BoardRelation ON [dbo]。[ForumThreads]([BoardId])INCLUDE([Id])'完成了,是的。 – Ben
表中的ID是否有聚集索引? – hastrb