1

私はさまざまなソリューション内で常にデータベースを使用していますが、実際にデータベースを設計することはありません。したがって、私はSQLのより細かい点にかなり慣れていません。私は多くのテーブルを持っているデータベースを持っていますが、2つの主要なものがあります:アイテム-リビジョンによって変化しないデータのために他の多くのテーブルを参照し、エントリ-リビジョンによって変化するデータのために他の多くのテーブルを参照しますしたがって、各アイテムは1つ以上のリビジョン(関連するすべてのデータを含む)。

ビューを使用して、すべてのリビジョン(およびその結果としてアイテム)のすべてのデータを選択したいと思います。私は次のように単一のクエリを構成しました:

CREATE VIEW Single_Query
AS
SELECT  i.REF_CODE AS REF
gp.GROUP_NAME AS Group
v.VERSION_NUMBER AS Version
GROUP_CONCAT(DISTINCT(cy.COUNTRY_DESCRIPTION) SEPARATOR ', ') AS Country
ey.PUB_DATE AS Published
GROUP_CONCAT(DISTINCT(ct.CONTRIBUTOR_NAME) SEPARATOR ', ') AS Author
i.ISBN_CODE AS ISBN
GROUP_CONCAT(DISTINCT CONCAT(cn.COMPONENT_NUMBER, _utf8', ',cn.COMPONENT_DESCRIPTION) SEPARATOR '; ') AS Contents
ey.NOTES AS Notes
i.PRICE AS Price
cl.COLOUR_DESCRIPTION AS Colour
FROM entry AS ey
JOIN item AS i ON ey.ITEM_ID = i.ITEM_ID
JOIN group AS gp ON i.GROUP_ID = gp.GROUP_ID
JOIN version AS v ON ey.VERSION_ID = v.VERSION_ID
JOIN link_country_item AS lci ON i.ITEM_ID = lci.ITEM_ID
JOIN country AS cy ON lci.COUNTRY_ID = cy.COUNTRY_ID
LEFT JOIN link_entry_contributor AS lec ON ey.ENTRY_ID = lec.ENTRY_ID
LEFT JOIN contributor AS ct ON lec.CONTRIBUTOR_ID = ct.CONTRIBUTOR_ID
JOIN contents AS cn ON i.ITEM_ID = cn.ITEM_ID
JOIN colour AS cl ON ey.COLOUR_ID = cl.COLOUR_ID
GROUP BY REF_CODE, VERSION_NUMBER

これは、わずかなエントリで完了するのに約29秒かかります。ただし、スクリプトを実行してアイテムデータ(およびすべての参照データ)とエントリデータ(およびすべての参照データ)の一時テーブルを作成する場合は、ITEM_IDに単一のJOINがある2つの一時テーブルからロット全体を選択します。完了するのに0.5秒もかかりません。

他にも多くの参照テーブルがあることに注意してください(わかりやすくするために省略しています)。

役立つ場合は、itemテーブルがグループ、設定(many-many link_country_itemテーブルを介して)およびcontentsテーブルを参照します。

エントリテーブルは、バージョン、コントリビューター(many-many link_entry_contributorテーブルを介して)およびカラーテーブルを参照します。

問題は、一時テーブルをビューで使用できないため、常に一時テーブルを使用したくないということです(または、少なくともその方法がわかりません)。このシナリオでSQLをより高速に実行できるように、ビューでSQLを分割するより洗練された方法はありますか?

よろしくお願いします

イアン

4

1 に答える 1

0

クエリの順序を少し再構成しました。REF_CODEに関するコメントをご覧ください。ですから、あなたは正しいです、元のインデックスの答えはあなたのためにカバーしません。ただし、アイテムテーブルがプライマリ位置にある場合、テーブルから開始するときに(REF_CODE、ITEM_ID)にインデックスがあり、それに対応するGROUP BY句のインデックスがあると、パフォーマンスが向上します。

CREATE VIEW Single_Query
AS
SELECT STRAIGHT_JOIN
      i.REF_CODE AS REF
      gp.GROUP_NAME AS Group
      v.VERSION_NUMBER AS Version
      GROUP_CONCAT(DISTINCT(cy.COUNTRY_DESCRIPTION) SEPARATOR ', ') AS Country
      ey.PUB_DATE AS Published
      GROUP_CONCAT(DISTINCT(ct.CONTRIBUTOR_NAME) SEPARATOR ', ') AS Author
      i.ISBN_CODE AS ISBN
      GROUP_CONCAT(DISTINCT CONCAT(cn.COMPONENT_NUMBER, _utf8', ',cn.COMPONENT_DESCRIPTION) SEPARATOR '; ') AS Contents
      ey.NOTES AS Notes
      i.PRICE AS Price
      cl.COLOUR_DESCRIPTION AS Colour
   FROM 
      item AS i 
         JOIN entry ey
            ON i.ITEM_ID = ey.ITEM_ID
            JOIN version AS v  
               ON ey.VERSION_ID = v.VERSION_ID
            JOIN colour AS cl 
               ON ey.COLOUR_ID = cl.COLOUR_ID
            LEFT JOIN link_entry_contributor AS lec 
               ON ey.ENTRY_ID = lec.ENTRY_ID
               LEFT JOIN contributor AS ct 
                  ON lec.CONTRIBUTOR_ID = ct.CONTRIBUTOR_ID
         JOIN group AS gp 
            ON i.GROUP_ID = gp.GROUP_ID
         JOIN link_country_item AS lci 
            ON i.ITEM_ID = lci.ITEM_ID
            JOIN country AS cy 
               ON lci.COUNTRY_ID = cy.COUNTRY_ID
         JOIN contents AS cn 
            ON i.ITEM_ID = cn.ITEM_ID
   GROUP BY 
      REF_CODE, 
      VERSION_NUMBER
于 2013-01-22T18:11:05.867 に答える