1

我们有一张表格,用于记录我们公司内部的互联网使用情况。此表由我们购买的软件填充,我们无法对其表进行任何更改。该表没有唯一的键或索引(正如其开发人员所说,使数据写入更快)

我需要阅读此表中的数据以创建用户使用互联网的实时报告。

目前我正在从该表中读取 1000 条记录的数据。我的问题是保留我从表中读取的最后一条记录,因此我可以读取接下来的 1000 条记录。

这个问题的最佳解决方案是什么?

顺便说一句,如果数据库文件变大,软件可能会根据需要删除较早的记录。

4

3 回答 3

0

如果没有任何索引,您将无法有效地选择“最后”记录。该解决方案不会扩展。您不能在同一个句子中使用“实时”和“大型日志记录表的重复表扫描”。

实际上,如果每一行没有任何唯一的标识属性,您甚至无法确定什么是新的(证明:比如说,您有一个充满数千个布尔值的表。您将如何确定哪些是新的?它们无法区分!您无法找出.)。必须有一些你可以使用的东西,比如某种组合DateTime, IP。或者,您可以添加一个IDENTITY可能对您使用的软件透明的列。

您使用的软件可能会允许您在某些 ID 或 DateTime 列上创建索引,因为这对软件是透明的。它可能会产生更多负载,因此请务必对其进行测试(我的猜测:你会没事的)。

于 2013-01-24T13:38:31.667 回答
0

根据您的 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
于 2013-01-24T12:21:40.247 回答
0

这也会有所帮助;

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
于 2013-01-24T12:27:54.483 回答