データ基盤

ORCとは|1項目だけ読むと触る量は3.0倍違い、区切りが合えば36.5分の1になった

何を知ったうえで詰めるのか項目を絞るとどれだけ減るのか読み飛ばしはどう効くのか

20万件から1項目だけ読む場合、行ごとに持つ形は2.3MB、列ごとなら0.8MBでした。

さらに区切りが合えば、30日ぶんを読むのに36.5分の1まで絞れます。2つは掛け算になります。

この記事の要点

  • 1項目で3.0倍
  • 3項目で1.7倍
  • 区切りで36.5分の1
  • 全項目・全期間なら1.0倍

型を知っているので、詰め方を項目ごとに選べる

自らの形を持ち歩き、型に合わせて詰めます。だから読む側は別の情報を要りません。

ORCの位置づけは、公式の1文にあります。ORCは、自らを説明し、型を知っている、列ごとのファイル形式であり、大規模な処理の作業負荷のために設計されたという記述です。

「自らを説明する」ので、別に形の定義を持ち回らずに読めます

「型を知っている」ことの効果も明記されています。ORCのファイルは型を知っているので、書く側はその型に最も適した符号化を選び、書きながら内部の索引を作るという説明です。

形を別に持つ方式との違い

  1. 形を持ち回らない。ファイルだけで読める
  2. 型ごとに詰め方を選べる。数値と文字で別の方法が使える
  3. 索引を書きながら作る。読むときの絞り込みに使える
  4. その分だけ書くのが重い。索引と統計を作る手間がかかる

1番目は、形を別に持つ方式との違いです。その方式の計測はAvroの記事にあり、書いたものを読むときにも形が要る前提でした。

4番目が代償になります。書く側で索引を作るぶん、書き込みは重くなります

どこで使うか

書くのが重く読むのが軽い形なので、一度書いて何度も読む用途に向きます。

逆に、1件ずつ足していく用途には向きません。索引と統計を作り直すことになるためです。

出典Apache ORC 公式ドキュメント2026-08-18 確認
ORC is a self-describing type-aware columnar file format designed for Hadoop workloads.
原文Apache ORC 公式ドキュメント この内容の有効期限2027-02-18

1項目だけ読むと触る量は3.0倍違う

列ごとに並んでいるので、使う項目だけを読めます。全項目を使えば差は消えます。

ORCでは、書きながら索引が作られます。公式はORCのファイルは型を知っているので、書く側はその型に最も適した符号化を選び、書きながら内部の索引を作ると述べています。

並びは列ごとです。使う項目だけを読めることになります。その差を数えました。

読む項目の数を変える

text
注文の記録 200,000件。行ごとに並べると1件 12バイト・合計 2.3MB
一部の項目だけを読むとき、実際に触る量を比べる

読む項目            行ごと(触る量)  列ごと(触る量)  比
金額だけ                           2.3MB             0.8MB    3.0倍
金額と日                           2.3MB             1.1MB    2.0倍
分類と金額と日                        2.3MB             1.3MB    1.7倍
全部                             2.3MB             2.3MB    1.0倍

1項目なら3.0倍の差です。行ごとの側は、どの行でも2.3MBのまま変わりません。

全部を読むと1.0倍です。列ごとに並べる利点が消えます。

読む項目が増えるほど、列ごとに並べる利点が薄れる。

金額だけ列ごとに触る量0.8行ごとなら余分に触る量1.52.3MB分類と金額と日1.312.3MB全部2.32.3MB20万件・12バイトの行での実測。行ごとに並べた場合はどの棒でも合計2.3MBになる。
図1 ── 読む項目の数と、触る量

型ごとの詰め方が効く場面

この計測には、型ごとの詰め方の効果が入っていません。同じ幅の値として数えています。

実際には、同じ値が続く列や、狭い範囲に収まる数値の列でさらに小さくなります。列ごとに並んでいれば、同じ種類の値が隣り合うためです。

