私はさまざまなソリューション内で常にデータベースを使用していますが、実際にデータベースを設計することはありません。したがって、私は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を分割するより洗練された方法はありますか?
よろしくお願いします
イアン