1

ピボット テーブルと分析を行うために Excel に入力する必要がある大規模なデータ セットがあります。

データが 100 万行に達することはないので、通常はこれを行うことができます。SQL Server データのインポートを実行し、SQL ステートメントを指定するだけです。

ここに私の現在のSQLがあります

WITH n AS (
    Select A1.AccountID, A1.ParentAccountID, A1.Name
    FROM Account AS A1
    WHERE A1.ParentAccountID = 92
UNION ALL
    SELECT A2.AccountID, A2.ParentAccountID, A2.Name
    FROM Account AS A2
    JOIN n
    ON A2.ParentAccountID=n.AccountID
)
select n.*, D.DeviceID, A.*, P.*
FROM n
LEFT OUTER JOIN
    Device AS D
    ON D.AccountID = n.AccountID
LEFT OUTER JOIN
    Audit as A
    ON A.AccountID = n.AccountID
RIGHT OUTER JOIN
DeviceAudit As P
ON P.AuditID = A.AuditID
WHERE A.AuditDate > CAST('2013-03-11' AS DATETIME)
ORDER BY n.AccountID ASC, P.DeviceID ASC, A.AuditDate DESC

これは今、私が必要としているものの 100% を私に返しています。過去 30 日間で 1,800 万件のレコード。次の 100,000 または 500,000 レコードを見つける簡単な方法があることを期待していました。

最初のチャンクを取得するために使用できますが、使用TOP 100000できるオフセットがないようです。

現在、これは実行され、20 分で完了します。これは、これを実行しなければならない多くのアカウント階層の 1 つです。願わくば、このページネーションが CPU に関して高すぎないことを願っています。

インポートすることを期待して CSV にエクスポートしようとしましたが、12GB の csv ファイルしか得られず、分解する時間がありません。

4

1 に答える 1

0

はい、SQL 2005 以降、行番号に対してページ分割されたサブクエリを実行できます。元のクエリの select 句に行番号を追加します。

, ROW_NUMBER() OVER (ORDER BY {whatever id}) AS row

次に、古いクエリをサブクエリにして、行に対してクエリを実行できます。

SELECT TOP {results per page} *
FROM ({your previous sql statement})
WHERE row > {page# * results per page}
于 2013-04-15T14:29:50.510 に答える