<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>devkuma – RDBMS</title>
    <link>https://www.devkuma.com/jp/tags/rdbms/</link>
    <image>
      <url>https://www.devkuma.com/jp/tags/rdbms/logo/180x180.jpg</url>
      <title>RDBMS</title>
      <link>https://www.devkuma.com/jp/tags/rdbms/</link>
    </image>
    <description>Recent content in RDBMS on devkuma</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>jp</language>
    <managingEditor>kc@example.com (kc kim)</managingEditor>
    <webMaster>kc@example.com (kc kim)</webMaster>
    <copyright>The devkuma</copyright>
    
	  <atom:link href="https://www.devkuma.com/jp/tags/rdbms/index.xml" rel="self" type="application/rss+xml" />
    
    
      
        
      
    
    
    <item>
      <title>Database Index (インデックス)</title>
      <link>https://www.devkuma.com/jp/docs/rdbms/index/</link>
      <pubDate>Sun, 19 Dec 2021 01:05:00 +0900</pubDate>
      <author>kc@example.com (kc kim)</author>
      <guid>https://www.devkuma.com/jp/docs/rdbms/index/</guid>
      <description>
        
        
        &lt;h2 id=&#34;インデックスindexとは&#34;&gt;インデックス(index)とは&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;テーブルに対する動作速度を高めるデータ構造を指す。&lt;/li&gt;
&lt;li&gt;インデックスは、テーブル内の 1 つのカラム、または複数のカラムを使って作成できる。&lt;/li&gt;
&lt;li&gt;高速な検索動作だけでなく、レコードアクセスに関連する効率的な並び順付けの基盤も提供する。&lt;/li&gt;
&lt;li&gt;インデックスとは、追加の書き込み処理と保存領域を利用して、データベーステーブルの検索速度を向上させるためのデータ構造である。&lt;/li&gt;
&lt;li&gt;もし本の中で目的の内容を探すとしたら、本のすべてのページを探すには長い時間がかかる。そのため本の著者は本の先頭または末尾に索引を追加するが、データベースの index は本の索引と同じである。&lt;/li&gt;
&lt;li&gt;データベースでも、テーブルのすべてのデータを検索すると時間がかかるため、データとデータの位置を含むデータ構造を作成し、高速に照会できるようにしている。&lt;/li&gt;
&lt;li&gt;index を適用していないカラムを照会すると、全体を探索する Full Scan が実行される。Full Scan は全体を比較しながら探索するため速度が低下する。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;データベースでデータを検索する-2-つの方法&#34;&gt;データベースでデータを検索する 2 つの方法&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;FTS(Full Table Scan)
&lt;ul&gt;
&lt;li&gt;テーブルを最初から最後まで検索する方法である。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Index Scan
&lt;ul&gt;
&lt;li&gt;インデックスを検索し、該当データのテーブルへアクセスする方法である。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;インデックスのデータ構造&#34;&gt;インデックスのデータ構造&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ハッシュテーブル&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;カラム値から生成されたハッシュを基にインデックスを実装する。&lt;/li&gt;
&lt;li&gt;時間計算量が O(1) であるため検索が非常に速い。&lt;/li&gt;
&lt;li&gt;不等号（&amp;lt;, &amp;gt;）のような連続データに対する順次検索はできない。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;B+Tree&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;子ノードが 2 つ以上ある B-Tree を改善したデータ構造である。&lt;/li&gt;
&lt;li&gt;BTree のリーフノードを LinkedList で接続し、順次検索を容易にした。&lt;/li&gt;
&lt;li&gt;ハッシュテーブルより悪い O(log2n) の時間計算量を持つが、ハッシュテーブルより一般的に使用される。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

      </description>
      
      <category>Database</category>
      
      <category>RDBMS</category>
      
      <category>Transaction</category>
      
    </item>
    
    <item>
      <title>Database Transaction (トランザクション)</title>
      <link>https://www.devkuma.com/jp/docs/rdbms/transaction/</link>
      <pubDate>Sun, 19 Dec 2021 01:05:00 +0900</pubDate>
      <author>kc@example.com (kc kim)</author>
      <guid>https://www.devkuma.com/jp/docs/rdbms/transaction/</guid>
      <description>
        
        
        &lt;h2 id=&#34;database-transactionトランザクションとは&#34;&gt;Database Transaction(トランザクション)とは&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;データベースの状態を変化させるために実行する論理的な作業単位である。&lt;/li&gt;
