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