SQL クエリの最適化: タイミングを考慮して実行プランを読み取り、遅いクエリを修正する
クエリが遅い理由を推測するのはやめましょう。実行計画を読み取り、実際の 100 万行のテーブルからの前後の測定値を使用して、最も重要な修正を適用する方法を学びます。
- 実行計画から始めます。データベースが実際に何をしているのかがわかります。
- 大きなテーブルでフル スキャンを探し、フィルターと結合に一致するインデックスを追加します。
- 効率的なインデックスの使用が停止される可能性があるため、関数内でインデックス付き列をラップすることは避けてください。
- すべてのデータベースとデータセットの動作が異なるため、前後を測定します。
昨年は数ミリ秒かかっていたクエリが、今日では数分かかる場合があります。これは単にテーブルが大きくなったためです。 SQL クエリの最適化 は、巧妙なトリックではなく、反復可能なプロセスに重点を置いています。つまり、データベースが何を行っているかを調べ、無駄な作業を削除し、それが役に立ったかどうかを確認します。
SQLite 3.50 で生成された 100 万行に対して、以下の各手法をテストしました。タイミングは、メモリ内データベースを使用して 1 台のラップトップから複数回実行したうちの最良の値です。これらはご使用のシステムと一致せず、PostgreSQL、MySQL、SQL Server にはそれぞれ独自のオプティマイザーとプラン形式があります。それぞれの改善の規模とその背後にある原則に注目してください。
一目でわかる結果
| テクニック | 以前 | 後 |
|---|---|---|
| フィルター列のインデックス | 73ミリ秒 | 0.01ミリ秒 |
| 列の関数ではなく範囲 | 96ミリ秒 | 33ミリ秒 |
| 2 つのフィルターの複合インデックス | 19ミリ秒 | 2.2ミリ秒 |
| 深いオフセットではなくキーセット | 8.1ミリ秒 | 0.01ミリ秒 |
テストのセットアップ
CREATE TABLE customers (
id INTEGER PRIMARY KEY, name TEXT, city TEXT
);
CREATE TABLE orders (
id INTEGER PRIMARY KEY, customer_id INT, status TEXT,
created TEXT, total INT, note TEXT
);
-- 50,000 customers and 1,000,000 orders with random values
シンプルな最適化プロセス
- 重要なクエリを見つけます。 遅いクエリのログまたはモニタリングを使用します。 1 分間に 1,000 回実行される 200 ミリ秒のクエリは、10 秒の月次レポートよりも重要な場合があります。
- 計画を読んでください。 データベースが実際に何をしているのかを確認してください。
- 1 つ変更します。 インデックスを追加するか、クエリの一部を書き換えます。
- 現実的なデータに基づいて 再測定。 100 個のテスト行に関する計画では、100 万個についてはほとんどわかりません。
- 時間をかけて観察してください。 データが増加し、統計が変化すると、計画が変更される可能性があります。
実行計画を読む
実行プランは、クエリを実行するためのデータベースの段階的な戦略であり、使用するインデックスやテーブルを結合する順序なども含まれます。クエリを参照するには、クエリにプレフィックスを付けます。
| データベース | コマンド |
|---|---|
| SQLite | 説明クエリプラン選択 ... |
| PostgreSQL | 説明分析選択... |
| MySQL | EXPLAIN SELECT ...、またはEXPLAIN ANALYZE |
| SQLサーバー | SSMS での実際の実行計画 |
PostgreSQL の EXPLAIN ANALYZE は実際にクエリを実行するため、UPDATE または DELETE と一緒に使用する場合は注意してください。最初に探すべきものは次のとおりです。
| わかりますか | 意味 | 通常 |
|---|---|---|
| スキャンまたはシーケンススキャン | テーブル全体を読み取ります | 大きなテーブルに関する懸念 |
| 検索またはインデックスシーク | 一致する行にジャンプします | 良い |
| カバリングインデックス | インデックスのみからの回答 | とても良い |
| 一時 B ツリーまたはソート | 余分な仕分け作業 | チェックする価値があります |
フルスキャンは自動的に問題になるわけではありません。クエリに小さなテーブルの大部分が必要な場合は、スキャンが最も速い選択肢になります。 PostgreSQL の EXPLAIN ANALYZE では、推定行と実際の行も比較します。大きな違いは、多くの場合、テーブル統計が古いことを意味します。
適切なインデックスを追加する
このクエリは 1 人の顧客の注文を検索します。
SELECT id, total FROM orders WHERE customer_id = 123;
インデックスを追加する前の計画はフル スキャンでした。
SCAN orders
-- 20 rows in 73 ms
次に、フィルター列にインデックスを追加しました。
CREATE INDEX idx_orders_customer ON orders(customer_id);
SEARCH orders USING INDEX idx_orders_customer (customer_id=?)
-- 20 rows in 0.01 ms
データベースがそれらを見つけるために 100 万行を読み取る必要がなくなったため、同じ 20 行が何千倍も速く返されます。この記事の他のテクニックでは、これ以上の勝利をもたらしたものはありません。特に結果を数行に絞り込む場合、最初の候補としては、WHERE、JOIN、および ORDER BY で使用される列が適しています。 SQL インデックス のガイドでは、その仕組みについて説明しています。
インデックス付き列を関数内でラップしないでください
created のインデックスを使用して 3 月の注文を検索する 2 つの方法を次に示します。
-- Function on the column
SELECT id FROM orders WHERE substr(created, 1, 7) = '2026-03';
-- SCAN orders USING COVERING INDEX idx_orders_created
-- 84,961 rows in 96 ms
-- Plain range
SELECT id FROM orders
WHERE created >= '2026-03-01' AND created < '2026-04-01';
-- SEARCH orders USING COVERING INDEX idx_orders_created (created>? AND created<?)
-- 84,961 rows in 33 ms
どちらも同じ行を返しますが、最初の行は約 3 倍の時間がかかりました。この計画はその理由を示しています。列に関数を使用すると、データベースは並べ替えられたインデックス内の位置にジャンプできないため、すべてのエントリを SCAN 実行する必要があります。範囲バージョンは SEARCH 正しい場所にまっすぐ移動できます。このようにインデックスを使用できる条件は、sargable と呼ばれます。
次の一般的なパターンでも同じ問題が発生します。
| 避ける | 好む |
|---|---|
WHERE 年(作成年) = 2026 |
WHERE 作成日 >= '2026-01-01' AND 作成日 < '2027-01-01' |
WHERE 価格 * 2 > 100 |
WHERE 価格 > 50 |
WHERE LOWER(電子メール) = 'a@b.com' |
関数ベースのインデックス、または大文字と小文字を区別しない照合順序 |
WHERE 名は「%99」のようなもの |
前方一致検索または全文検索 |
最後のものも確認しました。最初の文字からソートされたインデックスは最後の一致には役に立たないため、先頭のワイルドカード SCAN customers が生成されます。
複合インデックス
クエリが 2 つの列でフィルタリングする場合、単一列のインデックスはジョブの一部のみを実行します。
SELECT id FROM orders
WHERE status = 'paid'
AND created >= '2026-03-01' AND created < '2026-03-08';
-- Using only the created index: 6,198 rows in 19 ms
CREATE INDEX idx_status_created ON orders(status, created);
-- SEARCH orders USING COVERING INDEX idx_status_created
-- (status=? AND created>? AND created<?)
-- 6,198 rows in 2.2 ms
列の順序は非常に重要です。 (status, created) のインデックスは、姓、名の順に並べ替えられた電話帳のように機能します。姓のみを検索することはできますが、名のみを検索することはできません。 status に対するクエリだけでも、このインデックスを使用できます。一般に、created のみでフィルタリングすると、それを効率的に使用できません。経験則として、最初に等価性をテストする列を配置し、その後に範囲列を配置します。
この計画には インデックスをカバー とも記載されています。これは、インデックスがクエリに必要なすべてを保持しているため、テーブル自体を読み取る必要がないことを意味します。必要な列のみを選択すると、この可能性が高くなります。これが SELECT * を避けるもう 1 つの理由です。
ページネーションの高速化
深いページに OFFSET を使用すると、データベースはスキップされたすべての行を通過する必要があるため、隠れたコストがかかります。
-- Page deep into the results
SELECT id FROM orders ORDER BY id LIMIT 20 OFFSET 500000;
-- 8.1 ms
-- Keyset pagination: continue from the last id seen
SELECT id FROM orders WHERE id > 500000 ORDER BY id LIMIT 20;
-- 0.01 ms
キーセットのページネーションは、どれだけ深く進んでも高速なままです。また、新しいデータが追加されたときにページ間で行が移動することも避けられます。その代償として、ユーザーは 5,000 ページに直接ジャンプすることができませんが、これは実際のニーズであることはほとんどありません。幅の広い行があるテーブル、またはスキップする行が多いテーブルでは、ギャップがテストの場合よりもはるかに大きくなる可能性があります。
ヒント: タイミングは、アイドル状態のマシンで一度に 1 つのクエリを測定します。実際の負荷の下では、非効率なクエリはより大きな損害を与えます。これは、クエリがロックを保持し、メモリ、ディスク、CPU を他のものと競合するためです。
より無駄のないクエリを作成する
- 必要な列のみを選択してください。
SELECT *はより多くのデータを送信するため、インデックスがクエリをカバーできなくなる可能性があります。 - 早期にフィルタリングします。 グループ化する前に行を削除するには
WHEREを使用し、集計の条件にのみHAVINGを使用します。 SQL GROUP BY および HAVING を参照してください。 - 数行しか必要ない場合は、LIMIT を使用します。
- 重複を削除する必要がない場合は、UNION ALLを推奨します。 UNION vs UNION ALL テストでは、何が節約できるかを示しています。
- 不必要な DISTINCT は避けてください。 重複を生成する結合が隠蔽されることがよくあります。
- 存在チェックには EXISTS を使用します。SQL サブクエリのガイドで説明されているように、最初の一致で停止する可能性があります。
- N+1 クエリを監視します。 ループ内の行ごとに 1 つのクエリがあり、通常はアプリケーション コードによって引き起こされ、実際の問題となることがよくあります。単一の結合またはバッチ クエリで、数百回のラウンド トリップを置き換えることができます。
結合します
結合する列にインデックスを付けます。ある都市の顧客を対象に総支出レポートを実行しました。その計画はまさに期待どおりのものでした。
SELECT c.name, SUM(o.total)
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE c.city = 'Goa'
GROUP BY c.id;
-- SCAN c
-- SEARCH o USING COVERING INDEX idx_cover (customer_id=?)
-- 9,900 rows in 34 ms
顧客をスキャンし、インデックスを使用して各顧客の注文を見つけます。 orders.customer_id にインデックスがないと、データベースは顧客ごとにさらに多くの作業を実行する必要があります。外部キーのインデックスは、最も一般的で価値のある追加機能の 1 つです。基本の理解を深めたい場合は、SQL 結合の説明を参照してください。
インデックスにコストがかかる場合
インデックスは無料ではないため、列ごとにインデックスを追加しないでください。
- 書き込みが遅くなります。 挿入、更新、削除のたびに、各インデックスも更新する必要があります。
- ストレージとメモリの追加。 大きなテーブルではインデックスが大きくなる可能性があります。
- 非選択列にはほとんど利点がありません。 ほとんどの行が一致する場合、true または false 列のインデックスは役に立たない可能性があります。
- 冗長性。
(a, b)にすでにインデックスがある場合、(a)のインデックスは多くの場合不要です。
使用状況統計を定期的に確認し、使用していないインデックスを削除します。また、オプティマイザは適切なプランを選択するためにそれらに依存するため、ANALYZE またはデータベースと同等のものを使用して統計を最新に保ちます。遅い部分はクエリではなく競合である場合があります。ロックを保持したまま長時間実行される トランザクション により、高速なクエリが遅く見えることがあります。
よくある間違い
- 測定せずに最適化する。 自信に満ちた推測の多くは、間違っていることが判明します。
- 小さなデータを使用したテスト。 テーブルが大きくなるにつれて、計画とタイミングは劇的に変化します。
- 別のデータベースのヒントを信頼する。 あるエンジンに対するアドバイスは、別のエンジンには当てはまらない場合があります。
- 盲目的にインデックスを追加します。それぞれのインデックスは書き込み速度を低下させます。
- 最初の実行の効果を無視します。 キャッシュにより 2 回目の実行が高速になるため、数回実行します。
まとめ
遅いクエリのほとんどには、インデックスの欠落、列の関数、フェッチされるデータが多すぎるなどの通常の原因があります。今週最も遅い実際のクエリを取り上げ、EXPLAIN を実行して、大きなテーブルのフル スキャンを探します。 1 つの点を修正し、再度測定し、変更した点をメモしておきます。
よくある質問
SQLクエリの最適化とは何ですか?
これは、通常、実行計画を調べ、適切なインデックスを追加し、非効率なクエリを書き直すことによって、クエリの使用時間とリソースを削減するプロセスです。
実行計画とは何ですか?
これは、データベースがテーブルを読み取る方法、使用するインデックス、結合する順序など、クエリを実行するためにデータベースが選択した戦略です。
遅いクエリを見つけるにはどうすればよいですか?
データベースの低速クエリ ログを有効にするか、PostgreSQL の pg_stat_statements などのツールを使用します。次に、合計時間が最も長いクエリに焦点を当てます。
インデックスを追加すると常にクエリが高速になりますか?
いいえ。選択的読み取りには役立ちますが、書き込みが遅くなり、ストレージが使用されます。ほとんどの行が条件に一致する場合、オプティマイザはそれを無視することもあります。
SELECT * はパフォーマンスに悪いですか?
そうかもしれません。不要なデータが転送され、インデックスによるクエリのカバーが停止される可能性があります。通常は、必要な列のみをリストすることをお勧めします。
学び続ける
テスト、WordPress、または SEO についてサポートが必要ですか?
私たちは、チームがより優れたソフトウェアを出荷し、サイトを成長させるのを支援します。あなたが取り組んでいることを教えてください。明確な次のステップを提案します。
詳しいガイドはこちら テスト、AI、最新の開発
この記事は気に入りましたか?トピックを選択して、最新のチュートリアルに直接アクセスしてください。
AI 幻覚の説明: 言語モデルが物事をでっち上げる理由とそれを軽減する方法
AI 幻覚について説明しました。幻覚とは何か、言語モデルが幻覚を生成する理由、一般的な種類、グラウンディングとプロンプトで幻覚を軽減する方法、そして私たちが実行した簡単なチェックです。
記事を読む →DevOps環境変数の説明: .env ファイル、シークレット、および設定が正しく行われている
実行した Python の例を使用して環境変数について説明します。環境変数の読み取りと設定、すべての値が文字列である理由、.env ファイル、プロセスの継承、シークレット、検証について説明します。
記事を読む →ソフトウェア開発API レート制限の説明: アルゴリズム、ヘッダー、および 429 エラーの処理
API レート制限については、実行したシミュレーションで説明します。トークン バケット、固定ウィンドウ、スライディング ウィンドウ、429 応答、レート制限ヘッダー、バックオフによる再試行、およびテスト制限です。
記事を読む →テスト自動化Python でのモッキング:unittest.mock、patch、およびテストを嘘にする間違い
Python でのunittest.mockによるモック、テスト済み: モックとreturn_value、side_effect、名前が使用されている場所のパッチ、仕様と自動仕様、日付のモック、およびよくある間違い。
記事を読む →ソフトウェアテストコードカバレッジの説明: 回線カバレッジとブランチカバレッジ、および 100% の実際の意味
実際のcoverage.pyの実行でコードカバレッジを説明: 行、分岐、条件のカバレッジ、レポートの読み取り、100%のカバレッジでもバグを見逃す可能性がある理由、および賢明なターゲット。
記事を読む →データベースとSQLSQL における DELETE、TRUNCATE、DROP: 違い、ロールバック、およびそれぞれをいつ使用するか
DELETE、TRUNCATE、DROP について、テスト済み SQL を使用して説明します。それぞれの削除内容、ロールバック、トリガー、ID リセット、速度、PostgreSQL、MySQL、SQL Server、SQLite の違いについて説明します。
記事を読む →データベースとSQLSQL ビューの説明: 作成、使用、落とし穴の回避、例を示します
SQL ビューについて、実行したクエリとともに説明しました。ビューの作成、ライブ結果、列の非表示、パフォーマンス、更新可能なビューと具体化されたビュー、壊れた依存関係、ベスト プラクティスについて説明します。
記事を読む →ソフトウェア開発TypeScript インターフェイスと型: 実際の違い、コンパイラでテスト
TypeScript インターフェイスと型、実際のコンパイラでチェック: 両方でできること、片方だけでできること、宣言のマージ、拡張と交差、および従うべき簡単なルール。
記事を読む →ソフトウェア開発Python *args と **kwargs の説明: 柔軟な関数と明確な例
Python の *args と **kwargs について、実行したコードで説明しました。パッキングとアンパッキング、パラメーターの順序、キーワードのみの引数と位置のみの引数、デコレーター、一般的なエラーです。
記事を読む →ソフトウェア開発Python Lambda 関数: 構文、実際の用途、および使用すべきでない場合
Python のラムダ関数について、実行したコードとともに説明します。構文、キーによるソート、マップとフィルター、クロージャー、遅延バインディング トラップ、通常の def がより適切な選択である場合。
記事を読む →人工知能AIエージェントとは何ですか?シンプルなエージェント ループを実行できる仕組み
AIエージェントとは何ですか?エージェント ループ、ツール、メモリ、ガードレール、実行した小さな Python ループ、実際のリスク、およびシンプルなチャットボットがより良い選択である場合についてのわかりやすいガイドです。
記事を読む →DevOpsモニタリングと可観測性: ログ、メトリクス、トレースによる本当の違い
モニタリングと可観測性について説明: 既知および未知の障害、ログ、メトリクスとトレース、チェックアウト インシデントのウォークスルー、ゴールデン シグナル、OpenTelemetry、および便利なアラート。
記事を読む →DevOpsDocker ボリュームとバインド マウント: コンテナ データを正しい方法で保持する
Docker ボリュームとバインド マウントについて説明します。コンテナ データが消える理由、名前付きボリューム、バインド マウント、tmpfs、Compose の例、バックアップ、アクセス許可、およびそれぞれをいつ使用するかについて説明します。
記事を読む →テスト自動化TDD と BDD: 主な違い、1 つの機能が両方の方法で構築され、それぞれをいつ使用するか
TDD と BDD は、両方の方法で構築された 1 つの割引機能で説明されています。実行したコードによるレッド-グリーン-リファクタリング、Given-When-Then シナリオ、ツール、トレードオフ、およびそれぞれをいつ使用するかです。
記事を読む →ソフトウェアテストユーザー受け入れテスト (UAT): プロセス、チェックリスト、および実際の例
ユーザー受け入れテストの説明: 誰が実行するか、QA との違い、7 段階のプロセス、UAT テスト ケース テンプレート、チェックリスト、サインオフ基準、およびよくある間違い。
記事を読む →データベースとSQLSQL NULL 値の説明: IS NULL、COALESCE、NULLIF、および回避すべきトラップ
SQL の NULL 値について、実行したクエリで説明しました。3 つの値のロジック、IS NULL、COALESCE、NULLIF、集計、結合、並べ替えでの NULL の扱い方、およびそれが密かに引き起こすバグです。
記事を読む →データベースとSQLSQL CASE WHEN ステートメント: 構文、実際の例、およびよくある間違い
SQL CASE WHEN では、単純な検索フォーム、条件順序、SUM を使用したピボット、COUNT トリック、カスタム並べ替え、更新、回避すべき NULL トラップなど、実行したクエリを使用して説明しました。
記事を読む →ソフトウェア開発JWTとは何ですか? JSON Web トークンを実際の例で説明する
JWTとは何ですか? JSON Web トークンについて説明しました。3 つの部分、実行したコード内で構築および改ざんされたトークン、JWT とセッション、ストレージ、リフレッシュ トークン、およびセキュリティ上の間違いです。
記事を読む →ソフトウェア開発JavaScript イベントループの説明: コールスタック、マイクロタスク、タイマーと例
JavaScript イベント ループについて、実行したコードで説明しました。コール スタック、タスク キュー、マイクロタスク キュー、setTimeout 0 が即時ではない理由、ブロッキング、スターベーション、およびインタビュー クイズです。
記事を読む →ソフトウェア開発Python ジェネレーターと収量の説明: 実際の例でメモリを節約する
Python ジェネレーターと Yield について、実行したコードを使用して説明します。一時停止と再開の方法、メモリ節約の測定、パイプライン、無限シーケンス、Yield from、send、および一般的なトラップについて説明します。
記事を読む →人工知能埋め込みとは何ですか?ベクトルとコサインの類似度を簡単に説明
埋め込みとは何ですか?ベクトル、コサイン類似度、セマンティック検索に関する平易なガイド。私たちが実行した小さな例、一般的な使用法、モデルの選択、既知の制限が含まれています。
記事を読む →DevOpsBlue-Green デプロイメントと Canary デプロイメント: 違い、トレードオフ、および選択方法
ブルー グリーン デプロイメントとカナリア デプロイメントについて説明: それぞれの仕組み、コスト、リスクとロールバック、テストした安定したユーザー バケット化、データベース移行、ローリング アップデート、および選択方法。
記事を読む →テスト自動化不安定なテスト: 問題の原因とそれを永久に修正する方法
不安定なテストについては、私たちが実行したデモを使用して説明しました。主な原因、確認および診断する方法、タイミングの適切な修正、共有された状態と日付、隔離プロセスなどです。
記事を読む →ソフトウェアテスト負荷テストとストレス テスト: 違い、メトリクス、および k6 の例
ロード テストとストレス テストについて説明します。それぞれが何を証明するか、スパイク テストとソーク テスト、重要な指標、平均値が誤解を招く理由、K6 の例、テストの計画方法について説明します。
記事を読む →ソフトウェアテストテスト ケースとテスト シナリオ: 主な違い、例、およびそれぞれをいつ使用するか
テスト ケースとテスト シナリオの説明: 明確な定義、並べて表、シナリオからケースへの 1 つのパスワード リセット機能、テンプレート、およびそれぞれをいつ使用するか。
記事を読む →データベースとSQLSQL クエリの最適化: 実行プランを読み取り、タイミングを考慮して遅いクエリを修正
SQL クエリの最適化は 100 万行でテストされています。実行プランの読み取り、適切なインデックスの追加、検索対象外のフィルターの修正、複合インデックスとキーセットのページネーションの使用。
記事を読む →データベースとSQLSQL UNION と UNION ALL: 違い、例、テストされたパフォーマンス
SQL UNION と UNION ALL について、実行したクエリで説明しました。重複、両方に従うルール、実際のデータのバグ、測定されたパフォーマンス、INTERSECT と EXCEPT、およびそれぞれをいつ使用するかについて説明します。
記事を読む →ソフトウェア開発JavaScript Fetch API チュートリアル: GET、POST、エラー処理、タイムアウト
ローカル サーバーに対してテストされた JavaScript Fetch API チュートリアル: GET と POST、404 がスローされない理由、再利用可能なヘルパー、クエリ文字列、タイムアウト、CORS、およびよくある間違い。
記事を読む →ソフトウェア開発Python ファイル処理: 読み取り、書き込み、CSV、JSON、パスライブラリと例
Python のファイル処理について、実行したコードで説明します。オープン モード、大きいファイルの読み取り、CSV、JSON、パスライブラリ、バイナリ ファイル、安全な書き込み、エラー処理、およびよくある間違いについて説明します。
記事を読む →ソフトウェア開発Python のクラスとオブジェクト: 実際の例を含む OOP チュートリアル
Python のクラスとオブジェクトについて、実行したコードとともに説明します: __init__、メソッド、クラスとインスタンスの属性、継承、プロパティ、ダンダー メソッド、データクラス、およびよくある間違い。
記事を読む →人工知能大規模言語モデルとは何ですか? LLM の仕組みを誇大広告なしで説明
大規模言語モデルとは何ですか? LLM は、トークン、エンベディング、アテンション、トレーニング、温度およびコンテキスト ウィンドウ、小さな次の単語のデモ、実際の制限など、平易な言葉で説明されています。
記事を読む →DevOps初心者のための Linux コマンド: 例を含む基本ターミナル ガイド
初心者向けの Linux コマンド。ナビゲーション、ファイル、ログの表示、grep、パイプ、権限、プロセス、アーカイブなどのタスク別にグループ化されており、実用的なログ分析の例も含まれています。
記事を読む →テスト自動化Selenium と Playwright: 主な違い、コードの比較、どちらを選択するか
Selenium と Playwright の比較: アーキテクチャ、待機、ブラウザと言語のサポート、デバッグ、両方のツールでの同じテスト、移行のアドバイスと選択方法。
記事を読む →ソフトウェアテスト等価性分割: テスト設計手法を実際の例で説明
等価性パーティション化について説明しました。有効なパーティションと無効なパーティションを見つける方法、年齢、パスワード、クーポンに関する実際の例、実行したテスト、境界と組み合わせる理由。
記事を読む →ソフトウェアテストソフトウェアテストにおける重大度と優先度: 相違点、マトリックス、および実際の例
ソフトウェア テストにおける重大度と優先度について説明します。明確な定義、例を含む 4 方向のマトリックス、レベル スケール、それぞれの設定者、バグ トリアージの実行方法。
記事を読む →データベースとSQLSQL サブクエリのチュートリアル: 型、相関サブクエリ、および EXISTS と例
実行したクエリを含む SQL サブクエリのチュートリアル: スカラー、IN、FROM、SELECT サブクエリ、相関サブクエリ、EXISTS、NOT IN NULL トラップ、サブクエリ対 JOIN 対 CTE。
記事を読む →データベースとSQLSQL トランザクションと ACID の説明: COMMIT、ROLLBACK、分離レベル
SQL トランザクションと ACID について、実行した銀行振込で説明しました。COMMIT、ROLLBACK、セーブポイント、ロック、分離レベル、ダーティ リード、デッドロック、ベスト プラクティスについて説明します。
記事を読む →ソフトウェア開発Git コマンドのチートシート: 実際に使用するコマンドと例
実際のデモ リポジトリからの出力を含む、タスク別にグループ化された Git コマンド チート シート (セットアップ、ステージング、ブランチ、リモート、スタッシュ、履歴、間違いの取り消し)。
記事を読む →ソフトウェア開発JavaScript Promise の説明: then、catch、Promise.all、およびよくある間違い
JavaScript の Promise を、実行したコードで説明します。ステート、then および catch チェーン、エラー処理、Promise.all、allSettled、race および any、イベント ループ、およびよくある間違いです。
記事を読む →ソフトウェア開発Python 辞書チュートリアル: メソッド、例、一般的なパターン
私たちが実行したコードを含む Python 辞書チュートリアル: 辞書の作成、読み取り、更新、主要なメソッド、マージ、内包表記、パターンのカウントとグループ化、およびよくある間違い。
記事を読む →人工知能RAGとは何ですか?検索拡張生成を実際の例で説明する
RAGとは何ですか?検索拡張生成について、インデックス作成、チャンク化、埋め込み、検索、実際に動作する小さな Python の例、評価、一般的な失敗など、ステップごとに説明します。
記事を読む →DevOps初心者向け Terraform チュートリアル: 最初のファイルからモジュールまでのコードとしてのインフラストラクチャ
初心者向けの Terraform チュートリアル: クラウド アカウントなしで開始し、初期化、計画、適用を学び、次に変数、出力、状態、モジュール、安全なチーム ワークフローを学びます。
記事を読む →DevOpsDocker と Kubernetes: 主な違い、連携方法、どちらが必要か
Docker と Kubernetes について説明しました。それぞれの機能、同じアプリを両方で実行すること、Docker Compose と Swarm の比較、dockershim の変更、必要なものを決定する方法などです。
記事を読む →テスト自動化初心者向けの Pytest チュートリアル: フィクスチャ、パラメータ化、実際の例
pytest 9.2 で実行したテストを含む初心者向けの pytest チュートリアル: アサーション、フィクスチャ、parametrize、conftest、マーカー、tmp_path、monkeypatch、便利なフラグ、CI。
記事を読む →ソフトウェアテストソフトウェア テスト ライフ サイクル (STLC): 6 つのフェーズ、開始基準と終了基準、例
ソフトウェア テストのライフ サイクルについては、開始基準と終了基準を含む 6 つの STLC フェーズ、成果物、実際に動作するログイン機能の例、STLC と SDLC、およびアジャイルにおける STLC について説明しました。
記事を読む →ソフトウェア開発Git mergeとrebaseの違い:例と使い分け
Git mergeとrebaseの違いを、実際のログ出力、比較表、rebaseの黄金律、安全なチームワークフローで解説します。
記事を読む →ソフトウェア開発Pythonのリスト内包表記:構文・例・使うべきでない場面
Pythonのリスト内包表記を解説:構文、フィルタ、if-else、ネストしたループ、実測した処理時間、そして通常のforループの方が良い場面。
記事を読む →データベースとSQLSQL JOINを例で解説(Inner・Left・Right・Full)
サンプルのテーブルとクエリでSQL JOINを順に解説。INNER、LEFT、RIGHT、FULL、CROSS、SELFに加え、よくある間違いとパフォーマンスのコツも紹介します。
記事を読む →