Atsushi2022の日記

データエンジニアリングに関連する記事を投稿してます

SQLでの計算量(Big O)

O(1) オーダー

  • テーブルから任意の1行を取り出す
  SELECT TOP 1 * FROM table;

O(log N) オーダー

  • インデックスが張られた列に対してのWHERE句による抽出

O(log N)なので、テーブルサイズが大きくなっても、あまり時間計算量は増えない

O(N) オーダー

以下の場合は、行数に対して線形的に時間計算量が増加する

  • 全行SELECTする
  • WHERE句を使用して抽出する。※インデックスがない場合にO(N)
  • count(*)でテーブルの行数をカウントする

O(N log N) オーダー

  • ORDER BY句によるソート

O(N2) オーダー

以下の場合は、行数に対して多項式的に時間計算量が増加する(激増する)。

  • テーブルの結合
    • テーブルAの各行に対して、テーブルBの各行を結合させるため

但し、結合のアルゴリズムによっては以下の計算量になる。

  • ハッシュ結合
    • O(M+N)
  • マージ結合
    • O(M+N)
    • O(M log M + N log N)
    • O(M + N log N)
  • ネストされた結合
    • O(N2)

参考

How To Write Better SQL Queries: The Definitive Guide – Part 2

Understanding Algorithmic Time Efficiency in SQL Queries

Big-O Cheat Sheet