業務でデータベースの操作をする場合、データが大量に登録されているテーブルへアクセスする場合に索引(INDEX)を作成するとSQLクエリの実行が劇的に早くなるケースが多々あります。この索引(INDEX)についてどういう場合に作成すれば良いのか、メリット、デメリット等についてまとめておきます。
どういう場合に索引(INDEX)を作成すれば良いのか
索引(INDEX)を作成した方が良いケース
- 項目数/データ数が多い大規模な表の1%~15%程の行を頻繁にアクセスする場合
- WHERE句で頻繁に使用されている列である場合
- 列の値が比較的一意である場合
- 参照整合性制約で使用されている外部キーになっている列である場合
索引(INDEX)を作成しない方が良いケース
- データ登録件数が少ない表である場合
- 列内の値がほぼユニークである場合
- NULL値が多く、NULL以外の値を検索しない場合
索引(INDEX)のメリット
- 表検索(SELCET)する際、特定の行を素早く検索する事が出来る為、検索のパフォーマンスが早くなります。
- ソート作業を省略出来ます。
索引(INDEX)のデメリット
- データの登録(INSERT)、変更(UPDATE)の際、索引変更のためのオーバーヘッドが加わるため、索引(INDEX)がないテーブルに比べると時間が掛かります。
- 索引(INDEX)を作成する領域が必要となります。
EclipseでJUnitやDjUnitを実行すると「junit java.lang.OutOfMemoryError: Java heap space」とメモリエラーが表示された場合は「デフォルトのVM引数」を設定する事でこの事象を回避する事が出来るのでその設定方法をご紹介します。
環境
- Eclipse 4.2
- Windows7 professional 64bit版
対処方法
- Eclipseメニューの「ウィンドウ」⇒「設定」を選択します。
- 設定画面で「Java」⇒「インストール済みのJRE」⇒使用しているjdkを選択して「編集」ボタンを選択します。
- JREの編集画面で「デフォルトのVM引数」へ以下の様に設定します。
|
-Xms=1024m -Xmx=1024m -XX:PermSize=128m -XX:MaxPermSize=128m -XX:NewSize=320m -XX:MaxNewSize=320m -XX:SurvivorRatio=2 -XX:TargetSurvivorRatio=80 |
Excelで文字列置換する場合「SUBSTITUTE」関数か「REPLACE」関数のどちらかを使用します。但し、EXCELのREPLACE関数はJa「この指定文字列をまとめてこの文字列へ置換」というような事は出来ません。EXCELで文字列置換する場合は通常「SUBSTITUTE」関数を使用します。
動作環境
Microsoft Office Professional 2013
「SUBSTITUTE」関数を使用して文字列置換する方法
- 「SUBSTITUTE」関数の書式。
「SUBSTITUTE(文字列, 検索文字列, 置換文字列, [置換対象])」
- 文字列:文字列置換するセルを指定します。
- 検索文字列:置換前文字列を指定します。
- 置換文字列:置換後文字列を指定します
- 置換対象:指定すると全置換ではなく、検索文字列の「置換対象」個目に出現した値のみ置換対象とします。
- 「SUBSTITUTE」関数の使用例
通常JUnitでは1クラスに対して1クラス分のテストケースクラスを作成してテストを実施します。何らかの業務でプロジェクト全体での規模になってくるとその数は何十、何百、時には何千となる事も珍しいことではありません。
こういったプロジェクトでソースに何らかの修正が入り、テストを実施するという場合に1つずつJUnitで確認していたのでは実行するだけで無駄に時間が掛かってしまいます。
こういう場合には「テスト・スイートクラス」を作成して、まとめて実行して確認するのが一般的な手法となります。
環境
pleiades(eclipse4.2)
junit_4.10.0
テスト・スイートクラスの作成手順
- テストケースクラスが保存されているパッケージで右クリックし、「新規」⇒「その他」を選択します。
- ウィザード画面で「JUnit」⇒「JUnitテスト・スイート」を選択し「次へ」ボタンを選択します。
- テストスイートクラスのファイル名(デフォルトではAllTestsとなります)、保存先のフォルダ、テストしたいクラスを設定し、「完了」ボタンを選択します。
- 上記手順で以下の様なテスト・スイートクラスが作成されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; @RunWith(Suite.class) @SuiteClasses({ OverLoadSampleTest.class, OverRideSampleTest.class, SampleClass1Test.class, UtilClassDjUnitTest.class, UtilSample1Test.class, UtilSample1TestDjunit.class }) /** * <p>[概 要] コンストラクタ</p> * <p>[詳 細] テスト・スイートクラスのコンストラクタ。</p> * <p>[備 考] </p> */ public class AllTests { } |
djUnitではメソッドが呼び出された際、強制的に特定のExceptionを発生させる事も可能です。強制的にExceptionを発生させる場合には「addReturnValue」を使用します。
1点注意しておきたいのは「addReturnValue」を使用してExceptionを発生させた時はjunitで「@Test(expected = RuntimeException.class)」の様にアノテーションでは確認出来ないのでTry~catchで確認する必要があります。
Javaソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
/** * <p>[概 要] URLエンコード処理</p> * <p>[詳 細] </p> * <p>[備 考] </p> * @param str 文字列 * @param enc - 文字コード * @return URLエンコード後の文字列 */ public static String urlEncode(String str, String enc){ String urlEncode = ""; StringBuffer result = new StringBuffer(); try { urlEncode = URLEncoder.encode(str, enc); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e.toString()); } // 半角スペースは「%20」へ置換する for(char c : urlEncode.toCharArray()) { switch (c) { case '+' : result.append("%20"); break; default : result.append(c); break; } } return result.toString(); } |
djUnitサンプル
以下のテストソースでは「URLEncoder」クラスの「encode」メソッドが呼び出された際に「UnsupportedEncodingException」がスローされた事を確認しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
@Test public void testUrlEncode_exception() { // 準備 String str = "/&<>\"\' abc123"; String enc = "utf-8"; // 「URLEncoder.encode()」を実行した際、UnsupportedEncodingExceptionを発生させます。 addReturnValue(URLEncoder.class, "encode", new UnsupportedEncodingException("MESSAGE001")); try { // 実行 UtilSample1.urlEncode(str, enc); fail("この行は、実行されないはず"); } catch (Throwable t) { assertTrue(t instanceof RuntimeException); assertEquals("java.io.UnsupportedEncodingException: MESSAGE001", t.getMessage()); } } |
TeraTermが日本語表示されない場合の対処方法についてメモしておきます。
事象
TeraTermを起動すると以下の様にメニュー等の表示が英語になっている。
原因
対応方法
- TeraTermのインストールフォルダ内にある「TERATERM.INI」ファイルをエディタで開きます。
- 次に「TERATERM.INI」ファイル内で「UILanguageFile=」と記載されている箇所を探します。
日本語表示されていない場合は以下の様に「UILanguageFile=」の後に何も記載されていません。
|
; User interface language file that includes message strings. ; Tera Term uses built-in English message when the file or message is not found. UILanguageFile= |
- 「UILanguageFile=」の箇所を「UILanguageFile=lang\Japanese.lng」に変更してINIファイルを保存します。
|
; User interface language file that includes message strings. ; Tera Term uses built-in English message when the file or message is not found. UILanguageFile=lang\Japanese.lng |
- 後はTeraTermを起動すれば日本語化されます。
SQLで1つの項目に対して複数の値に一致した条件で検索する方法をご紹介します。
この場合、考えられる方法としては「OR」演算子を使用する方法と「IN」演算子を使用する2つの方法があります。
通常はIN演算子で済むような条件であればOR演算子は使用しません。
サンプルテーブル
以下の商品テーブル「goods」を元に説明します。
商品テーブル「goods」 |
|
1つの項目に対して複数の値で検索
SQL:「OR」演算子を使用する場合
「OR」演算子を使用する場合、以下の様にWHERE句にOR演算子を指定する事で複数の値で検索する事が出来ます。
「SELECT * FROM [テーブル名] WHERE [条件1] OR [条件2];」形式で記述します。
|
SELECT * FROM goods WHERE type_code = 101 OR type_code = 102; |
SQL:「IN」演算子を使用する場合
「IN」演算子を使用する場合、以下の様にWHERE句にIN演算子を指定する事で複数の値で検索する事が出来ます。
「SELECT * FROM [テーブル名] WHERE [列名] IN ([値1], [値2] …;」形式で記述します。
|
SELECT * FROM goods WHERE type_code IN(101, 102); |
実行結果
「OR」演算子、「IN」演算子どちらで実行した場合も取得結果は以下の様になります。
SQLで範囲検索する方法をご紹介します。
サンプルテーブル
以下の商品テーブル「goods」を元に説明します。
商品テーブル「goods」 |
|
単純なレコード件数の取得
SQL
SQLはWHERE句にBETWEEN演算子を指定する事で範囲検索結果が取得出来ます。
「SELECT * FROM [テーブル名] WHERE [列名] BETWEEN [From値] AND [To値];」形式で記述します。
|
SELECT * FROM goods WHERE type_code BETWEEN 102 AND 103; |
実行結果
「駑馬十駕」 IT系情報を中心に調べた事をコツコツ綴っています。