0

Visual Studio 2010、Windows XP、SQLServerCEを使用しています。

次のようなデータベーステーブルを作成したいと思います。

CREATE TABLE Logs  
(  
    Id int,  
    ***LogTime datetime***,  
    Register1 smallint,  
    Register2 smallint,  
    Register3 smallint,  
)  

IDが主キーとIDになります。

私には解決できないこれらの問題があります:

  1. 「データソース」はPCに接続されたUSBからのファイルであるため、このテーブルには大きな一括挿入(一度に最大300kレコードでも)が入力されます。このバイナリ形式のファイルには、時系列のログが含まれています。私のソフトウェアはそれを取得し、デコードして、データベースに追加するレコードを準備する必要があります。
  2. 最終的にこのテーブルのデータからグラフが作成されるため、データベースに重複する日時(同じ日時の2つのレコード)を含めることはできません。

したがって、最初のバルク挿入は問題ありません。たとえば、次のようになります。

1, 2013-01-01 12:34:12, 12, 100, 200  
2, 2013-01-01 12:34:24, 13, 100, 212  
3, 2013-01-01 12:34:36, 11, 110, 208  
...  
100, 2013-01-01 14:04:58, 15, 120, 198  

ただし、次に挿入するファイルには、古いコンテンツとその他の新しい後続のレコードが含まれます。そして、新しいレコードのみを挿入する必要があります(それ以外の場合は、レコードのコピーを作成しています)。

したがって、
ファイル1:1月1日から1月5日まで
ファイル2:1月1日から1月8日まで

現時点では、データベーステーブルをフラットバイナリファイルとして実装しており、挿入する前に、O(N)線形スキャンで「挿入ポイント」を見つけて、新しいデータを追加できます。

フラットバイナリファイルの代わりにSQLサーバーCEをデータコンテナーとして使用したいと思います。

任意の提案をいただければ幸いです

4

2 に答える 2

1

データをステージングテーブルに一括挿入し(最初に切り捨て)、EXCEPT句を使用して新しいレコードのみを挿入することをお勧めします。

INSERT INTO Logs (LogTime, Register1, Register2, Register3)
SELECT LogTime, Register1, Register2, Register3 FROM LogStaging
EXCEPT
SELECT LogTime, Register1, Register2, Register3 FROM Logs
于 2013-01-23T16:34:04.130 に答える
1

「時系列ログ」とおっしゃっていますので、挿入するレコードが最後の挿入前のものになることは不可能だと思います。たとえば、日付は常に一意であり、常に昇順です。(たとえば、一部のプログラムは12秒ごとにファイルにレコードを追加します。)

この場合、最新の日付を保持する変数を作成します。

DECLARE @Last_Datetime DATETIME

次に、挿入先のテーブルのスキーマと一致する一時テーブルを作成します。

CREATE TABLE dbo.#Temp_Logs  
(
    LogTime datetime, 
    Register1 smallint,  
    Register2 smallint,  
    Register3 smallint,  
)

そして、そのテーブルに一括挿入します。

次に、最新のレコードを取得します。

SELECT @Last_Datetime = MAX(L.LogTime)
FROM dbo.Logs as L

次にINSERT SELECTWHERE句とともに使用して行を移動します。

INSERT Logs
SELECT
    TL.datetime,
    TL.Register1,
    TL.Register2,
    TL.Register3
FROM dbo.#Temp_Logs AS TL
WHERE TL.datetime > @Last_Datetime
于 2013-01-23T16:37:42.840 に答える