SQL-1,000万行以上のテーブルの日時列に基づくデータのパージ

Vsagar

SQL Server 2012を使用していますが、約35列と1,000万行以上のテーブルがあります。ここで、日時スタンプやその他のさまざまなフィルターに基づいてデータのパージを実行したいと思います。

サンプルデータは以下の通りです

ID  DateTimeStamp               value1  value2   value3 .... Value 35
-------------------------------------------------------------------------
2   2016-07-26 15:12:41 0.00    126.20  328051.07
2   2016-07-26 15:14:41 0.00    126.20  328051.07
2   2016-07-26 15:18:17 0.00    126.14  328052.32
2   2016-07-26 15:23:17 0.00    126.75  328054.40
2   2016-07-26 15:24:34 0.00    126.75  328054.40
2   2016-07-26 15:25:18 0.00    126.75  328054.40
2   2016-07-26 15:28:15 0.00    126.95  328060.64
2   2016-07-26 15:29:15 0.00    126.95  328060.64
2   2016-07-26 15:30:15 0.00    126.95  328060.64
2   2016-07-26 15:34:15 0.00    126.95  328060.64

時間間隔に基づいてデータのパージを実行したいのですが、5分の時間間隔を選択した場合、期待される結果セットは次のようになります。

ID  DateTimeStamp               value1  value2   value3 .... Value 35
-----------------------------------------------------------------------
2   2016-07-26 15:12:41 0.00    126.20  328051.07
2   2016-07-26 15:18:17 0.00    126.14  328052.32
2   2016-07-26 15:23:17 0.00    126.75  328054.40
2   2016-07-26 15:28:15 0.00    126.95  328060.64
2   2016-07-26 15:34:15 0.00    126.95  328060.64

必要な日時スタンプが存在しない場合、最も近い値が存在するように発生する必要があります(前または次のいずれか最も近い値を考慮する必要があります)。

以下のロジック(擬似コード)で達成しましたが、非常に遅いです

While(1)
begin
    StartDate = Start date of data purging at first iteration latter on assign it to EndDate in all next iteration 

    EndDate = EndDate + Interval
    NextEndDate  = EndDate + Interval

    Set maxDateTime = Select top(1) * 
                      from <TableName> 
                      where dateTime between StartDate to End Date  
                      order by datetime asc

    Set minDateTime = Select top(1) * 
                      from <TableName> 
                      where dateTime between EndDate to End NextEndDate 
                      order by datetime desc

    Now compare difference and choose the one which is smaller.  
        Diff(maxDateTime, EndDateTime) & Diff (minDateTime, EndDateTime)
end

上記のロジックの効率的なアプローチを誰かが提案できますか

ダン・グズマン

以下は、各5分間隔内の最初の行を除くすべてを削除する例です。この方法では、間隔ごとにループを使用して同時実行性を向上させ、トランザクションログの入力を回避しますが、関係がない場合は、集計テーブル(またはCTE)を使用して間隔を計算する単一のセットベースの操作として実行できます。

DateTimeStampパフォーマンスを向上させるには、左端のキー列としてインデックス(理想的にはクラスター化)を用意することが重要です。

CREATE TABLE dbo.TableName(
      ID  int NOT NULL
    , DateTimeStamp datetime2(0) NOT NULL
    , value1 decimal(18,2) NOT NULL
    , value2 decimal(18,2) NOT NULL
    , value3 decimal(18,2) NOT NULL
)
GO

INSERT INTO dbo.TableName VALUES
     (2, '2016-07-26 15:12:41', 0.00, 126.20, 328051.07)
    ,(2, '2016-07-26 15:14:41', 0.00, 126.20, 328051.07)
    ,(2, '2016-07-26 15:18:17', 0.00, 126.14, 328052.32)
    ,(2, '2016-07-26 15:23:17', 0.00, 126.75, 328054.40)
    ,(2, '2016-07-26 15:24:34', 0.00, 126.75, 328054.40)
    ,(2, '2016-07-26 15:25:18', 0.00, 126.75, 328054.40)
    ,(2, '2016-07-26 15:28:15', 0.00, 126.95, 328060.64)
    ,(2, '2016-07-26 15:29:15', 0.00, 126.95, 328060.64)
    ,(2, '2016-07-26 15:30:15', 0.00, 126.95, 328060.64)
    ,(2, '2016-07-26 15:34:15', 0.00, 126.95, 328060.64);
GO
CREATE CLUSTERED INDEX cdx ON dbo.TableName(DateTimeStamp);
GO

SET NOCOUNT ON;
DECLARE
      @StartDateTimeStamp datetime2(0)
    , @LastDateTimeStamp datetime2(0)
    , @EndDateTimeStamp datetime2(0)
    , @IntervalSeconds int = 300;
SET @StartDateTimeStamp = (SELECT MIN(DateTimeStamp) FROM dbo.TableName);
SET @LastDateTimeStamp = (SELECT MAX(DateTimeStamp) FROM dbo.TableName);

WHILE @StartDateTimeStamp <= @LastDateTimeStamp
BEGIN
    SET @EndDateTimeStamp = DATEADD(second, @IntervalSeconds, @StartDateTimeStamp);

    WITH rows_to_delete AS (
        SELECT ROW_NUMBER() OVER(ORDER BY DateTimeStamp) AS row_num
        FROM dbo.TableName
        WHERE 
            DateTimeStamp >= @StartDateTimeStamp
            AND DateTimeStamp < @EndDateTimeStamp
        )
    DELETE rows_to_delete
    WHERE row_num > 1;

    SET @StartDateTimeStamp = DATEADD(second, @IntervalSeconds, @StartDateTimeStamp);
