0

私は数十億行の SQLite データベースで作業しています。書き込みがほとんどないアーカイブデータベースです。私の主な関心は、データのクラスター インデックスを生成することです。RSQLite インターフェイスを使用して、次のようにテーブルと標準インデックスを生成できます。

    dbSendStatement(SQLiteConn, "CREATE TABLE VSReports (ReportId bigint Not Null, EvtDateTime text, ConditionCode text, Basis text, ConditionLabel text, VitalSignCode text, VitalSignLbl text, VSUnit text, VSValue text);")

患者レポートが提出され、一度入力されると、時間ごとに複数の観察があり、各観察は状態コード、その命名法とその根拠を報告し、最後に各状態にはバイタルサイン、その命名法、測定単位と値があります。私の知る限りでは、各エントリは ReportId、EvtDateTime、ConditionCode、Basis、VitalSignCode によって一意に識別されます。さらに、データを次のクラスターとして書き込みたいと考えています。ConditionCode、VitalSignCode、ReportId、EventDateTime、Basis

そこで、別のデータベースとテーブルを作成しました(ディスク容量の制約のためにこれを行うと、同じデータベースにテーブルを作成できます)

        dbSendStatement(SQLiteConn2, "CREATE TABLE VSReports (ReportId bigint Not Null, EvtDateTime text, ConditionCode text, Basis text, ConditionLabel text, VitalSignCode text, VitalSignLbl text, VSUnit text, VSValue text, PRIMARY KEY (ConditionCode, VitalSignCode, ReportId, EvtDateTime, Basis));")

現在、データベースに対して選択クエリを実行しています

dbGetQuery(SQLiteConn, "SELECT * 
    FROM (SELECT MIN(ROWID) as Keep, MAX(ROWID) as Rmove, COUNT(ROWID) as Fltr 
        FROM VSReports
        GROUP BY  ConditionCode, VitalSignCode, ReportId, EventDateTime, Basis) as InnerQ
    WHERE Fltr >1
    Limit 1;")

これまでのところ、これは何の利益も生み出していません。完了するまでに 1 ~ 2 日かかる可能性があります。ただし、主キー テーブルに古いテーブルを入力しようとすると、すぐにエラーになります。

dbSendStatement(SQLiteConn2, "ATTACH DATABASE 'C:/Temp/Old.db' as Priordb;"
dbSendStatment(SQLiteConn2, "INSERT INTO VSReports SELECT * FROM Priordb;"

UNIQUE CONSTRAINT が失敗したと受け取りました。ただし、テーブルを次のように変更すると

           dbSendStatement(SQLiteConn2, "CREATE TABLE VSReports (ReportId bigint Not Null, EvtDateTime text, ConditionCode text, Basis text, ConditionLabel text, VitalSignCode text, VitalSignLbl text, VSUnit text, VSValue text , UnqId as bigint, PRIMARY KEY (ConditionCode, VitalSignCode, ReportId, EvtDateTime, Basis, UnqId ));")

それで

dbSendStatment(SQLiteConn2, "INSERT INTO VSReports SELECT * , ROWID AS UnqId  FROM Priordb;")

その後、データ転送が開始されます。
明らかに、Priordb の ROWID には UNIQUE 制約があります。
しかし、複数列の PRIMARY KEY の目的は、値の組み合わせによって一意の識別子を生成することだと思いました。

  1. 主な目標は、データのディスク クラスタ パーティション分割であるため、このダミー機能を最後に追加する必要がある場合は追加します。ただし、これには少なくとも 2 つのデータ テーブルの母集団が含まれます。しかし、私はそれを持たないことを好みます。

  2. 特に UNIQUE 要素なしでこの PRIMARY KEY を構成できますか?

  3. この UNIQUE 要素を動的に生成して、DB の初期作成をスキップして ROWID を取得することはできますか?

4

0 に答える 0