我使用OFFSET FETCH
语法为我的Web应用程序在SQL Server中完成分页。
注意:该应用程序具有一个用户界面,用户可以在其中构建视图,选择列,这些列可以作为引用值。
这对于简单 SQL语句来说可以很好地工作,但是如果我的SQL语句变得过于复杂,它就会变得非常慢。
具有1万行的表格示例:
SELECT *
FROM
(SELECT TOP 100 PERCENT
id, title
FROM mytable) t
ORDER BY title
OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY;
假设,此查询在SQL Server Management Studio中花费的时间不到1秒。
现在,我开始在我的语句中实现引用的表。
SELECT *
FROM
(SELECT TOP 100 PERCENT
id, title,
(SELECT value
FROM table_reference
WHERE id = ref_id) AS ref_value,
(SELECT value
FROM table_reference2
WHERE id = ref_id2) AS ref_value2
FROM
mytable) t
ORDER BY title
OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY;
这仍然表现不错。
现在我在WHERE子句中使用引用的值:
SELECT *
FROM
(SELECT TOP 100 PERCENT
id, title,
(SELECT value
FROM table_reference
WHERE id = ref_id) AS ref_value,
(SELECT value
FROM table_reference2
WHERE id = ref_id2) AS ref_value2
FROM
mytable) t
WHERE
ref_value LIKE '%something%'
ORDER BY title
OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY;
现在我的查询时间从<1秒缩短到14秒。
在查询分析器和Web的调查中,我发现OFFSET
是这里的性能问题,这是由于其工作方式所致。大多数网络信息都称赞FETCH OFFSET
易于使用和快速,但是我找不到有关瓶颈和性能问题的任何详细信息。
因此,由于UI还允许定义哪些列用于“完全相似的搜索”,因此我寻求一种解决方案来管理这些值的使用方式,并且仍然不会影响性能。
我考虑过创建另一列保存所选值的列,但是如果引用更改,则该值已过时。另外,由于触发器变得复杂且不可维护,因此触发器无法在被引用的表上进行更新。
我从没看过它,但是计算列是否可以作为检查是否可行的选择?或针对此特定问题的其他任何好的建议?
感谢,伊夫