选择最后N行SQL Server 2012

时间:2015-02-27 07:43:47

标签: sql sql-server sql-server-2012

我目前正在使用大数据。我将数据导入到一个表中,每个导入大约有2亿条记录。我想看看当前导入加载了多少条记录。但是目前我的脚本首先运行10亿条记录,最后计算最后导入的数据。

SELECT Datum, COUNT(Datum) AS recCount
FROM   PF161DailyAggregates
GROUP BY Datum

这是我当前的代码,显示每个Date的行数 我可以创建它只显示当前导入作业的代码,但它仍将通过所有其他记录。

目前此查询大约需要一个小时。如何才能快速计算最后N行?

提前致谢

3 个答案:

答案 0 :(得分:0)

这会将结果限制为100行,您可以通过按条款desc命令获取最后一行

SELECT Datum, COUNT(Datum) AS recCount
FROM   PF161DailyAggregates
GROUP BY Datum
order by datum desc
OFFSET 1 ROWS
FETCH NEXT 100 ROWS ONLY;

答案 1 :(得分:0)

这很难。我想只要您想在导入后找到最后的记录,就需要在Datum列上使用一些排序。您可以在那里尝试各种技巧,但只要此列没有索引,您就会丢失,因为任何排序都需要全表扫描。所以我的第一个建议是在该列上建立索引,然后您可以使用任何将结果限制为最后日期的技术,如:

select top 1 Datum, count(Datum)
from PF161DailyAggregates
group by Datum
order by Datum desc

select count(*)
from PF161DailyAggregates
where Datum = (select top 1 Datum
               from PF161DailyAggregates
               order by Datum desc)

另一个想法是打开包装并使导入作业在每次运行时在每个单独的表中写入每个Datum的记录数。那会便宜得多。

答案 2 :(得分:0)

找到单桌上最快的方法,

SELECT T.name AS [TABLE NAME], 
       I.rows AS [ROWCOUNT] 
FROM   sys.tables AS T 
       INNER JOIN sys.sysindexes AS I 
               ON T.object_id = I.id 
                  AND I.indid < 2 
where T.name ='PF161DailyAggregates'
ORDER  BY I.rows DESC 

可替换地,

您可以创建一个标识列。 在插入之前,查找max id ==简单快捷 然后在插入后在变量中找到SCOPE_IDENTITY()。 然后减去这两个。

如果表已按顺序包含一个rownumber类型 你也可以在sql server 2012中使用First_Value使用相同的技术