【実務・中級編】Notionの動作が重いときの原因と対策:ページの軽量化とデータベース最適化の極意 – プロジェクト・ナレッジ管理活用バイブル

Notionが重いという「開発の負債」を断ち切れ:ベロシティを極限まで引き上げるデータベース最適化と軽量化の極意

テックリードの仕事は、コードのパフォーマンスチューニングだけではない。開発チームの認知負荷を下げ、情報の流通速度(ベロシティ)を最大化することも、極めて重要なエンジニアリングだ。

そのインフラとしてNotionを採用しているチームは多い。しかし、運用が半年を過ぎた頃から、決まってこんな悲鳴が聞こえてくる。

> 「Notionのページを開くだけで数秒固まるんだが……」
> 「データベースのフィルターをかけた瞬間にフリーズしてコーヒーを淹れに行ける」
> 「検索が使いものにならない」

これはツールの限界ではない。ドキュメント設計の技術的負債が蓄積しているだけだ。Notionは適切に構造化すれば爆速で動く。本記事では、Notionの動作を劇的に改善し、開発チームの生産性を限界突破させるための実践的な最適化手法を、プロの知見を交えて徹底解説する。

—

1. なぜNotionは「重く」なるのか?(真の原因特定)

Notionが重くなるメカニズムは、Webアプリケーションのアンチパターンそのものだ。主な原因は以下の3つに集約される。

1. インラインデータベースの乱用とリレーションのスパゲッティ化
1つのページに何個もインラインデータベースを置き、かつそれらが相互に複雑なリレーション(双方向リンク)を結んでいる場合、Notionはクライアントサイド(ブラウザ)で膨大なクエリと再描画の計算を強いられる。
2. 未圧縮の巨大アセットと無限ネストのトグルリスト
数MBもあるスクリーンショットの直貼り、そして深さ10層を超えるトグルリストのDOMツリーは、メモリを確実に圧迫する。
3. 「ゴミ箱」と「バージョン履歴」の肥大化
削除された膨大なブロックや、すべての変更履歴の差分がバックグラウンドで保持され続けている。

—

2. ページの軽量化とデータベース最適化の極意

ここからが本題だ。明日からチームで実践できる具体的なチューニング手法を示す。

① インラインデータベースを「フルページ」へ逃がす

ページ内にインラインデータベースを埋め込むのは、初期表示のパフォーマンスにおいて最悪の選択だ。

  • 対策: 詳細なデータを扱うデータベースは「フルページ(Full Page)」として独立させ、親ページからはリンクドビュー(Linked View)として最小限のプロパティ(例: ステータス、担当者のみ)で表示する。これだけで初期ロードのペイロードを劇的に削減できる。

② フィルターとソートの最適化(LIMIT的発想)

データベースのビューで、初期表示時に「すべてのアーカイブ済みタスク」を読み込ませていないか?

  • 対策:
  • フィルターには必ず `Status != Done` や `Created within the last 30 days` のような条件の絞り込みを入れる。
  • 表示件数(Load limit)をデフォルトの10件〜25件に制限し、「さらに読み込む」を活用する。

③ プロパティの断捨離(不要なロールアップの排除)

リレーション先のデータベースから、さらに別のデータベースの値を引っ張ってくる「ロールアップ(Rollup)」や「フォーミュラ(Formula)」の多用は、クエリの実行コストを跳ね上げる。

  • 対策: チームで定期的にデータベースのスキーマレビューを行い、直近3ヶ月使われていないプロパティは容赦なく削除(あるいはアーカイブ)する。

—

3. 開発スピードを劇的に高める神ショートカット&プラグイン

エディタとしての手を動かす速度を上げることは、コンテキストスイッチの削減に直結する。

開発者が覚えるべき「隠れたキーワード&ショートカット」

  • `Ctrl` + `P` (Macは `Cmd` + `P`): クイック検索(Quick Find)。マウスを一切使わずに目的のドキュメントへ瞬間移動する。
  • `/` + 欲しい要素の頭文字: ブロック挿入メニュー。例えば `/code` でコードブロック、`/syn` でシンクブロックをノータイムで呼び出す。
  • `Ctrl` + `Shift` + `L` (Macは `Cmd` + `Shift` + `L`): ダークモード切替。夜間のコーディングやドキュメント作成時の眼精疲労を防ぐ。

