我们有一张表格,用于记录我们公司内部的互联网使用情况。此表由我们购买的软件填充,我们无法对其表进行任何更改。该表没有唯一的键或索引(正如其开发人员所说,使数据写入更快)
我需要阅读此表中的数据以创建用户使用互联网的实时报告。
目前我正在从该表中读取 1000 条记录的数据。我的问题是保留我从表中读取的最后一条记录,因此我可以读取接下来的 1000 条记录。
这个问题的最佳解决方案是什么?
顺便说一句,如果数据库文件变大,软件可能会根据需要删除较早的记录。
我们有一张表格,用于记录我们公司内部的互联网使用情况。此表由我们购买的软件填充,我们无法对其表进行任何更改。该表没有唯一的键或索引(正如其开发人员所说,使数据写入更快)
我需要阅读此表中的数据以创建用户使用互联网的实时报告。
目前我正在从该表中读取 1000 条记录的数据。我的问题是保留我从表中读取的最后一条记录,因此我可以读取接下来的 1000 条记录。
这个问题的最佳解决方案是什么?
顺便说一句,如果数据库文件变大,软件可能会根据需要删除较早的记录。
如果没有任何索引,您将无法有效地选择“最后”记录。该解决方案不会扩展。您不能在同一个句子中使用“实时”和“大型日志记录表的重复表扫描”。
实际上,如果每一行没有任何唯一的标识属性,您甚至无法确定什么是新的(证明:比如说,您有一个充满数千个布尔值的表。您将如何确定哪些是新的?它们无法区分!您无法找出.)。必须有一些你可以使用的东西,比如某种组合DateTime, IP
。或者,您可以添加一个IDENTITY
可能对您使用的软件透明的列。
您使用的软件可能会允许您在某些 ID 或 DateTime 列上创建索引,因为这对软件是透明的。它可能会产生更多负载,因此请务必对其进行测试(我的猜测:你会没事的)。
根据您的 SQL Server 版本,您可以使用row_number()
. row_number()
分配后,您可以对记录进行分页:
select *
from
(
select *,
row_number() over(order by id) rn
from yourtable
) src
where rn between 1 and 1000
然后,当您想要获取下一组记录时,您可以将WHERE
子句中的值更改为:
where rn between 1001 and 2000
根据您关于数据被删除的评论,我将执行以下操作。
首先,将数据插入到一个临时表中:
select *, row_number() over(order by id) rn
into #temp
from yourtable
然后您可以根据需要在任何块中按行号选择数据。
select *
from #temp
where rn between 1 and 1000
这也会有所帮助;
declare @numRecords int = 1000 --Number of records needed per request
declare @requestCount int = 0 --Request number starting from 0 and increase 1 by 1
select top (@numRecords) *
from
(
select *, row_number() over(order by id) rn
from yourtable
) T
where rn > @requestCount*@numRecords
编辑:根据评论
CREATE PROCEDURE [dbo].[select_myrecords]
--Number of records needed per request
declare @NumRecords int --(= 1000 )
--Datetime of the LAST RECORD of previous result-set or null for first request
declare @LastDateTime datetime = null
AS
BEGIN
select top (@NumRecords) *
from yourtable
where LOGTime < isnull(@LastDateTime,getdate())
order by LOGTime desc
END