&lt;li&gt;データベースのデータを操作する作業単位（Unit of work）である。&lt;/li&gt;
&lt;li&gt;トランザクションでは複数の演算が実行されることがある。&lt;/li&gt;
&lt;li&gt;トランザクションは、実行中に 1 つでも作業が失敗するとすべてロールバックされ、すべて成功すると commit を実行する。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;transaction-acid-とは&#34;&gt;Transaction ACID とは&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;原子性(Atomicity)
&lt;ul&gt;
&lt;li&gt;1 つのトランザクションの作業が、その一部だけ実行されたり中断されたりしないことを保証することをいう。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;一貫性(Consistency)
&lt;ul&gt;
&lt;li&gt;トランザクションの作業が正常に完了しても、作業前と同じ有効な状態を維持することをいう。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;分離性(Isolation)
&lt;ul&gt;
&lt;li&gt;Transaction 作業が実行されているとき、他の作業が割り込めないように保証することをいう。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;永続性(Durability)
&lt;ul&gt;
&lt;li&gt;正常に実行されたトランザクションについては、永続的（Persistent）に反映されなければならないことをいう。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;transaction-を使用する際の注意点&#34;&gt;Transaction を使用する際の注意点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;トランザクションの範囲は最小化する。
&lt;ul&gt;
&lt;li&gt;トランザクションの範囲を最小化することが重要である。&lt;/li&gt;
&lt;li&gt;データベースのコネクション数は限定的であるため、コネクションを保持する時間を最小化する必要がある。&lt;/li&gt;
&lt;li&gt;そうしないと、他のサービスがそのコネクションを使用するために待機しなければならない状況が発生する。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;transaction-isolation-level-の種類と特徴&#34;&gt;Transaction isolation level の種類と特徴&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;READ UNCOMMITTED
&lt;ul&gt;
&lt;li&gt;SELECT クエリ実行時に、他のトランザクションで COMMIT されていないデータを読み取ることができる。&lt;/li&gt;
&lt;li&gt;COMMIT されていないデータを読む現象を Dirty read という。&lt;/li&gt;
&lt;li&gt;INSERT だけが行われ、ROLLBACK される可能性のある、つまり COMMIT されていないデータを読むことができるため注意が必要である。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;READ COMMITTED
&lt;ul&gt;
&lt;li&gt;Read Committed は、COMMIT が完了したデータだけが SELECT 時に見えるレベルを保証するものであり、多くの DBMS では Read Committed がデフォルトに設定される。&lt;/li&gt;
&lt;li&gt;Read Committed では、Read Uncommitted で発生する Dirty read が発生しないことを保証する。&lt;/li&gt;
&lt;li&gt;トランザクションで COMMIT を実行していなくても、DB にはすでに値が反映されている状態であり、COMMIT 前のデータを保証するには、COMMIT されていないクエリを復旧する過程が必要になる。つまり、この時点では Consistent Read を実行する必要があることを意味する。&lt;/li&gt;
&lt;li&gt;Read Committed の問題は、1 つのトランザクション内で SELECT を実行するたびにデータが同一であることを保証しない点である。その理由は、他のトランザクションで該当データが COMMIT された場合、COMMIT されたデータを返すのが Read Committed の特徴だからである。&lt;/li&gt;
&lt;li&gt;このような理由から、Read Committed は Non-repeatable Read とも呼ばれる。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;REPEATABLE READ
&lt;ul&gt;
&lt;li&gt;Read Committed とは異なり、Repeatable Read は 1 つのトランザクション内で繰り返し SELECT を実行しても、読み取る値が変わらないことを保証する。&lt;/li&gt;
&lt;li&gt;Repeatable Read トランザクションは、最初に SELECT を実行した時刻を記録し、その後はすべての SELECT でその時点を基準に Consistent Read を実行する。&lt;/li&gt;
&lt;li&gt;したがって、トランザクション中に他のトランザクションが COMMIT されても、新しく COMMIT されたデータは見えない。&lt;/li&gt;
&lt;li&gt;その理由は、最初の SELECT 時に生成された SNAPSHOT を読むためである。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SERIALIZABLE
&lt;ul&gt;
&lt;li&gt;Serializable は、すべての作業を 1 つのトランザクションで処理するのと同じ、最も高い分離レベルを提供する。&lt;/li&gt;
&lt;li&gt;Read Committed、Repeatable Read の 2 つに共通する問題は、Phantom Read が発生する点である。
&lt;ul&gt;
&lt;li&gt;Phantom Read とは
&lt;ul&gt;
&lt;li&gt;1 つのトランザクションで UPDATE 命令が失われたり上書きされたりする、つまり UPDATE 後に COMMIT して再度照会したとき、予想とは異なる値が見えたりデータが失われたりした場合を Phantom Read という。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;それとは異なり、SERIALIZABLE では SELECT クエリがすべて SELECT &amp;hellip; FOR SHARE に自動で変更され、Repeatable Read では防げないいくつかの状況を防止できる。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;commit-と-rollback&#34;&gt;Commit と Rollback&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Commit
&lt;ul&gt;
&lt;li&gt;1 つのトランザクションが終わったとき、完了したことをトランザクション管理者に知らせる。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Rollback
&lt;ul&gt;
&lt;li&gt;1 つのトランザクション処理が異常終了して DB の一貫性を崩したとき、すべての演算を取り消すことをいう。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

      </description>
      
      <category>Database</category>
      
      <category>RDBMS</category>
      
      <category>Transaction</category>
      
    </item>
    
    <item>
      <title>Database Normalization (正規化)</title>
      <link>https://www.devkuma.com/jp/docs/rdbms/normalization/</link>
      <pubDate>Sun, 19 Dec 2021 01:05:00 +0900</pubDate>
      <author>kc@example.com (kc kim)</author>
      <guid>https://www.devkuma.com/jp/docs/rdbms/normalization/</guid>
      <description>
        
        
        &lt;h2 id=&#34;db-正規化&#34;&gt;DB 正規化&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;データ損失や不要な情報の導入なしに、データの一貫性とデータ重複を最小化し、最大限のデータ安定性を確保する安定したデータ構造へ変換するため、1 つのテーブルを 2 つ以上に分離する作業である。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;db-正規化の目的&#34;&gt;DB 正規化の目的&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;データ整合性の維持
