• 検索結果がありません。

10-1 キーワード

ドキュメント内 HiRDB SQLコーディングガイドライン (ページ 85-102)

名前を指定する場合、引用符(")で囲んで指定することを推奨します。なお、名前を引 用符(

"

)で囲んだ場合、半角英小文字、及び半角英大文字は区別して扱います。

名前には、予約語と同じ名前を指定できませんが、引用符(

"

)で囲んだ場合は、予約語と 同じ名前を指定できます。

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 EMP

VALUES (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 EM

ORDER 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 ZA

WHERE ZA.TANKA > ? ;

×

SELECT ZA.ZSURYO FROM ZAIKO ZA

WHERE 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)を指定する。

E)

混在文字データ型(

MCHAR

)では半角文字、全角文字を意識するオーバヘッドが発生し 性能劣化を引き起こすため格納文字種別が半角/全角に特定できる場合は文字データ 型(

CHAR

)、各国文字データ型(

NCHAR

)を指定する。

F) VARCHAR

CHAR

型に全角文字を格納すると、

LIKE

述語で正しく判定されないので全 角文字を格納する場合は、NVARCHAR/NCHAR型またはMVARCHAR/MCHAR型を 指定すること。

G)

実長

256

バイト以上となることが多い文字列データ型の列の定義時には、

NO SPLIT

を指 定すると格納効率が向上する。バージョン09-50以降、NO SPLITを常に適用する。

H)

データ長が長くて非

FIX

表の

CHAR

MCHAR

NCHAR

の後方に空白が多い場合に、

SUPPRESSを指定する。スペースを抑止してDBに格納することにより、ディスク容量を削

減する。

Point

列属性は、適切なものを指定する

ドキュメント内 HiRDB SQLコーディングガイドライン (ページ 85-102)