SQL Server对复杂语句使用FETCH OFFSET

时间:2019-01-03 11:50:52

标签: sql-server performance

我使用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还允许定义哪些列用于“完全相似的搜索”,因此我寻求一种解决方案来管理这些值的使用方式,并且仍然不会影响性能。

我考虑过创建另一列保存所选值的列,但是如果引用更改,则该值已过时。另外,由于触发器变得复杂且不可维护,因此触发器无法在被引用的表上进行更新。

我从没看过它,但是计算列是否可以作为检查是否可行的选择?或针对此特定问题的其他任何好的建议?

感谢,伊夫

0 个答案:

没有答案