&lt;ul&gt;
&lt;li&gt;データ保存に必要な保存領域を最小化し、データの挿入、更新、削除に伴う異常を除去する。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;データ構造の安定性を最大化するためである。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;正規化過程&#34;&gt;正規化過程&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;第1正規化
&lt;ul&gt;
&lt;li&gt;すべての属性値が原子値を持つように分解する。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;第2正規化
&lt;ul&gt;
&lt;li&gt;第1正規形を満たし、主キーではない属性が主キーに完全関数従属するように分解する。
&lt;ul&gt;
&lt;li&gt;ここで完全関数従属とは、主キーの部分集合が他の値を決定しないことを意味する。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;第3正規化
&lt;ul&gt;
&lt;li&gt;第2正規形を満たし、主キーではない属性が主キーに直接従属（非推移的従属）するように分解する。
&lt;ul&gt;
&lt;li&gt;ここで推移的従属とは A-&amp;gt;B-&amp;gt;C が成立することであり、これを A,B と B,C に分解することが第3正規形である。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;BCNF 正規化
&lt;ul&gt;
&lt;li&gt;第3正規形を満たし、関数従属性 X-&amp;gt;Y が成立するとき、すべての決定子 X が候補キーになるように分解する。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

      </description>
      
      <category>Database</category>
      
      <category>RDBMS</category>
      
    </item>
    
    <item>
      <title>Database Tuning (チューニング)</title>
      <link>https://www.devkuma.com/jp/docs/rdbms/tuning/</link>
      <pubDate>Sun, 19 Dec 2021 01:05:00 +0900</pubDate>
      <author>kc@example.com (kc kim)</author>
      <guid>https://www.devkuma.com/jp/docs/rdbms/tuning/</guid>
      <description>
        
        
        &lt;h2 id=&#34;db-optimizerオプティマイザ&#34;&gt;DB Optimizer(オプティマイザ)&lt;/h2&gt;
