返信数:
20
-
ページ数:
2
[
1
2
| 次へ
]
-
最新投稿
:
2004/07/08 6:47
最新投稿者: s_koike
-
スレッド表示形式:
フラット表示
スレッド表示
ツリー表示
select文でアスタリスク使用
投稿時刻:
2004/07/06 20:16
select文で全ての列を表示させるのに select * from table名 と書くより select 列1,列2....最後の列 from table名 と全部列名を書いて実行させたほうが パフォーマンスが良いと聞いたことがあるのですが これは本当でしょうか? みなさんもプログラム中にアスタリスクを使用せずに 面倒でも何十個も列名を書いているのでしょうか?
投稿数:
2,689
登録日時:
00/05/15
RE:select文でアスタリスク使用
投稿時刻:
2004/07/06 20:22
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 さんへの返信です。
>と全部列名を書いて実行させたほうが >パフォーマンスが良いと聞いたことがあるのですが >これは本当でしょうか? parse時間に関係すると聞いたことがあります。 全項目であれば、fetchには関係ないでしょう。 >みなさんもプログラム中にアスタリスクを使用せずに >面倒でも何十個も列名を書いているのでしょうか? 書きます。
RE:select文でアスタリスク使用
投稿時刻:
2004/07/06 21:06
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 参照してみてください。パフォーマンスについても少し触れられています。
ありがとうございました
投稿時刻:
2004/07/06 21:20
s_koike さんへの返信です。
丁寧な返答ありがとうございました。 パフォーマンス以外にもメンテナンスにも気をくばらないと いけないですね^^;
投稿数:
11,815
登録日時:
99/03/15
RE[1]:select文でアスタリスク使用
投稿時刻:
2004/07/06 23:26
U210715869 さんへの返信です。
>それよりも、メンテナンス面を考えるときちんと項目を書いたほうが >その後の対応が少なくてすみそうです。 >*指定だと、項目が1つ追加になった時にアプリ修正が必要になります。 メンテナンス面については同意ですが、項目が一つ追加に なった場合、必ずアプリの修正が必要かというと必ずしも そうとは言えないかと思います。 insert文で列名を省略している場合かつdefault指定していない場合は アプリの修正が必要になるかと思いますが、selectに関しては 追加された列を使用することがなければ修正は不要ですね。 これは*指定していてもしていなくても言えることですが。
RE:select文でアスタリスク使用
投稿時刻:
2004/07/07 8:52
s_koike さんへの返信です。
いろんな人が答えていますが本当らしいですよ。 select count(*) from ****; よりも select count(ROWID) from ****; の方が良いらしいです。 コーディング規約で決められている会社すらあります。
RE[1]:select文でアスタリスク使用
投稿時刻:
2004/07/07 9:04
ゲスト さんへの返信です。
>select count(*) from ****; >よりも >select count(ROWID) from ****; >の方が良いらしいです。 >コーディング規約で決められている会社すらあります。 おお、そういうカウント文のやり方もありましたか^^ 主キーを指定してカウントすると全索引検索になるから早いらしいというのは 知っていたのですが、今いろいろ試してみたら、take423のように ROWIDでカウントするのが一番早かった♪ 使わせていただきます^^
投稿数:
11,815
登録日時:
99/03/15
RE[2]:select文でアスタリスク使用
投稿時刻:
2004/07/07 11:41
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
投稿数:
1,841
登録日時:
02/10/19
RE:select文でアスタリスク使用
投稿時刻:
2004/07/07 12:26
s_koike さんへの返信です。
>select文で全ての列を表示させるのに >select * from table名 >と書くより >select 列1,列2....最後の列 from table名 >と全部列名を書いて実行させたほうが >パフォーマンスが良いと聞いたことがあるのですが >これは本当でしょうか? >みなさんもプログラム中にアスタリスクを使用せずに >面倒でも何十個も列名を書いているのでしょうか? s_koikeさん: アスタリスクを使用して、確かに、便利ですが、ソースが読みにくいし、 よくない方法と思います。 列名を書いて、面倒ですけど、表変更する時に、対応しやすいです。 sdtashenjie (*_*)
投稿数:
7,079
登録日時:
98/10/30
RE[1]:select文でアスタリスク使用
投稿時刻:
2004/07/07 13:33
ゲスト さんへの返信です。
>いろんな人が答えていますが本当らしいですよ。 いろんな人が答えていますが... ほとんどデマです。 parse の違いがあっても誤差の範囲です。 不要な列の値まで持ってくるのであれば * か列を明確に書くかと言う問題ではありません。 データ量が違うのですから同じ土俵では論ぜられません。 >select count(*) from ****; >よりも >select count(ROWID) from ****; >の方が良いらしいです。 >コーディング規約で決められている会社すらあります。 こちらは明らかにデマですので コーディング規約を書き直した方が良いでしょう。
投稿数:
7,079
登録日時:
98/10/30
RE[2]:select文でアスタリスク使用
投稿時刻:
2004/07/07 13:47
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(*) と変わりません。 将来も同じである保障はありません。 いずれにせよ、解りにくくなるだけです。
RE[2]:select文でアスタリスク使用
投稿時刻:
2004/07/07 16:57
s_koike さんへの返信です。
>>ROWIDでカウントするのが一番早かった♪ >気のせいではないですか?実際にSQLトレースで確認されましたか? SQL_TRACEやEXPLAINの実行結果の見方は本で読んだことがあるのですが 使い方がすぐに思い出せなかったので、 sql*plusでset timing onで 単純に時間だけを見てました>_<(しかも実行するたびに結果が逆転したり・・) あとROWID=高速ってイメージが頭にあって早とちりしました。 教えてもらった参照ページやトレース結果を参考にさせていただきました。 countも単純に列に主キーを指定すれば早くなるわけじゃないようですね 自分が思っていたほど単純なものではないようです。 やはりSQL_TRACEやEXPLAINなどのツールを使いながらどれが最良なのかを 判断していくのが大事だと思いました。 まとめきれなくてすみません。
RE:select文でアスタリスク使用
投稿時刻:
2004/07/07 16:58
s_koike さんへの返信です。
SELECT * FROM TABLEの件は 例えば20項目あるテーブルから18項目を取得する必要がある(残り2項目だけ いらない) という微妙なケースの場合を想定しています。最初はたった2項目必要ないだけで 18項目列名を書くのは、ソースがずら〜っと増えるので、仕様者が嫌うのかなぁ と 感じていたんですが、ソースが増えるよりトラフィックが増える方が嫌ですし メンテナンス面においても列名を記述して行った方が、メリットの方が多いと 感じました。速度の方も少なくとも*を使うより列名を記述した方が遅くなること は ないと感じたので、プログラムを書くときは ・必要な項目の取得はもちろんその列名だけを記述し ・全項目取得する場合も全ての列名を記述していく スタンスで行きたいと思います。 あと仕事場でコーディング規約とかあるのか確認もしてみます^^; ありがとうございました。