• ベストアンサー

MySQLのviewはデータをコピーするのですか?それともエイリアスのようなものですか?

Webページのアクセスの度に、毎回大きいテーブル同士をJOINするのは効率が悪いと思います。 そのような場合、大きいテーブル同士をJOINしたVIEWを作成しておけば、データはコピーされて速度が増すのでしょうか? それとも、データはコピーされずに、結局、SELECTされる毎に内部的に毎回JOINされているのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

>100万行のテーブルのビューを作っても、ハードディスクを全く消費しない DB格納スペースとしてはそうですが、ビュー経由で検索したときにORDER BY、GROUP BY、DISTINCTなどを行いソートが発生すれば、当然、作業用のメモリが消費されます。また、インデクスのキー以外の列を検索したり、ジョインでインデクスを有効利用できなければ、やはり作業用のメモリが消費されます。 作業用のメモリは、一時的なファイルとして、OSやRDBMSによりHDDに吐き出されることはあります。 >テーブルをJOINしたVIEWを作ったとき、そのVIEWがSELECTされる度に、毎回JOINするので、パフォーマンスアップにはならない 「ビューを経由したから」という意味では、性能改善には直結しません。 ただし、よく利用される検索パターンであったりして、DBバッファ上にデータが残っていて、結果的に実I/O減になることはあるかも知れません。 また、TEXT型やBLOB型などは、1行の情報が物理的には複数行に分割して格納されるので、ビューを経由することで、「不必要にそういった列を操作する」といった無駄は省けるかも知れません。 100万件規模のデータから、ジョインして絞り込んだ結果を、Webサービスで頻繁に利用するなら、絞り込んだ結果を実体のある表に格納しておけばどうでしょうか? 当初考えていた「ビューでジョイン」ということは、「そのビュー経由では更新しない」ということ(多くのRDBMSの制限で、MySQLも同じ)になりますから。 データの反映間隔、反映方法などの検討が必要になりますけどね。

sweepea
質問者

お礼

ありがとうございました。 上記のご回答、完璧には理解していませんが、なんとなく(75%ほど)は理解しました。 > 絞り込んだ結果を実体のある表に格納しておけば・・・ それは、同じデータを別々のテーブルに重複して登録するということでしょうか? もしそうであれば、いわゆる正規化というのは、実際の業務では理想にすぎないということでしょうか? 実務経験に乏しくて、他の方がどのようにしてるのか、想像がつきません・・・。 ともかく、ご回答ありがとうございました。 VIEWはテーブルのコピーではないということは分かりました。ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.3

>もしそうであれば、いわゆる正規化というのは、実際の業務では理想にすぎないということでしょうか? 業務で通常使用するテーブルは、当然、正規化します。 大規模なシステムでそれらのテーブル群を直接、多量のユーザから参照、更新、追加、削除などが行われると性能を十分出せない場合があります。 そのため、レプリカを作って、一方を更新系、他方を参照系のみといった運用はよく行われることです。 「ジョインの結果をWebサービス中に、なるべく高パフォーマンスで参照させたい」なら、他のテーブルからジョインした結果を参照専用のテーブルに格納し、そのテーブルを参照させるようにする運用も考えられるということです。 更新等は基のテーブルで行い、定期的に参照専用のテーブルに反映させます。 ただ、ジョインした結果が100万件といった単位で、繰り返し参照されるようなデータでないなら、この方式は効果はありません。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

ビューはあくまでも仮想の表であり、ビュー経由で操作時に、基の表を操作することになります。

sweepea
質問者

補足

