ORACLE TECHNOLOGY NETWORK
 
 
   

Oracle Technology Network (OTN) Japan - 掲示板 » テクノロジー » プログラミング一般

スレッド: select文でアスタリスク使用

このスレッドに返信する このスレッドに返信する スレッド一覧へ スレッド一覧へ

Permlink 返信数: 20 - ページ数: 2 [ 1 2 | 次へ ] - 最新投稿 : 2004/07/08 6:47 最新投稿者: s_koike - スレッド表示形式:
s_koike

投稿数: 31
登録日時: 02/10/25


select文でアスタリスク使用
投稿時刻: 2004/07/06 20:16
  このスレッドに返信します… 返信

select文で全ての列を表示させるのに
select * from table名
と書くより
select 列1,列2....最後の列 from table名
と全部列名を書いて実行させたほうが
パフォーマンスが良いと聞いたことがあるのですが
これは本当でしょうか?
みなさんもプログラム中にアスタリスクを使用せずに
面倒でも何十個も列名を書いているのでしょうか?


U210715869

投稿数: 2,689
登録日時: 00/05/15


RE:select文でアスタリスク使用
投稿時刻: 2004/07/06 20:22   s_koike さんへの返信です。 s_koike さんへの返信です。
  このスレッドに返信します… 返信

>select文で全ての列を表示させるのに
>select * from table名
>と書くより
>select 列1,列2....最後の列 from table名
>と全部列名を書いて実行させたほうが
>パフォーマンスが良いと聞いたことがあるのですが
>これは本当でしょうか?

s_koike さん、こんにちは。
全項目ということであれば、それほど差はないでしょう。
ただ、項目指定で必要項目のみ取り出しているのであれば、
性能に差が出る可能性はあります。
それよりも、メンテナンス面を考えるときちんと項目を書いたほうが
その後の対応が少なくてすみそうです。
*指定だと、項目が1つ追加になった時にアプリ修正が必要になります。


でで

投稿数: 9,980
登録日時: 00/10/25


RE:select文でアスタリスク使用
投稿時刻: 2004/07/06 20:34   s_koike さんへの返信です。 s_koike さんへの返信です。
  このスレッドに返信します… 返信

>と全部列名を書いて実行させたほうが
>パフォーマンスが良いと聞いたことがあるのですが
>これは本当でしょうか?

parse時間に関係すると聞いたことがあります。
全項目であれば、fetchには関係ないでしょう。

>みなさんもプログラム中にアスタリスクを使用せずに
>面倒でも何十個も列名を書いているのでしょうか?

書きます。


C

投稿数: 440
登録日時: 01/03/14


RE:select文でアスタリスク使用
投稿時刻: 2004/07/06 21:06   s_koike さんへの返信です。 s_koike さんへの返信です。
  このスレッドに返信します… 返信

>select文で全ての列を表示させるのに
>select * from table名
>と書くより
>select 列1,列2....最後の列 from table名
>と全部列名を書いて実行させたほうが
>パフォーマンスが良いと聞いたことがあるのですが
>これは本当でしょうか?
>みなさんもプログラム中にアスタリスクを使用せずに
>面倒でも何十個も列名を書いているのでしょうか?

こんばんは。
過去に話題となったことがあります。

http://otn.oracle.co.jp/cgi-bin/non/msgview_r.cgi?communityid=otn-
489965&bbsid=1&no=38182&view=9

参照してみてください。パフォーマンスについても少し触れられています。

s_koike

投稿数: 31
登録日時: 02/10/25


ありがとうございました
投稿時刻: 2004/07/06 21:20   s_koike さんへの返信です。 s_koike さんへの返信です。
  このスレッドに返信します… 返信

丁寧な返答ありがとうございました。
パフォーマンス以外にもメンテナンスにも気をくばらないと
いけないですね^^;


hoge

投稿数: 11,815
登録日時: 99/03/15


RE[1]:select文でアスタリスク使用
投稿時刻: 2004/07/06 23:26   U210715869 さんへの返信です。 U210715869 さんへの返信です。
  このスレッドに返信します… 返信

>それよりも、メンテナンス面を考えるときちんと項目を書いたほうが
>その後の対応が少なくてすみそうです。
>*指定だと、項目が1つ追加になった時にアプリ修正が必要になります。

メンテナンス面については同意ですが、項目が一つ追加に
なった場合、必ずアプリの修正が必要かというと必ずしも
そうとは言えないかと思います。
insert文で列名を省略している場合かつdefault指定していない場合は
アプリの修正が必要になるかと思いますが、selectに関しては
追加された列を使用することがなければ修正は不要ですね。
これは*指定していてもしていなくても言えることですが。



