【问题标题】:Select last N rows SQL Server 2012选择最后 N 行 SQL Server 2012
【发布时间】:2015-02-27 07:43:47
【问题描述】:

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

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

这是我当前的代码,它显示每个日期的行数 我可以使代码仅显示当前的导入作业,但仍会遍历所有其他记录。

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

提前致谢

【问题讨论】:

  • 自动标签,现已移除
  • select top n ... from ... order by .. desc 怎么样
  • 那不是大数据,是大表的 SQL 问题。首先,确保 Datum 已编入索引。假设导入仅添加较晚的日期,请在导入前选择最大日期,然后使用它来过滤带有WHERE 的表。考虑压缩、分区和/或列存储索引以提高速度,它们可以显着提高性能。
  • 一般来说,SQL 中的一些“最后”数据是不容易得到的。尝试更改您的条件或排序以查询“第一个”数据。然后你可以有效地限制结果。
  • 你为什么不直接SELECT COUNT(*) FROM table WHERE Datum>=@previousMaxDatum

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


【解决方案1】:

这会将结果限制为 100 行,您可以通过使用 order by 子句 desc 来获取最后一行

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

【讨论】:

  • 如果我想跳过前 N 行,它会是:按数据排序 OFFSET n ROWS FETCH NEXT N ROWS ONLY;对吗?
  • 抱歉,没用。 OFFSET 将对最终结果集起作用,并且不会帮助减少考虑进行排序、分组和计数的行数! OFFSET 也无助于减少计算时间,因为它所做的只是缩短在确定后返回给客户端的结果集!
【解决方案2】:

这很难。我认为只要您想在导入后找出最后的记录,您就需要在 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 的记录数写入一个单独的表中。那会便宜很多。

【讨论】:

  • 不需要TOP。 MAX(Datum) 将返回最新日期。至于单独的表 - 您仍然必须使用与用于创建该表的 OP 相同的语句。
【解决方案3】:

在单个表上查找计数的最快方法,

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() 。 然后减去这两个。

如果 table 已经包含一个 rownumber 类型的序列,那么 您也可以在 sql server 2012 中使用 First_Value 使用相同的技术

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 2010-10-09
    相关资源
    最近更新 更多