ありがとうございます。 ということは、 ・100万行のテーブルのビューを作っても、ハードディスクを全く消費しない ・テーブルをJOINしたVIEWを作ったとき、そのVIEWがSELECTされる度に、毎回JOINするので、パフォーマンスアップにはならない ということで、間違いないでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ビューテーブル

    初心者的な質問です。 オラクルデータベースで、検索速度向上の為に ビューテーブルを作る事になりました。 ちょっといまいちわからないのですが、検索条件を 項目として作れば良いのでしょうか?? また、ビューテーブルを作って場合に、そのテーブルに データが入るタイミングとかってどうなっているのでしょうか?? ビューを使わないとしたら 7つのテーブルを参照して、検索をしなければなりません。 環境は、Webです。 ASPからUNIXのオラクル8にアクセスしています。 補足する必要があれば言って下さい。 可能な限り書きます。

  • ビューで引数を使いたい

    4つのテーブルのいずれかをアクセスしますが、 select文はひとつでwhereでテーブルを指定したいので、  例:select * from ビュー where table_no=1 とかで、table_noの値でアクセスするビューは 作れますか? ※この例の場合、select * from table1が実行したい。 4つのテーブルは全て同じ構造で、 データが違うのみです。

  • viewでfrom句にサブクエリが書けない

    こんにちは。MYSQLのVIEWの代替についてお教え下さい。 下記でinner joinについて教えて頂きました。 http://okwave.jp/qa/q7296711.html 環境はWin 7 MYQL5です。 t1テーブルのデータ ID,在庫 001,22 t2テーブルのデータ ID,出庫 001,17 001,3 SELECT A.z AS `在庫`,B.* FROM (SELECT SUM(stock) AS z FROM t1 WHERE id='001' GROUP BY id) A INNER JOIN t2 B ON A.id=B.id というコードで、それぞれのテーブルをグループ化してグループ化したもの同士をJOINしました。 このコードを元にVIEWを作り、そのVIEWを対象にクエリを作ろうと考えていました。 しかしながら、MYSQLのVIEWではFROM句でサブクエリは使えませんでした。 http://www.klab.jp/media/mysql/index4.html 上記のコードを書きなおして、なんとしてもVIEWで利用したいのですが、FROM句でサブクエリを使わずにVIEWを作成する方法がわかりません。 どのようにリライトすればよいか、ご助言お願い致します。

    • ベストアンサー
    • MySQL
  • データシートビューからフォームビューへ切り替えられない。

    こんにちは。 以前、DexMachina様にご教授頂いたのですが 違うフォームを作っていたら データシートビューからフォームビューへ切り替えられないので教えてくださいませ。(アクセス2003) 前回質問:http://okwave.jp/qa4982081.html フォーム上(デザインビュー)にテーブルをドラッグしました。 (サブフォームのデフォルトのビューは、データシートビューになっていますが単票ビューに切り替えました。) 一度保存し、再度フォームを開くと、単票ビューで表示されるので その状態で、 Sub test() Forms("フォーム1").SetFocus Select Case Forms("フォーム1").Form.CurrentView Case 1 'フォームビューの場合 → データシートビューに切替 DoCmd.RunCommand acCmdSubformDatasheetView ' Forms("フォーム1").DefaultView = 2 Case 2 'データシートビューの場合 → ピボットテーブルに切替 DoCmd.RunCommand acCmdSubformPivotTableView End Select End Sub を実行すると、ちゃんとデータシートビューに切り替わります。 そしてデータシートビューからフォームビューへ切り替えようと思い 再度上記のコードを実行しても何も起こりません。 (エラーにもなりません) なぜでしょうか? ちなみに規定のビューをデータシートビューにして上記マクロを実行しても同様何も起こりません。データシートビューのままです。 MsgBox Forms("フォーム1").DefaultView で値を取得してみたら データシートビューでもフォームビューでも0が返って来ます。 何か原因がわかる方いらっしゃいましたら ご教授よろしくお願いします。

  • Viewを作ると遅くなる?

    Viewを作成してそのViewに対してWhere句で条件を付けて検索する場合と、 Viewを作成せずに直接Where句で条件を付けて検索する場合と、どちらが パフォーマンスがよいでしょうか? (1)Viewを使わない例 SELECT 伝票番号,伝票日付,金額 FROM 伝票 WHERE 伝票番号=1 (2)Viewを使う例  あらかじめViewを作成しておく CREATE VIEW TEST_VIEW AS SELECT 伝票番号,伝票日付,金額 FROM 伝票 以下のSQL文を発行する SELECT * FROM TEST_VIEW WHERE 伝票番号=1 このような質問をした訳は、元となるテーブルの全件を対象とした Viewを作った場合、毎回テーブルフルスキャンを行ってViewを作成 したあとにWHERE句の絞り込みを行うのかどうかが気になったから です。

  • Accessでテーブルをデータシートビューで開けない

    ここ数日、AccessでAテーブルをデータシートビューで開こうとすると、ODBC すべてのレコードをロックできません、というメッセージが出てしまいます。デザインビューで開くことはできるのですが、このAテーブル(リンクテーブル)を使って新規クエリを作ることもできなくなってしまいました。 前に作ったクエリは普通に開くことができます。 Aテーブルを使わずにクエリを作成すると、問題なくできます。 設定を変えた記憶はないのですが、どうしたら元通りになるのでしょうか。 よろしくお願いします。

  • MySQLのCREATE VIEWがうまく動作しません。

    SQL初心者です。今回仕事で使う事になり、Win98に MySQL Ver3.23.51をインストールしたのですが、 CREATE VIEW文がうまく動作しません。 例えば MAIN と言うテーブルが存在する時に MySQLプロンプト上で SELECT * FROM MAIN; とやるとちゃんと動作して表示してくれるのですが、 これをTEMPと言うビューを作成したい場合に CREATE VIEW TEMP AS SELECT * FROM MAIN; とやると ERROR 1064: You have an error in your SQL syntax near \'VIEW TEMP AS SELECT * FROM MAIN\' at line 1 と出て来てしまいます。文法的には間違ってないはずなのですが、何がいけないのでしょうか?MySQLはCREATE VIEW文をサポートしていないのでしょうか? 周りに詳しい人間がいないので、原因がわからなくて つまづいています。どうかよろしくお願いします.

  • VIEWに対してWHERE句をつける

    SQLでVIEWを作成し、そのVIEWに対してSELECT文を書くときに、そのVIEWに対してWHERE句をつけるのは、パフォーマンスを必ず下げることになるのでしょうか?勝手な認識ですが、VIEWにWHERE句をつけると遅くなる場合があると聞きました。VIEWの組み方にももちろんよると思いますが、VIEWは消極的に使い、出来る限りJOINなどして結合したSQLを書くほうが無難なのでしょうか?よろしくお願いいたします。

  • デザインビューで、連結式 を表示できません について

    毎度お世話になっております。 XP、ACCESS2003を使用しております。 クエリにSQL文を記入し実行後、 データシートビューでは結果が表示されるのですが、 デザインビューにすると デザインビューで、連結式 t1.CODE = t2.CODE を表示できません。 とメッセージがでます。 SQL文は以下の通りです。 SELECT t1.CODE FROM テーブル1 as t1 LEFT JOIN (SELECT テーブル2.CODE from テーブル2 ) as t2 ON t1.CODE = t2.CODE また、実行後にSQL文を編集しようとすると、 文字が途中で切れるような感じになります。 (fromのmを消すとoの半分も消えてしまいます。) このような状態は初めてです。 検索してもよくわかりませんでした。 よろしくお願いします。

  • ビューについて、教えてください

    いつもお世話になっております。 ビューについて、教えて下さい。 以下のビュー「ABVW」を作成しましたが、TBLAやTBLBの内容が変更された場合、 ビュー上のデータは自動で置き換わるのでしょうか? CREATE VIEW ABVW  SELECT * FROM TBLA UNION ALL SELECT * FROM TBLB 以上、よろしくお願いします。 ※いろいろなサイトではマテビューはリフレッシュ機能のようなものがあると書かれており、  マテビューを作成しようとしたのですが、TBLA/TBLBは”キーなし”が原因なのかは  わからないのですが、うまく作成できず、普通のビューで行うことにしました。

カラリオプリンターEP 両面印刷
このQ&Aのポイント
  • パソコン上での設定では両面印刷オフにしているのに、EPカラリオプリンターで印刷すると自動的に両面印刷されてしまう問題が発生しています。
  • EPカラリオプリンターの印刷設定が正しく反映されず、パソコン上での設定と異なる動作をしています。
  • EPカラリオプリンターの両面印刷の設定が解除できないため、印刷時に都度設定を変更する必要があります。
回答を見る