Sql server o按xdate排序以获得前100名,这就是为什么您有这种排序。最好的方法是在xdate上有一个索引,xlog。但这会增加开销。当其他事情不起作用时,这应该是一个选项。试试下面的方法 SELECT TOP 100 XDATE, XHW, XCELL, XMESSAGE, XLOG into #mytop100 FROM LOGS WHERE XDATE > '2012-06-12T00:00:00' AND XDATE < '2012-07-13T08:29:03.250' AND (XLOG = 1) ORDER BY XDATE DESC union all SELECT TOP 100 XDATE, XHW, XCELL, XMESSAGE, XLOG FROM LOGS WHERE XDATE > '2012-06-12T00:00:00' AND XDATE < '2012-07-13T08:29:03.250' AND (XLOG = 1002) ORDER BY XDATE DESC select TOP 100 XDATE, XHW, XCELL, XMESSAGE, XLOG from #mytop 100 ORDER BY XDATE DESC, XLOG DESC

Sql server o按xdate排序以获得前100名,这就是为什么您有这种排序。最好的方法是在xdate上有一个索引,xlog。但这会增加开销。当其他事情不起作用时,这应该是一个选项。试试下面的方法 SELECT TOP 100 XDATE, XHW, XCELL, XMESSAGE, XLOG into #mytop100 FROM LOGS WHERE XDATE > '2012-06-12T00:00:00' AND XDATE < '2012-07-13T08:29:03.250' AND (XLOG = 1) ORDER BY XDATE DESC union all SELECT TOP 100 XDATE, XHW, XCELL, XMESSAGE, XLOG FROM LOGS WHERE XDATE > '2012-06-12T00:00:00' AND XDATE < '2012-07-13T08:29:03.250' AND (XLOG = 1002) ORDER BY XDATE DESC select TOP 100 XDATE, XHW, XCELL, XMESSAGE, XLOG from #mytop 100 ORDER BY XDATE DESC, XLOG DESC,sql-server,sql-server-2008,sql-server-2005,postgresql,sql-execution-plan,Sql Server,Sql Server 2008,Sql Server 2005,Postgresql,Sql Execution Plan,还可以尝试将主sql withwout插入mytop100,看看它是否选择了一个好的计划。我打赌它会,但仍然会检查。按XDate排序是问题的根源。数据必须按XDate排序才能进入前100名,这就是为什么要进行这种排序。最好的方法是在xdate上有一个索引,xlog。但这会增加开销。当其他事情不起作用时,这应该是一个选项。试试下面的方法 SELECT TOP 100 XDATE, XHW, XCELL, XMESSAGE, XLOG into #mytop100 FROM LOGS WHERE

还可以尝试将主sql withwout插入mytop100,看看它是否选择了一个好的计划。我打赌它会,但仍然会检查。

按XDate排序是问题的根源。数据必须按XDate排序才能进入前100名,这就是为什么要进行这种排序。最好的方法是在xdate上有一个索引,xlog。但这会增加开销。当其他事情不起作用时,这应该是一个选项。试试下面的方法

SELECT TOP 100 XDATE, XHW, XCELL, XMESSAGE, XLOG
into #mytop100
FROM LOGS 
WHERE XDATE > '2012-06-12T00:00:00' AND XDATE < '2012-07-13T08:29:03.250' 
AND (XLOG = 1) 
ORDER BY XDATE DESC
union all
SELECT TOP 100 XDATE, XHW, XCELL, XMESSAGE, XLOG FROM LOGS 
WHERE XDATE > '2012-06-12T00:00:00' AND XDATE < '2012-07-13T08:29:03.250' 
AND (XLOG = 1002) 
ORDER BY XDATE DESC

select TOP 100 XDATE, XHW, XCELL, XMESSAGE, XLOG from #mytop 100 ORDER BY XDATE DESC, XLOG DESC 


还可以尝试将主sql withwout插入mytop100,看看它是否选择了一个好的计划。我打赌它会,但仍然会检查。

此表上有哪些索引?除了主键索引之外,没有其他索引是一个选项。这不是我为解决这个问题而探索的解决方案。这个表上有哪些索引?除了主键索引之外,没有其他索引是一个选项。这不是我探索的解决这个问题的方法。好的,但这相当于我的查询2。。。提供的信息足够多,可以与临时表一起使用。由于外部顶部的转换机会不存在,所以计划应该足够好。那么,哪种方法对您有效?CTA查询2可以工作,临时表解决方案也可以工作,只需更正一些打字错误。但是现在想象一下,有10个日志需要查询,大约有10个额外的过滤器,其中foo类似于“bar%”。这不会像是来自地狱的噩梦动态SQL查询吗?然后在XDATE上创建一个无约束的索引。如果你没有任何其他类型的查询,或者大多数的查询都是这种类型的,并且被执行了很多时间。考虑将XDATE作为第一个键,XLoG作为你的聚集索引KEYOK的KEY2,但是这相当于我的查询2…提供的信息足够多,可以与临时表一起使用。由于外部顶部的转换机会不存在,所以计划应该足够好。那么,哪种方法对您有效?CTA查询2可以工作,临时表解决方案也可以工作,只需更正一些打字错误。但是现在想象一下,有10个日志需要查询,大约有10个额外的过滤器,其中foo类似于“bar%”。这不会像是来自地狱的噩梦动态SQL查询吗?然后在XDATE上创建一个非链接索引。如果没有任何其他类型的查询,或者大多数查询都是这种类型的,并且执行的时间很多。考虑将XDATE作为第一个键,XLoG作为您的聚集索引KEY2。数据库不知道前100个。您想要的行都是XLOG=1:不,不!事实上,它们绝对不是来自一本日志。实际上,条目是混合的。事实上,在XDATE上创建聚集索引,然后使用XLOG是有意义的。这可能会将查询计划变成聚集索引扫描。但是,当其他日志有很多最近的事件时,我担心从一个只有很少行的特定古代日志中检索数据。数据库不知道您想要的前100行都是XLOG=1:不,不!事实上,它们绝对不是来自一本日志。实际上,条目是混合的。事实上,在XDATE上创建聚集索引,然后使用XLOG是有意义的。这可能会把查询计划变成聚集索引扫描。然而,当其他日志有很多最近的事件时,我担心从一个只有很少行的特定古代日志中检索数据。