【发布时间】:2015-08-12 23:52:43
【问题描述】:
我正在用 SQL/C# 实现用户搜索功能。我在函数本身的后勤方面遇到了一些问题,我正在寻找一些指导。
我一直在使用三重嵌套子查询,我觉得它的运行速度有点慢(从用户表中的 1000 条记录中提取结果平均需要 280-300 毫秒)。
我首先想按属性搜索用户(单独的表),然后根据位置搜索。然后我想要计算和排序距离,然后一次只带回最近的 10 条记录(分页结果)。
我使用三重嵌套子查询的方法是否正确?或者是否有标准或指导原则来做这种(双关语不是故意的)事情?
代码示例:
SELECT * FROM
(SELECT *, ROW_NUMBER()
OVER (ORDER BY UsersSubquery.Distance ASC) as RowNumber
FROM
(
SELECT TOP 100 PERCENT UsersSubquery.*,
(((geography::Point(UsersLocationsSubquery.Latitude, UsersLocationsSubquery.Longitude, 4326)).STDistance(@a)) / 1000) AS Distance
FROM Users UsersSubquery
INNER JOIN UsersAndAttributes ON UsersSubquery.UserId = UserAndAttributes.UserId
INNER JOIN UsersAndLocations AS UsersWithLocationsSubquery ON UsersSubquery.UserId = UsersWithLocationsSubquery.UserId
WHERE
(
((@Attribute1 = NULL) OR (UsersSubquery.Attribute1Id = @Attribute1))
AND
((@Attribute2 = NULL) OR (UsersSubquery.Attribute2Id = @Attribute2))
AND
((@Attribute3 = NULL) OR (UsersSubquery.Attribute3Id = @Attribute3))
AND
...etc
)
)
AS UsersSubquery )
Users
INNER JOIN Pictures ON Users.UserId = Pictures.UserId
WHERE RowNumber >= @StartRow and RowNumber <= @EndRow
Order by RowNumber
【问题讨论】:
-
你能告诉我们你正在使用的查询吗?
-
这太模糊了,无法得到任何有用的答案。我们不知道您的表的结构、它的索引方式、您的查询是什么,或者其他任何事情。请发布一些代码,否则我们无法帮助您。
-
是的,我认为这会出现。暂时...
-
也许我应该问,临时视图是否优于多个子查询?
-
只要不影响结果集,SQL 引擎可以随意对查询的各个部分进行重新排序。它可能不会按照您编写代码的顺序执行操作。查询计划将准确显示它执行操作的顺序以及哪些步骤很慢。