【发布时间】:2011-06-04 14:56:48
【问题描述】:
SELECT projectID, urlID, COUNT(1) AS totalClicks, projectPage,
(SELECT COUNT(1)
FROM tblStatSessionRoutes, tblStatSessions
WHERE tblStatSessionRoutes.statSessionID = tblStatSessions.ID
AND tblStatSessions.projectID = tblAdClicks.projectID
AND (tblStatSessionRoutes.leftPageID = tblAdClicks.projectPage OR
tblStatSessionRoutes.rightPageID = tblAdClicks.projectPage)) AS totalViews
FROM tblAdClicks
WHERE projectID IN (SELECT projectID FROM tblProjects WHERE userID = 5)
GROUP BY projectID, urlID, projectPage
ORDER BY CASE projectID
WHEN 170 THEN
1
ELSE
0
END, projectID
这绝不是一个特别复杂的查询,但是因为数据库已经标准化到一个很好的水平,而且我们正在处理大量数据,所以这个查询对于用户来说可能会很慢。
有没有人有关于如何提高速度的提示?如果我从战略上对数据库的某些部分进行非规范化,这会有所帮助吗?在存储过程中运行它会带来显着的改进吗?
我处理数据的方式在我的代码中是有效的,瓶颈确实是这个查询。
谢谢!
【问题讨论】:
-
您使用的是什么关系型数据库? MySQL、SQL Server、Postgres?
-
SQL-Server 是它运行的平台。只有v2000,有点垃圾!
-
此外,查询中的某些格式不会误入歧途。编辑:哦,这样更好。
-
有两个主要问题 1) Db 未标准化,但您认为它是。 “非规范化”非规范化可能会有所帮助,但规范化它会帮助更多。使用您的数据模型发布一个新问题。 2) 查询格式不正确,外部查询没有定义清晰的结构,子查询可以依赖该结构。 3) 当然 IN 使用工作表,所以将其更改为连接。
标签: sql sql-server-2000 query-optimization normalization relational-database