ホームページ >データベース >mysql チュートリアル >SQL Server で 7374 行の制限を超えた行を効率的に選択するにはどうすればよいですか?

SQL Server で 7374 行の制限を超えた行を効率的に選択するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-30 20:26:19572ブラウズ

How to Efficiently Select Rows in SQL Server Beyond the 7374 Row Limit?

SQL Server での行の選択: 7374 行を超える大きな数値の処理

sys.all_columns テーブルから ROW_NUMBER 関数を使用して行を取得しようとすると、制限が発生する場合があります。 。 7374 行以降、クエリは突然終了します。これは、sys.all_columns で使用可能な最大行数に達したためです。

大きな数値を生成するためのカスケード CTE

この制限を克服するには、カスケードを利用できます。 CTE は、「数値テーブル」または「集計テーブル」を作成します。このアプローチは、連続する整数のテーブルを生成する最も効率的な方法と考えられています。次のスニペットは次のことを示しています。

DECLARE @Range AS INT = 7374

;WITH E1(N) AS( -- 10 ^ 1 = 10 rows
    SELECT 1 FROM(VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))t(N)
),
E2(N) AS(SELECT 1 FROM E1 a CROSS JOIN E1 b), -- 10 ^ 2 = 100 rows
E4(N) AS(SELECT 1 FROM E2 a CROSS JOIN E2 b), -- 10 ^ 4 = 10,000 rows
E8(N) AS(SELECT 1 FROM E4 a CROSS JOIN E4 b), -- 10 ^ 8 = 10,000,000 rows
CteTally(N) AS(
    SELECT TOP(@Range) ROW_NUMBER() OVER(ORDER BY(SELECT NULL))
    FROM E8
)
SELECT * FROM CteTally

説明

CTE E1 は 10 行の開始点として機能します。後続の CTE (E2、E4 など) はクロス結合を実行して行数を 10 倍します。このカスケード アプローチにより、膨大な数の行を効率的に生成できます。

無限再帰回避

最大再帰に関連するエラーを防ぐために、最大再帰の深さを次のように指定できます。 Options 句の 0:

OPTION (MAXRECURSION 0)

これは、実行を完了するために必要な深さを無制限に使用するようにクエリ オプティマイザーに指示します。

パフォーマンスに関する考慮事項

再帰的アプローチは簡単ですが、特定のシナリオでは時間がかかる場合があります。より最適化されたソリューションについては、次のような他のメソッドの使用を検討してください。

  • NUMERIC_TABLE() 関数 (Azure SQL Database および SQL Server 2022 以降)
  • 再帰ストアド プロシージャ (SQL) Server 2000 以降)
  • シードとインクリメントを含む ID 列 (SQL Server 2005 以降)

結論

カスケード CTE 手法を活用するか、代替方法を検討することにより、SQL Server で大量の行を効率的に選択できます。 sys.all_columns テーブルで発生する制限。

以上がSQL Server で 7374 行の制限を超えた行を効率的に選択するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。