&lt;p&gt;SQL を最も速く効率的に実行する最適な処理経路を生成する、DBMS 内部の中核エンジンである。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;種類
&lt;ul&gt;
&lt;li&gt;ルールベースオプティマイザ、コストベースオプティマイザ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;過程
&lt;ul&gt;
&lt;li&gt;ユーザーが投げたクエリを実行するため、候補となる実行計画を探す。&lt;/li&gt;
&lt;li&gt;オブジェクト統計およびシステム統計情報を通じて、各実行計画の予想コストを算定する。&lt;/li&gt;
&lt;li&gt;各実行計画を比較し、最も低いコストを持つものを選択する。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;ヒントhint&#34;&gt;ヒント(Hint)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ヒントとは、SQL をチューニングするための指示構文である。&lt;/li&gt;
&lt;li&gt;オプティマイザが最適な計画で SQL 文を処理できない場合に、開発者が直接最適な実行計画を提供するものである。&lt;/li&gt;
&lt;li&gt;ヒントは SELECT の後に記述でき、INDEX、PARALLEL などさまざまなヒント句がある。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;データベースチューニングと方法&#34;&gt;データベースチューニングと方法&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;DB チューニングは、データベース構造やデータベース自体、オペレーティングシステムなどを調整し、データベースシステムの性能を向上させる作業を意味する。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;チューニングは DB 設計チューニング &amp;gt; DBMS チューニング &amp;gt; SQL チューニングの段階で進められる。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;1段階-db-設計チューニングモデリング観点&#34;&gt;1段階: DB 設計チューニング(モデリング観点)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;チューニング方法
&lt;ul&gt;
&lt;li&gt;データベース設計段階で性能を考慮して設計&lt;/li&gt;
&lt;li&gt;データモデリング、インデックス設計&lt;/li&gt;
&lt;li&gt;データファイル、テーブルスペース設計&lt;/li&gt;
&lt;li&gt;データベース容量算定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;チューニング事例
&lt;ul&gt;
&lt;li&gt;非正規化、分散ファイル配置&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2段階-dbms-チューニング環境観点&#34;&gt;2段階: DBMS チューニング(環境観点)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;チューニング方法
&lt;ul&gt;
&lt;li&gt;性能を考慮してメモリやブロックサイズを指定&lt;/li&gt;
&lt;li&gt;CPU、メモリ I/O に関する観点&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;チューニング事例
&lt;ul&gt;
&lt;li&gt;Buffer サイズ&lt;/li&gt;
&lt;li&gt;Cache サイズ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;3段階-sql-チューニングapp-観点&#34;&gt;3段階: SQL チューニング(APP 観点)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;チューニング方法
&lt;ul&gt;
&lt;li&gt;SQL 作成時に性能を考慮&lt;/li&gt;
&lt;li&gt;Join, Indexing, SQL Execution Plan&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;チューニング事例
&lt;ul&gt;
&lt;li&gt;Hash / Join&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

      </description>
      
      <category>Database</category>
      
      <category>RDBMS</category>
      
    </item>
    
    <item>
      <title>Database Lock</title>
      <link>https://www.devkuma.com/jp/docs/rdbms/lock/</link>
      <pubDate>Mon, 11 Jul 2022 09:26:00 +0900</pubDate>
      <author>kc@example.com (kc kim)</author>
      <guid>https://www.devkuma.com/jp/docs/rdbms/lock/</guid>
      <description>
        
        
        &lt;h2 id=&#34;lock-とは&#34;&gt;Lock とは&lt;/h2&gt;
&lt;p&gt;Lock とは、トランザクション間の順序性を保証するための方法である。&lt;br&gt;
ここでトランザクションとは、独立して処理できる最小単位を意味する。&lt;br&gt;
Lock は DBMS ごとに実装方式や方法が異なるため、DBMS ごとの Lock の概念を理解しておく必要がある。&lt;/p&gt;
&lt;h2 id=&#34;db-ロックとは&#34;&gt;DB ロックとは&lt;/h2&gt;
&lt;p&gt;DB ロックは、複数のトランザクションが 1 つのデータに同時にアクセスしようとするとき、それを制御するものである。&lt;/p&gt;
&lt;h2 id=&#34;db-ロックの種類&#34;&gt;DB ロックの種類&lt;/h2&gt;
&lt;p&gt;Lock の種類には共有ロック（Shared Lock）、排他ロック（Exclusive Lock）があり、それぞれ Read Lock、Write Lock とも呼ばれる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;共有ロック(LS, Shared Lock)
&lt;ul&gt;
&lt;li&gt;トランザクションが読み取りを行うときに使用するロックであり、データを読むことはできるが書き込むことはできない。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;排他ロック(LX, Exclusive Lock)
&lt;ul&gt;
&lt;li&gt;トランザクションが読み書きを行うときに使用するロックであり、データを読み書きできる。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;排他制御&#34;&gt;排他制御&lt;/h2&gt;
&lt;h3 id=&#34;楽観的ロック&#34;&gt;楽観的ロック&lt;/h3&gt;
&lt;p&gt;複数の人がほぼ同時にリソースを変更することは少ない、という楽観的な観点から行う排他制御である。&lt;/p&gt;
&lt;h3 id=&#34;悲観的ロック&#34;&gt;悲観的ロック&lt;/h3&gt;
&lt;p&gt;複数の人が同じリソースを頻繁に変更するという前提の、悲観的な観点から行う排他制御である。&lt;/p&gt;

      </description>
      
      <category>Database</category>
      
      <category>RDBMS</category>
      
    </item>
    
  </channel>
</rss>