END;
GO

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

別のテーブルPySpark / SQLの日時列に基づく列の集計

分類Dev

SQLサーバーの2つの列に基づくデータテーブルの分散

分類Dev

SQL Server:他のテーブルに基づくDATEADDバイパス日付

分類Dev

日付に基づいて複数の一時テーブルからデータを選択するSQL

分類Dev

SQLの更新には1,000万レコードの場合4日かかります

分類Dev

列の単一の比較に基づいて、SQLテーブルデータを複数の行から1つの行に変換する方法

分類Dev

個別のテーブル条件に基づくSQL更新列

分類Dev

日時に基づいて複数のテーブルからSQLを選択

分類Dev

T-SQLビュー列に基づくテーブル列の取得

分類Dev

Oracle-列の値に基づいて1つのテーブルから別のテーブルにデータをビニングするSQLクエリ?

分類Dev

Oracle-列の値に基づいて1つのテーブルから別のテーブルにデータをビニングするSQLクエリ?

分類Dev

EFは、500万行のSQLiteテーブルの100万行を更新するために必要なSQLをどのように作成しますか?行を1つずつ更新しますか?

分類Dev

複数行のデータに基づくSQLフィルター

分類Dev

SQL-SAP HANA-列テーブルの最初のエントリのみを使用します(日付/時刻に基づく)

分類Dev

1000万行のテーブルでのSQLクエリの最適化:終わりのないクエリ

分類Dev

別のテーブルの値に基づくSQLクエリ

分類Dev

他のテーブルの数に基づくSQL表示

分類Dev

列の複数の異なる値に基づくSQLフィルター行

分類Dev

日付に基づいて複数のSQLテーブルデータを比較する

分類Dev

SQLクエリ:各列の値は、一時テーブルの異なるフィルターに基づく誇張です。

分類Dev

1つの列値に基づいてSQLテーブルの複数の行を結合します

分類Dev

ゼロに基づいてSQLテーブルの行をマージする

分類Dev

SQL-テーブルの行を列の値に基づくラグ関数と比較する

分類Dev

sql-left-outer-join-行あり-右側のテーブルの列値に基づく

分類Dev

sql-left-outer-join-行あり-右側のテーブルの列値に基づく

分類Dev

パターンに基づくSQLテーブル

分類Dev

ドライバテーブルの複数行のデータに基づいてターゲットテーブルの行を選択するSQL

分類Dev

他のテーブルに基づくSQLクエリ

分類Dev

同じテーブル内の以前のデータに基づいてSQLテーブルを更新する方法

Related 関連記事

  1. 1

    別のテーブルPySpark / SQLの日時列に基づく列の集計

  2. 2

    SQLサーバーの2つの列に基づくデータテーブルの分散

  3. 3

    SQL Server:他のテーブルに基づくDATEADDバイパス日付

  4. 4

    日付に基づいて複数の一時テーブルからデータを選択するSQL

  5. 5

    SQLの更新には1,000万レコードの場合4日かかります

  6. 6

    列の単一の比較に基づいて、SQLテーブルデータを複数の行から1つの行に変換する方法

  7. 7

    個別のテーブル条件に基づくSQL更新列

  8. 8

    日時に基づいて複数のテーブルからSQLを選択

  9. 9

    T-SQLビュー列に基づくテーブル列の取得

  10. 10

    Oracle-列の値に基づいて1つのテーブルから別のテーブルにデータをビニングするSQLクエリ?

  11. 11

    Oracle-列の値に基づいて1つのテーブルから別のテーブルにデータをビニングするSQLクエリ?

  12. 12

    EFは、500万行のSQLiteテーブルの100万行を更新するために必要なSQLをどのように作成しますか?行を1つずつ更新しますか?

  13. 13

    複数行のデータに基づくSQLフィルター

  14. 14

    SQL-SAP HANA-列テーブルの最初のエントリのみを使用します(日付/時刻に基づく)

  15. 15

    1000万行のテーブルでのSQLクエリの最適化:終わりのないクエリ

  16. 16

    別のテーブルの値に基づくSQLクエリ

  17. 17

    他のテーブルの数に基づくSQL表示

  18. 18

    列の複数の異なる値に基づくSQLフィルター行

  19. 19

    日付に基づいて複数のSQLテーブルデータを比較する

  20. 20

    SQLクエリ:各列の値は、一時テーブルの異なるフィルターに基づく誇張です。

  21. 21

    1つの列値に基づいてSQLテーブルの複数の行を結合します

  22. 22

    ゼロに基づいてSQLテーブルの行をマージする

  23. 23

    SQL-テーブルの行を列の値に基づくラグ関数と比較する

  24. 24

    sql-left-outer-join-行あり-右側のテーブルの列値に基づく

  25. 25

    sql-left-outer-join-行あり-右側のテーブルの列値に基づく

  26. 26

    パターンに基づくSQLテーブル

  27. 27

    ドライバテーブルの複数行のデータに基づいてターゲットテーブルの行を選択するSQL

  28. 28

    他のテーブルに基づくSQLクエリ

  29. 29

    同じテーブル内の以前のデータに基づいてSQLテーブルを更新する方法

ホットタグ

アーカイブ