名前を指定する場合、引用符(")で囲んで指定することを推奨します。なお、名前を引 用符(
"
)で囲んだ場合、半角英小文字、及び半角英大文字は区別して扱います。名前には、予約語と同じ名前を指定できませんが、引用符(
"
)で囲んだ場合は、予約語と 同じ名前を指定できます。SQL
の拡張に伴って、システムに登録する予約語を追加する 場合があるので、名前はあらかじめ引用符("
)で囲んで指定しておくと、追加した予約語と 重複する問題が発生しません。ただし、次に示す名前を
UAP
で使用する場合は、SQL
の予約語と同じでも引用符("
)で 囲まないで指定してください。・ カーソル名
・
SQL
文識別子・ 埋込み変数名、標識変数名、ホスト識別子
※本ガイドラインの他の例では、スペースの都合で引用符(")を省略しています。
Point
識識別子等の名前は、引用符(")で囲む保守性を向上させるための記述
© Hitachi, Ltd. 2013 , 2015. All rights reserved.
10-2 表名の付与
85
表名を付与することにより列が属している表を明確化することができ、可読性・保守性が 高まります。
また同じ表を結合する場合、または副問合せで同じ表の列を参照する場合に備えて、表 名として相関名を使用すると良いです。
表名付与の例を図 10-2-1に示します。
Point SELECT文においては、(単一の表に対する処理でも)すべての列名を表名(
または相関名。名称が短くできるため相関名の方が良い)で修飾すること
○
SELECT EM.ENAME, DE.DNAME FROM EMP EM,DEPT DE
WHERE EM.DEPT_NO = DE.DEPT_NO AND EM.SAL > 1000 ;
×
SELECT ENAME, DNAME FROM EMP,DEPT
WHERE EMP.DEPT_NO = DEPT.DEPT_NO AND SAL > 1000 ;
図 10-2-1 列名の接頭辞使用の例
※本ガイドラインの他の例では、スペースの都合で表名を省略している場合があります。
列名に表名が無い
列名に表名が無い
相関名を付与 相関名を付与
保守性を向上させるための記述
10-3 列の明示的指定(1)
列の指定時にすべての列を取り出す「*」を指定すると、解析の処理時間が増大します。
それだけでなく、列の順番は物理設計(性能・格納効率を考慮し、可変長の列を最後尾に 入れ替える)・列の追加などによって変更される可能性が高く、列の順番に依存した
SQL
文はバグの原因となります。また無駄な列を指定していれば、その分処理・転送時間が 増加します。検索時の指定の例を図 10-3-1に、挿入時の例を図 10-3-2に示します。
Point
列の指定を「*」で省略しないこと 不要な列の情報を取得しないこと
INSERT
時の列指定を省略しないこと保守性を向上させるための記述
© Hitachi, Ltd. 2013 , 2015. All rights reserved.
10-3 -1 列の明示的指定(2)
87
○
SELECT EM.EMP_NO, EM.ENAME FROM EMP EM ;○
SELECT EM.EMP_NO, EM.ENAME, EM.SAL, EM.DEPT_NO FROM EMP EM ;×
SELECT EM.*FROM EMP EM ;
業務に必要な列 のみ参照する
全列が必要な場合も
*を使用せず、明示 的に指定
*を使用しない
図 10-3-1
SELECT
文における列指定の例保守性を向上させるための記述
10-3 -2 列の明示的指定(3)
○
INSERT INTO EMP(EMP_NO, ENAME) VALUES (200007, N'スカート') ;○
INSERT INTO EMP(EMP_NO, ENAME, SAL, DEPT_NO) VALUES (200008, N'ブラウス',1000000, 1080) ;
×
INSERT INTO EMPVALUES (200008, N'ブラウス', 1000000, 1080) ;
図 10-3-2 INSERT文における列指定の例
全列に挿入しない場合、
列指定の省略は不可
全列に挿入する場合でも、
列を明示的に指定する 全列に挿入する場合、列指定
を省略した悪例
保守性を向上させるための記述
© Hitachi, Ltd. 2013 , 2015. All rights reserved.
10-4 ORDER BY 句における明示的列指定
89
ORDER BY
句では何列目でソートするかを数字で指定することも可能ですが、列順に依存するため保守性に劣ります。よって
ORDER BY
句では列名を使用します。また、
ASC(
昇順)
、DESC(
降順)
の指定を明記してください。例を図 10-4-1に示します。Point ORDER BY
句では列名を使用することASC(
昇順)
,DESC(
降順)
の指定を省略せず明記すること○
SELECT EM.EMP_NO, EM.ENAME, EM.SAL FROM EMP EM;ORDER BY EM.EMP_NO ASC, EM.SAL ASC ;
×
SELECT EM.EMP_NO, EM.ENAME, EM.SAL FROM EMP EMORDER BY 1 ASC, 3 ASC ;
図 10-4-1 ORDER BY句の使用例
ソート順をソート項目指定番号で 指定しないこと
ORDER BY句では、列名で指定
保守性を向上させるための記述
10-5 SQL 文の記述
動的
SQL
を繰り返し用いる場合、SQL
オブジェクトにヒットしSQL
の前処理を省略するた めには、SQL文の一字一句が大文字小文字も含めてまったく同じである必要があります。条件の値が異なれば、
SQL
オブジェクトがヒットしなくなります。よって、?
パラメタ、埋込 み変数を用いることにより、SQL
オブジェクトにヒットするようにできます。?
パラメタを用いる例を図 10-5-1に示します。埋込み変数を用いる例については、「9-1 埋込み変数の使用」を参照してください。
Point SQL文の記述は、大文字または小文字のいずれかに統一することが望ましい
条件の値が異なるだけの
SQL
文は、?
パラメタ、埋込み変数を用いる○
SELECT ZA.ZSURYO FROM ZAIKO ZAWHERE ZA.TANKA > ? ;
×
SELECT ZA.ZSURYO FROM ZAIKO ZAWHERE ZA.TANKA > 100 ;
図 10-5-1 ?パラメタの使用例
条件の値100を200、300…など 値を変更して繰り返し検索する 場合、
?
パラメタを用いる。保守性を向上させるための記述
© Hitachi, Ltd. 2013 , 2015. All rights reserved.
11. おわりに
91
11-1 おわりに
これからもHiRDBに
ご期待ください!
© Hitachi, Ltd. 2013 , 2015. All rights reserved.
付録A. SQL の最適化指定
93
付録A-1 使用インデクスの SQL 最適化指定の適用検討
アプリケーション内でDBをアクセスする場合、SQL文が使用するインデクスを確認します。通常
HiRDB
のオプティマイザが自動的に最適なインデクスを選択しますが、場合によっては、効率の悪いインデクスを選択する場合があります。
今後、アプリケーションを変更(新規を含む)する場合、DBアクセス時に使用するインデクスをSQL トレースで確認し、最適なインデクスが選択されていない場合には、使用するインデクスを明示的に 指定するWITH INDEX句を記述し、使用するインデクスを固定することを推奨します。
(オプティマイザと
WITH INDEX
句の指定が異なる場合は、できるだけ性能測定を行います。)解説 使用インデクスを指示したい場合のSQL最適化指定の使い方について解説しま す。
HiRDBが、ヒット件数が多くてアクセス効率の悪い場合、
SQL最適化指定の適用を検討する SELECT SNAME FROM ZAIKO
WHERE TANKA <= 500 AND ZSURO = 100;
TANKAで効率よく絞り込める場合
SELECT SNAME FROM ZAIKO WITH INDEX (IDX1) WHERE TANKA <= 500
AND ZSURO = 100;
TANKAとAND条件のZSURYOでさらに絞り込める場合
SELECT SNAME FROM ZAIKO WITH INDEX (IDX1,IDX2) WHERE TANKA <= 500
AND ZSURYO = 100;
図 A.1-1 WITH INDEX句を指定した指定例
インデクス定義 IDX1(TANKA) IDX2(ZSURYO)
© Hitachi, Ltd. 2013 , 2015. All rights reserved.
付録A-2 結合方式の SQL 最適化指定の適用検討
95
HiRDBのオプティマイザが自動的に効率の良い結合方法を選択しますが、稀に悪い結
合方法を選択する場合があります。その場合、個別のSQL
に効率の良い結合方法をチューニングするためにSQL最適化指定を指定します。ただし、指定できるのは、INNER
JOIN
またはLEFT OUTER
の構文のみです。解説 結合方式を指示したい場合の
SQL
最適化指定の使い方について解説します。HiRDBのオプティマイザが効率の悪い結合方法を選択した場合のSQL SELECT ZA.ZSURYO, ZA.DNO
FROM ZAIKO ZA, JUTYU JU WHERE ZA.ZSURYO = JU.SURYO ;
個別のSQLで効率の良い結合方式のSQL最適化指定した場合 SELECT ZA.ZSURYO, ZA.DNO
FROM ZAIKO ZA
INNER JOIN BY NEST JUTYU JU ON ZA.ZSURYO = JU.SURYO ;
SELECT ZA.ZSURYO, ZA.DNO FROM ZAIKO ZA
INNER JOIN BY HASH JUTYU JU ON ZA.ZSURYO = JU.SURYO ;
SELECT ZA.ZSURYO, ZA.DNO FROM ZAIKO ZA
INNER JOIN BY MERGE JUTYU JU ON ZA.ZSURYO = JU.SURYO ;
個別のSQLで結合方式のSQL最適化指定 すると、効率が改善される。
図 A.2-1 SQL最適化指定を指定した例
BY NEST を指定してネストループジョイン
で結合する。絞り込める表を外表に指定する。
BY HASH を指定してハッシュジョインで
結合する。ハッシュ表のサイズが小さくなる表を内表 に指定する。
BY MERGEを指定してマージジョインで
結合する。付録B. 定義に関する記述
© Hitachi, Ltd. 2013 , 2015. All rights reserved.
付録B-1 表の属性
97
NULL
値の利用が不要であり、かつ可変長列の使用の必要がない場合は、極力FIX
表 を使用します。ただし、FIX
表にするために、可変長文字列を固定長文字列に変換する場 合は、DB
容量が増加しないように注意する必要があります。FIX
表の場合、以下について向上が図れます。 FIX
属性を指定していない表と比べて、物理的な行長が1
列で2
バイト短くなるので、列数の多い表の場合はディスク所要量を削減できる。
UAP
で行単位インタフェースが使用できるため、列数が多くてもアクセス性能を向上 できる。Point NULL
値の利用が不要であり、かつ可変長列の使用の必要がない場合は、極力
FIX
表を 使用する付録B-2 列の属性
A)
十数バイト以下の列または格納されるデータが全行ほぼ同じ長さの場合、CHAR
属性を使 用する。VARCHARにはしない。B)
小数点以下を使用しない場合はINTEGER
を使用する。演算負荷が高いので、DECIMAL
は使用しない。C)
金額のデータにはFLOAT
を使用しない。誤差が出る。D)
半角文字と全角文字が混在して格納される値がある場合に限り混在文字データ型(MCHAR)を指定する。