- PR -

最も効率的なデータ取得方法について

1
投稿者投稿内容
ともこ
大ベテラン
会議室デビュー日: 2007/09/14
投稿数: 111
投稿日時: 2007-11-21 11:42
いつも勉強させていただいております、よろしくお願いします。

現在VB(6.0)でSQLサーバー(2000 SP3a)のデータを取得するプログラムを開発しています。その際、テーブルAとテーブルBからデータを取得するのですが、最も効率的な(処理速度の速い)方法はどういったものか調査しています。私が考えている方法が幾つかありますので、アドバイスを頂けると助かります。

具体的には、
 テーブルA・・・カラム数100(必要なカラム数10)、レコード数10000
 テーブルB・・・カラム数500(必要なカラム数10)、レコード数10000
 ビューA ・・・テーブルAから必要なカラム数10のみを抽出
 ビューB ・・・テーブルBから必要なカラム数10のみを抽出
 ビューC ・・・ビューAとビューBを連結
とします。

上記の条件下で、以下の@〜Bの方法を考えています。
 @『テーブルAとテーブルBを結合し、必要なカラム数のみ抽出する』ストアドプロシージャを実行する
 A『ビューAとビューBを結合し、必要なカラム数のみ抽出する』ストアドプロシージャを実行する
 BビューCを予め作成しておき、『ビューCから抽出する』ストアドプロシージャを実行する
私の推測ですと、
Bがストアドプロシージャ実行後にテーブルやビューを結合する作業が無い分だけ処理速度が速い、
次にAが必要なカラムのみのビューを結合するので扱うデータ量が少なく処理速度が速い、
最後に@が大量のデータを持ったテーブルを結合するので処理速度が遅い
と考えています。
このような考え方は正しいのでしょうか?
また、実際に処理内容(実行プラン?)や経過時間を計測する方法が分かりません。みなさんはどのようにして開発を行なっているのでしょうか?

説明が長くなってしまいましたが、アドバイスをお願いします。
よっしー
大ベテラン
会議室デビュー日: 2007/05/17
投稿数: 143
投稿日時: 2007-11-21 12:33
ともこさん、こんにちは。

ここだけ。
引用:

また、実際に処理内容(実行プラン?)や経過時間を計測する方法が分かりません。みなさんはどのようにして開発を行なっているのでしょうか?


クエリアナライザの「クエリ」メニュー⇒「実行プランの表示」で実行プランは確認できます。
(ということでいいのですか?)
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2007-11-21 12:42
引用:

ともこさんの書き込み (2007-11-21 11:42) より:

また、実際に処理内容(実行プラン?)や経過時間を計測する方法が分かりません。みなさんはどのようにして開発を行なっているのでしょうか?


実行プランをとって、実際に評価してみた方がよいでしょう。
で、とり方ですが、
1.クエリアナライザを起動
2.メニューからクエリ->実行プランの表示を選択。
3.SQLを実行してみる
4.実行結果の欄において、実行プランというタブがあるので、それを選択すれば表示される。

または、ツールバーに推定実行プランの表示(Ctrl + L)を選択してもとれます。

前者は実際の実行プラン、後者は推定プランって事かねぇ?
よくわかんない。
こあら
大ベテラン
会議室デビュー日: 2007/06/26
投稿数: 157
投稿日時: 2007-11-21 14:23
引用:

Bがストアドプロシージャ実行後にテーブルやビューを結合する作業が無い分だけ処理速度が速い、
次にAが必要なカラムのみのビューを結合するので扱うデータ量が少なく処理速度が速い、
最後に@が大量のデータを持ったテーブルを結合するので処理速度が遅い
と考えています。
このような考え方は正しいのでしょうか?



一般的に言う「ビュー」の正体は、テーブルのサブセットを取得するクエリです。
つまり「ビュー」を取得するために内部的にクエリを発行しているのです。
従って、上記のような考え方は誤りです。

#DBMSによっては、実体を持つビューを作ることができたり、
#ビューを実行するときに、親クエリに展開して実行する機能があったりします。

もう一つ言うと、
> 大量のデータを持ったテーブルを結合するので処理速度が遅い
については「当たっている部分もある」くらいです。

仮に10000件のテーブルAと10000件のテーブルBを結合する場合、
インデックスが無ければ(有効に機能しなければ)件数に比例して遅くなるでしょう。

しかし、PKで結合できるような通常のケースであれば、
一レコードについて結合する相手レコードの検索に掛かるコストは一レコード分です。
(ちょっと日本語がおかしいかも?)このようなイメージですね。
select * from A where Exists(select 0 from B where B.PK = A.PK)

#実際はもっと効率の良い検索ロジックが採用される場合も多いですが。



最も効率的な方法は、オプティマイザの気持ちになって考えましょう。
ともこ
大ベテラン
会議室デビュー日: 2007/09/14
投稿数: 111
投稿日時: 2007-11-21 14:53
よっしーさん、かずくんさん、こあらさん、お返事ありがとうございます。

■実行プランについて、
実行プランの使用方法が分かりました、現在どういった機能があるのか手探り状態で実行している最中です。
SELECT実行からどういった順序で処理が進むのか?がフロー図で表示される事と、
「コスト」の数値が大きい所が処理に時間がかかっているかが分かるという事、
この2つが分かりました。
その他に何か有効な使用方法などはありますでしょうか?

■ビューについて、
「ビューは実態が無い為、事前に作成していても、ストアドの中で作成(条件選択)しても実質変わりない」と言った感じの認識でよろしいのでしょうか?

■オプティマイザについて、
「クエリオプティマイザ」についてインターネットで調べてみました。難しい内容が沢山紹介してあったので、後学の為に後で読んでみようと思います^^;

1

スキルアップ/キャリアアップ(JOB@IT)