1

社内にインターネットの利用状況を記録するテーブルがあります。このテーブルは、私たちが購入したソフトウェアによって埋められており、そのテーブルを変更することはできません。このテーブルには一意のキーまたはインデックスがありません (開発者が言うように、データの書き込みを高速化するため)

ユーザーによるインターネット使用状況のリアルタイム レポートを作成するには、このテーブルのデータを読み取る必要があります。

現在、このテーブルから 1000 レコードのチャンクでデータを読み取っています。私の問題は、テーブルから読み取った最後のレコードを保持しているため、次の 1000 レコードを読み取ることができます。

この問題の最善の解決策は何ですか?

ところで、データベース ファイルのサイズが大きくなると、必要に応じて以前のレコードがソフトウェアによって削除される場合があります。

4

3 に答える 3

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

データが削除されるというあなたのコメントに基づいて、私は次のことを行います。

まず、データをtemptableに挿入します。

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

インデックスがないと、「最後の」レコードを効率的に選択できません。ソリューションはスケーリングしません。「リアルタイム」と「大きなロギング テーブルの繰り返しテーブル スキャン」を同じ文で使用することはできません。

実際には、各行の一意の識別属性がなければ、何が新しいのかを判断することさえできません(証明: たとえば、何千ものブール値でいっぱいのテーブルがあったとします。どれが新しいかをどのように判断しますか?それらを区別することはできません!あなたは見つけることができません) .)。の組み合わせとか、使えるものがあるはずですDateTime, IPIDENTITYまたは、使用するソフトウェアに対して透過的である可能性が高い列を追加できます。

おそらく、使用しているソフトウェアは、ソフトウェアに対して透過的であるため、ID または DateTime 列にインデックスを作成することを許容します。より多くの負荷がかかる可能性があるため、必ずテストしてください(私の推測では、問題ないでしょう)。

于 2013-01-24T13:38:31.667 に答える
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 に答える