ゲスト

RE:select文でアスタリスク使用
投稿時刻: 2004/07/07 8:52   s_koike さんへの返信です。 s_koike さんへの返信です。
  このスレッドに返信します… 返信

いろんな人が答えていますが本当らしいですよ。
select count(*) from ****;
よりも
select count(ROWID) from ****;
の方が良いらしいです。
コーディング規約で決められている会社すらあります。


s_koike

投稿数: 31
登録日時: 02/10/25


RE[1]:select文でアスタリスク使用
投稿時刻: 2004/07/07 9:04   ゲスト さんへの返信です。 ゲスト さんへの返信です。
  このスレッドに返信します… 返信

>select count(*) from ****;
>よりも
>select count(ROWID) from ****;
>の方が良いらしいです。
>コーディング規約で決められている会社すらあります。

おお、そういうカウント文のやり方もありましたか^^
主キーを指定してカウントすると全索引検索になるから早いらしいというのは
知っていたのですが、今いろいろ試してみたら、take423のように
ROWIDでカウントするのが一番早かった♪
使わせていただきます^^

thetis

投稿数: 110
登録日時: 02/12/16


RE[2]:select文でアスタリスク使用
投稿時刻: 2004/07/07 10:27   s_koike さんへの返信です。 s_koike さんへの返信です。
  このスレッドに返信します… 返信

http://otn.oracle.co.jp/cgi-bin/non/msgview_r.cgi?communityid=otn-901234&bbsid=1&no=22168&view=9
という意見もありますが。(^^;

hoge

投稿数: 11,815
登録日時: 99/03/15


RE[2]:select文でアスタリスク使用
投稿時刻: 2004/07/07 11:41   s_koike さんへの返信です。 s_koike さんへの返信です。
  このスレッドに返信します… 返信

>おお、そういうカウント文のやり方もありましたか^^
>主キーを指定してカウントすると全索引検索になるから早いらしいというのは
>知っていたのですが、今いろいろ試してみたら、take423のように
>ROWIDでカウントするのが一番早かった♪

気のせいではないですか?実際にSQLトレースで確認されましたか?
ちなみに以下は10万件のcountです。
それはともかくプログラムでrowidは使わないほうがよいと思うのですけど・・・

select count(rowid) from a

call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.01 0.02 1 1 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 1 0.04 0.21 810 815 0 1
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 3 0.06 0.24 811 816 0 1


select count(*) from a

call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.01 0.02 1 1 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 1 0.01 0.17 810 815 0 1
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 3 0.03 0.20 811 816 0 1



sdtashenjie

投稿数: 1,841
登録日時: 02/10/19


RE:select文でアスタリスク使用
投稿時刻: 2004/07/07 12:26   s_koike さんへの返信です。 s_koike さんへの返信です。
  このスレッドに返信します… 返信

>select文で全ての列を表示させるのに
>select * from table名
>と書くより
>select 列1,列2....最後の列 from table名
>と全部列名を書いて実行させたほうが
>パフォーマンスが良いと聞いたことがあるのですが
>これは本当でしょうか?
>みなさんもプログラム中にアスタリスクを使用せずに
>面倒でも何十個も列名を書いているのでしょうか?
s_koikeさん:
アスタリスクを使用して、確かに、便利ですが、ソースが読みにくいし、
よくない方法と思います。
列名を書いて、面倒ですけど、表変更する時に、対応しやすいです。

sdtashenjie (*_*)

ushitaki

投稿数: 7,079
登録日時: 98/10/30


RE[1]:select文でアスタリスク使用
投稿時刻: 2004/07/07 13:33   ゲスト さんへの返信です。 ゲスト さんへの返信です。
  このスレッドに返信します… 返信

>いろんな人が答えていますが本当らしいですよ。

いろんな人が答えていますが... ほとんどデマです。
parse の違いがあっても誤差の範囲です。

不要な列の値まで持ってくるのであれば
* か列を明確に書くかと言う問題ではありません。
データ量が違うのですから同じ土俵では論ぜられません。


>select count(*) from ****;
>よりも
>select count(ROWID) from ****;
>の方が良いらしいです。
>コーディング規約で決められている会社すらあります。

こちらは明らかにデマですので
コーディング規約を書き直した方が良いでしょう。


ushitaki

投稿数: 7,079
登録日時: 98/10/30


RE[2]:select文でアスタリスク使用
投稿時刻: 2004/07/07 13:47   s_koike さんへの返信です。 s_koike さんへの返信です。
  このスレッドに返信します… 返信

>主キーを指定してカウントすると全索引検索になるから早いらしいというの

>知っていたのですが、今いろいろ試してみたら、take423のように
>ROWIDでカウントするのが一番早かった♪
>使わせていただきます^^

使わないで下さい。
パフォーマンス上の効果が一切無い上に
解りにくくなりメンテナンス性も落ちるだけですから。

また、主キーを指定しても速くはなりません。
where の方を工夫しないと意味はありません。

count(*) に関しては count(*) で一つの関数です。
from,where,groupby 条件だけ
index scan されるかどうか決まります。

一方の count(列名) では、列名も影響します。
where の方で別のインデックスのみで検索できたとしても
count(主キー) とかした際にはわざわざテーブル本体を
見に行かなければならなくなるので遅くなります。


例)
scott.emp の Primary Key は empno です。
create index i_emp_dept on scott.emp(deptno);

