ApacheDerby-ダービーインデックス

テーブル内のインデックスは、そのデータへのポインタに他なりません。これらは、テーブルからのデータ取得を高速化するために使用されます。

インデックスを使用する場合、INSERTステートメントとUPDATEステートメントはより遅いフェーズで実行されます。一方、SELECTとWHEREは、より短い時間で実行されます。

インデックスの作成

CREATE INDEXステートメントは、Derbyデータベースのテーブルに新しいインデックスを作成するために使用されます。

構文

以下は、CREATEINDEXステートメントの構文です。

CTREATE INDEX index_name on table_name (column_name);

以下に示すように、ApacheDerbyにEmployeesという名前のテーブルを作成したとします。

CREATE TABLE Emp ( Id INT NOT NULL GENERATED ALWAYS AS IDENTITY,
   Name VARCHAR(255),
   Salary INT NOT NULL,
   Location VARCHAR(255),
   Phone_Number BIGINT
);

次のSQLステートメントは、テーブルEmployeesのSalaryという名前の列にインデックスを作成します。

ij> CREATE INDEX example_index on Emp (Salary);
0 rows inserted/updated/deleted

UNIQUEインデックスの作成

Apache Derbyでは、UNIQUEインデックスがデータ統合に使用されます。テーブルの列にUNIQUEインデックスを作成すると、重複する値は許可されません。

構文

以下は、一意のインデックスを作成するための構文です。

CREATE UNIQUE INDEX index_name on table_name (column_name);

次の例では、テーブルEmployeeの列IDにUNIQUEインデックスを作成します。

ij> CREATE UNIQUE INDEX unique_index on Emp (Phone_Number);
0 rows inserted/updated/deleted

列に一意のインデックスを作成すると、その列に同じ値を別の行に入力することはできません。つまり、UNIQEインデックスを持つ列は、重複する値を許可しません。

以下に示すように、Empテーブルに行を挿入します

ij> INSERT INTO Emp(Name, Salary, Location, Phone_Number) VALUES ('Amit',
45000, 'Hyderabad', 9848022338);
1 row inserted/updated/deleted

Phone_No列に一意のインデックスを作成したため、前のレコードと同じ値を入力しようとすると、エラーが表示されます。

ij> INSERT INTO Emp(Name, Salary, Location, Phone_Number) VALUES ('Sumit',
35000, 'Chennai', 9848022338);
ERROR 23505: The statement was aborted because it would have caused a duplicate
key value in a unique or primary key constraint or unique index identified by
'UNIQUE_INDEX' defined on 'EMP'.

COMPOSITEインデックスの作成

2つの行に単一のインデックスを作成できます。これは複合インデックスと呼ばれます。

構文

以下は、複合インデックスの構文です。

CREATE INDEX index_name on table_name (column_name1, column_name2);

次のインデックスは、Name列とLocation列に複合インデックスを作成します。

ij> CREATE INDEX composite_index on Emp (Name, Location);
0 rows inserted/updated/deleted

インデックスの表示

SHOW INDEXESクエリは、テーブル上のインデックスのリストを表示します。

構文

以下は、SHOWINDEXESステートメントの構文です。

SHOW INDEXES FROM table_name;

次の例では、テーブルEmployeesにインデックスを表示します。

ij> SHOW INDEXES FROM Emp;

これにより、次の結果が得られます。

ij> SHOW INDEXES FROM Emp;
TABLE_NAME |COLUMN_NAME |NON_U&|TYPE|ASC&|CARDINA&|PAGES
----------------------------------------------------------------------------
EMP |PHONE_NUMBER |false |3 |A |NULL |NULL
EMP |NAME |true |3 |A |NULL |NULL
EMP |LOCATION |true |3 |A |NULL |NULL
EMP |SALARY |true |3 |A |NULL |NULL
4 rows selected

インデックスの削除

Drop Indexステートメントは、指定されたインデックスを列から削除/ドロップします。

構文

以下は、DROPINDEXステートメントの構文です。

DROP INDEX index_name;

次の例では、上記で作成したcomposite_indexおよびunique_indexという名前のインデックスを削除します。

ij> DROP INDEX composite_index;
0 rows inserted/updated/deleted
ij>Drop INDEX unique_index;
0 rows inserted/updated/deleted

ここで、インデックスのリストを確認すると、残りの列を削除したため、1つの列にインデックスが表示されます。

ij> SHOW INDEXES FROM Emp;
TABLE_NAME |COLUMN_NAME |NON_U&|TYPE|ASC&|CARDINA&|PAGES
----------------------------------------------------------------------------
EMP |SALARY |true |3 |A |NULL |NULL
1 row selected

JDBCプログラムを使用したインデックスの処理

次のJDBCプログラムは、テーブルの列にドロップインデックスを作成する方法を示しています。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class IndexesExample {
   public static void main(String args[]) throws Exception {

      //Registering the driver
      Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
      //Getting the Connection object
      String URL = "jdbc:derby:MYDATABASE;create=true";
      Connection conn = DriverManager.getConnection(URL);

      //Creating the Statement object
      Statement stmt = conn.createStatement();

      //Creating the Emp table
      String createQuery = "CREATE TABLE Emp( "
         + "Id INT NOT NULL GENERATED ALWAYS AS IDENTITY, "
         + "Name VARCHAR(255), "
         + "Salary INT NOT NULL, "
         + "Location VARCHAR(255), "
         + "Phone_Number BIGINT )";
      stmt.execute(createQuery);
      System.out.println("Table created");
      System.out.println(" ");

      //Creating an Index on the column Salary
      stmt.execute("CREATE INDEX example_index on Emp (Salary)");
      System.out.println("Index example_index inserted");
      System.out.println(" ");

      //Creating an Unique index on the column Phone_Number
      stmt.execute("CREATE UNIQUE INDEX unique_index on Emp (Phone_Number)");
      System.out.println("Index unique_index inserted");
      System.out.println(" ");

      //Creating a Composite Index on the columns Name and Location
      stmt.execute("CREATE INDEX composite_index on Emp (Name, Location)");
      System.out.println("Index composite_index inserted");
      System.out.println(" ");

      //listing all the indexes
      System.out.println("Listing all the columns with indexes");

      //Dropping indexes
      System.out.println("Dropping indexes unique_index and, composite_index ");
      stmt.execute("Drop INDEX unique_index");
      stmt.execute("DROP INDEX composite_index");
   }
}

出力

実行すると、次の結果が生成されます

Table created
Index example_index inserted

Index unique_index inserted

Index composite_index inserted

Listing all the columns with indexes
Dropping indexes unique_index and, composite_index