その効果の大きさは中身によります。分類のような繰り返しの多い列で大きく、識別子のような全部違う列では小さくなります。

出典Apache ORC 公式ドキュメント2026-08-18 確認
Because ORC files are type-aware, the writer chooses the most appropriate encoding for the type and builds an internal index as the file is written.
原文Apache ORC 公式ドキュメント この内容の有効期限2027-02-18

絞る条件が並びと合っていなければ、索引は効かない

索引はかたまりを飛ばすために使われます。飛ばせるかどうかは、並びと条件の関係で決まります。

ORCの索引は、読むかたまりを決めるのに使われます。公式は条件の押し下げはそれらの索引を使って、ある問い合わせのためにファイルのどのかたまりを読む必要があるかを判断する。行の索引は、探索を1万行の特定の集合まで狭められると述べています。

1万行まで狭められるのは、その条件に合う行がかたまっている場合です。散らばっていれば飛ばせません。

区切りが合った場合の効き目

同じ考え方を、置き場所の区切りで測った結果があります。3年ぶんから期間で絞る場面です。

text
3年ぶん(1095日)・1日 8MB。合わせて 8,760MB
期間で絞る問い合わせに対し、区切り方を変えて読む量を見る

区切り方                1日ぶん        7日ぶん       30日ぶん      365日ぶん     1095日ぶん
区切らない                8,760MB     8,760MB     8,760MB     8,760MB     8,760MB
年で区切る                2,920MB     2,920MB     2,920MB     2,920MB     8,760MB
月で区切る                  243MB       243MB       243MB     2,920MB     8,760MB
日で区切る                    8MB        56MB       240MB     2,920MB     8,760MB

30日ぶんを読む場合、月で区切っていれば36.5分の1です。区切らなければ全部を読みます。

最終列を見てください。全期間を読む問い合わせでは、どの区切り方でも同じです。

2つの絞り込みは掛け算になる

項目の絞り込みと、かたまりの読み飛ばしは別々に効きます

1項目だけを、30日ぶんに絞って読むなら、3.0倍と36.5倍の掛け算になります。

逆に、全項目を全期間ぶん読む問い合わせではどちらも効きません。この形式を選んだ意味がなくなります。

余談 この計測での注意

実在のORCの実装は使わず、列ごとと行ごとの並べ方をその場で作って触る量を数えています。型ごとの符号化や圧縮の効きは含めていないため、実際のORCはここより小さくなります。区切りによる絞り込みの計測も、置き場所を期間で区切った場合の計算で、ファイルの中のかたまりを飛ばす仕組みとは別物です。ここで見せているのは、項目の絞り込みとかたまりの読み飛ばしが掛け算になるという関係です。

出典Apache ORC 公式ドキュメント2026-08-18 確認
Predicate pushdown uses those indexes to determine which stripes in a file need to be read for a particular query and the row indexes can narrow the search to a particular set of 10,000 rows.
原文Apache ORC 公式ドキュメント この内容の有効期限2027-02-18

よくある質問

ORCは何を知ったうえで詰めますか
型です。型を知っているので、その型に最も適した詰め方を書く側が選べると説明されています。
項目を絞るとどれだけ減りますか
1項目だけなら触る量が3.0倍違いました。3項目なら1.7倍です。
読み飛ばしはどう効きますか
内部の索引で、読む必要のあるかたまりを絞れます。区切りが合えば36.5分の1になりました。
効かない場合はありますか
全項目を全期間ぶん読む場合です。どちらの絞り込みも働かず、1.0倍になります。

まとめ

  • 型を知って詰め方を選ぶ
  • 使う項目だけ読める
  • 索引でかたまりを飛ばせる
  • 2つの絞り込みは掛け算

今日から始められること

  1. よく使う集計が触る項目を数える
  2. 絞る条件が並び順と合っているか確かめる
  3. 読んだ量を記録する
  4. 全項目を読む問い合わせを探す

実務で組んだORCのワークフローには、値段が付きます

同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。

出品の仕組みを見る