explain plan for
select count(*) from scott.emp
where deptno=10;
@?/rdbms/admin/utlxpls
Plan Table
----------------------------------------
| Operation | Name |
----------------------------------------
| SELECT STATEMENT | |
| SORT AGGREGATE | |
| INDEX RANGE SCAN |I_EMP_DEP |
----------------------------------------

count(*) では新しく作成したインデックスだけのスキャンです。


explain plan for
select count(empno) from scott.emp
where deptno=10;
@?/rdbms/admin/utlxpls
Plan Table
----------------------------------------
| Operation | Name |
----------------------------------------
| SELECT STATEMENT | |
| SORT AGGREGATE | |
| TABLE ACCESS BY INDEX RO|EMP |
| INDEX RANGE SCAN |I_EMP_DEP |
----------------------------------------

count(主キー) では無駄な TABLE ACCESS が入ります。

explain plan for
select count(rowid) from scott.emp
where deptno=10;
@?/rdbms/admin/utlxpls
Plan Table
----------------------------------------
| Operation | Name |
----------------------------------------
| SELECT STATEMENT | |
| SORT AGGREGATE | |
| INDEX RANGE SCAN |I_EMP_DEP |
----------------------------------------

こちらは見た目は count(*) と変わりません。
将来も同じである保障はありません。
いずれにせよ、解りにくくなるだけです。


s_koike

投稿数: 31
登録日時: 02/10/25


RE[2]:select文でアスタリスク使用
投稿時刻: 2004/07/07 16:57   s_koike さんへの返信です。 s_koike さんへの返信です。
  このスレッドに返信します… 返信

>>ROWIDでカウントするのが一番早かった♪

>気のせいではないですか?実際にSQLトレースで確認されましたか?


SQL_TRACEやEXPLAINの実行結果の見方は本で読んだことがあるのですが
使い方がすぐに思い出せなかったので、 sql*plusでset timing onで
単純に時間だけを見てました>_<(しかも実行するたびに結果が逆転したり・・)
あとROWID=高速ってイメージが頭にあって早とちりしました。
教えてもらった参照ページやトレース結果を参考にさせていただきました。
countも単純に列に主キーを指定すれば早くなるわけじゃないようですね
自分が思っていたほど単純なものではないようです。
やはりSQL_TRACEやEXPLAINなどのツールを使いながらどれが最良なのかを
判断していくのが大事だと思いました。
まとめきれなくてすみません。


s_koike

投稿数: 31
登録日時: 02/10/25


RE:select文でアスタリスク使用
投稿時刻: 2004/07/07 16:58   s_koike さんへの返信です。 s_koike さんへの返信です。
  このスレッドに返信します… 返信

SELECT * FROM TABLEの件は
例えば20項目あるテーブルから18項目を取得する必要がある(残り2項目だけ
いらない)
という微妙なケースの場合を想定しています。最初はたった2項目必要ないだけで
18項目列名を書くのは、ソースがずら〜っと増えるので、仕様者が嫌うのかなぁ

感じていたんですが、ソースが増えるよりトラフィックが増える方が嫌ですし
メンテナンス面においても列名を記述して行った方が、メリットの方が多いと
感じました。速度の方も少なくとも*を使うより列名を記述した方が遅くなること

ないと感じたので、プログラムを書くときは
・必要な項目の取得はもちろんその列名だけを記述し
・全項目取得する場合も全ての列名を記述していく
スタンスで行きたいと思います。

あと仕事場でコーディング規約とかあるのか確認もしてみます^^;
ありがとうございました。






ウェブサイトのご使用条件 | 個人情報保護基本方針/情報保護基本方針