導入必須のブラウザ拡張機能

  • Notion Boost (Chrome Extension):

ページの横幅を自動で全画面(Full width)にしたり、テーブルに行番号を表示したり、目次(Table of Contents)をサイドバーに常駐させたりする神プラグイン。UIの無駄なレンダリング待ちをハックできる。

—

4. チーム開発で絶対守るべき「設定の共有化ルール」

属人化したNotionスペースは、必ずゴミ屋敷と化す。チーム全体で以下のガバナンスを効かせよ。

1. 「シンクブロック(Synced Blocks)」のルール化
共通のヘッダーや注意書きをコピペするのは厳禁。変更漏れやデータ容量の肥大化を招く。必ずシンクブロックを親ページとして一元管理する。
2. アーカイブ・ライフサイクルポリシーの策定
「完了したプロジェクトのタスクDB」は、四半期ごとにCSVエクスポートした上でページごとアーカイブ(または削除)する。Notionを「永久保存のゴミ捨て場」にしない。
3. 画像・動画のレギュレーション
スクリーンショットを貼る際は、必ず事前に圧縮ツール(TinyPNGなど)を通すか、Lighterな外部ストレージ(S3やCloudinaryなど)のリンクとして貼る。

—

5. 【実践】Notionインテグレーション・自動化設定ファイル例

Notionの動作が重くなる前に、定期的なメンテナンス(古いデータのアーカイブや構造チェック)を人間が手動でするのはコストが高すぎる。Notion APIを用いた自動化スクリプト、またはGitHub Actions等から定期実行するための設定ファイルのベストプラクティスを公開する。

以下は、一定期間更新のないタスクを検知し、Slack等へ通知または自動アーカイブするためのワークフロー定義(GitHub ActionsのYAML形式)のサンプルだ。

name: Notion Database Health Check & Cleanup

毎週月曜日の朝9時に実行し、レガシーなデータの肥大化を防ぐ
on:
schedule:

  • cron: ‘0 0 1’

workflow_dispatch:

jobs:
optimize-notion:
runs-on: ubuntu-latest
steps:

  • name: Checkout Repository

uses: actions/checkout@v4

  • name: Set up Node.js

uses: actions/setup-node@v4
with:
node-version: ’20’

  • name: Run Notion Optimization Script

env:
NOTION_API_KEY: ${{ secrets.NOTION_API_KEY }}
TARGET_DATABASE_ID: ${{ secrets.TARGET_DATABASE_ID }}
run: |
# 依存関係のインストール(公式SDKを使用する想定)
npm install @notionhq/client

# インラインでアーカイブ処理を実行するNodeスクリプト
node -e ‘
const { Client } = require(“@notionhq/client”);
const notion = new Client({ auth: process.env.NOTION_API_KEY });

async function archiveStalePages() {
const databaseId = process.env.TARGET_DATABASE_ID;

// 30日以上更新がなく、かつステータスが「Done」のページをクエリ
const thirtyDaysAgo = new Date();
thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() – 30);

const response = await notion.databases.query({
database_id: databaseId,
filter: {
and: [
{
property: “Status”,
status: { equals: “Done” }
},
{
property: “Last edited time”,
last_edited_time: { on_or_before: thirtyDaysAgo.toISOString() }
}
]
}
});

console.log(`Found ${response.results.length} stale pages to archive.`);

// 該当ページをアーカイブ(archived: true)に更新
for (const page of response.results) {
await notion.pages.update({
page_id: page.id,
archived: true
});
console.log(`Archived page: ${page.id}`);
}
}

archiveStalePages().catch(console.error);
‘

このスクリプトをCI/CDパイプラインや定期実行タスクに組み込むことで、Notionデータベースは常に最小限のフットプリントに保たれ、爆速の動作環境が維持される。

—

結びに代えて

Notionが「重い」と感じたら、それはチームのナレッジ共有のフローが悲鳴を上げているサインだ。

データベースを整理し、インラインの乱用をやめ、適切な自動化を組み込む。たったこれだけのエンジニアリングアプローチを適用するだけで、チームの認知負荷は激減し、開発のベロシティは確実に加速する。

あなたのチームのNotionスペースも、今すぐ「デバッグ」してみてほしい。その変化に、エンジニアなら誰もが歓声を上げるはずだ。

タイトルとURLをコピーしました