假设我有一个像这样的Select语句......
select a,b,c
from table1 where d=''
union
select a,b,c
from table1 where d>='' and e='' order by f asc,g desc offset 0 rows
fetch next 100 rows only
假设我需要使用union的select,但是当我使用非主键进行排序时,即f和g需要花费大量时间来执行查询。 但是当我按主键执行订单时说a和b它执行得更快。
请建议我使用非主键顺序执行上述查询的方法。
答案 0 :(得分:0)
就个人而言,我首先删除UNION
,留下类似的内容:
SELECT
a,b,c
FROM
table1
WHERE
ISNULL(d,'') = ''
OR ((NOT ISNULL(d,'') = '') AND e='')
ORDER BY
f ASC
, g DESC
OFFSET 0 rows FETCH NEXT 100 ROWS ONLY
然后我会查看分配给数据库的索引,并可能将f
和g
添加为索引,如果您对索引没有信心,我建议您执行(插入搜索)此处的引擎名称)可以查找合适的文章,甚至可以查看其他Stack Overflow问题,例如this one。如果您具备该功能,则应考虑使用SQL事件探查器来确定索引将使数据库受益的位置并提高其性能。
另一件值得关注的事情是分页方法的效率,如果您只想要前100个结果,可以执行SELECT TOP 100...
之类的操作,或者您可以查看this article详细说明效率分页。我自己没有使用过OFFSET n ROWS SELECT NEXT 100 ROWS ONLY
,但使用了ROW_NUMBER()OVER()
(请参阅here)并且自己没有太多问题。