2017-12-11 8 views
-2

私は理由はわかりませんが、このクエリは2つの結果があっても実行には時間がかかりすぎます。SQLクエリが長すぎます - 同じIDを持つ複数のAND

私がしようとしているのは、users cテーブルのUID(プライマリキー)が他のすべてのテーブル(外部キー)のentity_idと一致していることです。それが私がしなければならないことです。

私の主キーと一致する必要がある外来キーが多すぎるということが問題だと思います。

SELECT 
       f.field_fmno_value as fo, 
       fn.field_full_name_value as fullname, 
       c.mail as email, 
       t.field_type_value as persontype, 
       ti.field_title_value as persontitle, 
       sc.field_skill_code_value as skillcode, 
       sg.field_skill_group_value as skillgroup, 
       dn.field_department_value as deptt, 
       r.field_region_for_real_value as region, 
       cl.field_region_value as citylocation, 
       goc.field_goc_office_value as goc, 
       hu.field_hub_value as hub,    
       ge.field_gender_value as gender, 
       ft.field_full_tenure_value as tenure, 
       tsa.field_tenure_since_associate_value as tass, 
       b.category as category, 
       b.subcategory as subcategory, 
       b.section as industry, 
       b.title as title, 

       a.browser_platform, b.path, b.title, a.referer, a.time, a.id 
      FROM 
       track_da_files a, track_da_files_paths b, users c, field_data_field_region_for_real r, 
       field_data_field_fo f, 
       field_data_field_full_name fn, 
       field_data_field_type t, 
       field_data_field_title ti, 
       field_data_field_s_code sc, 
       field_data_field_s_group sg, 
       field_data_field_department dn, 
       field_data_field_region cl, 
       field_data_field_g_office goc, 
       field_data_field_hub hu, 
       field_data_field_gender ge, 
       field_data_field_full_ten ft, 
       field_data_field_ten_since_associate tsa 

      where a.pid = b.pid AND a.uid = c.uid AND a.uid <> 0 
      AND c.uid = r.entity_id 
      AND c.uid = fn.entity_id 
      AND c.uid = f.entity_id 
      AND c.uid = t.entity_id 
      AND c.uid = ti.entity_id 
      AND c.uid = sc.entity_id 
      AND c.uid = sg.entity_id 
      AND c.uid = dn.entity_id 
      AND c.uid = cl.entity_id 
      AND c.uid = goc.entity_id 
      AND c.uid = hu.entity_id 
      AND c.uid = ge.entity_id 
      AND c.uid = ft.entity_id 
      AND c.uid = tsa.entity_id 

      GROUP a.pid 
      ORDER BY 1 DESC 
+0

質問には(1)テーブルのテーブル定義と(b)クエリの説明プランを追加してください。また、(3)ハードウェアでの実行にはどれくらいの時間がかかりますか、(4)どのような時間が受け入れられるでしょうか?提供されるソリューションは、10%のスピードアップか90%のスピードアップを望んでいるかによって異なります。 – halfer

+0

開始点として、これらのWHERE節のいくつかをANSIスタイルの結合に変更します。データベースオプティマイザがフィルタと結合が適切であることを理解するのに役立つと思います。 – halfer

+0

ありがとうございます、私は私の質問に詳細を追加しました。 – Steve

答えて

1

JOIN形式への改訂されたクエリ...また、GROUP BYは、集計を行っていないので無関係です。子レベルのテーブルのいずれかで複数のレコードを使用できる場合は、複数のレコードが強制的に使用される可能性があります。すべてがレコードの1:1の比率であれば、うまくいくはずです。複数のスキルグループなど、1つ以上の子テーブルで1:nの割合でデカルト結果が得られ、肥大化する可能性があります。

また、a.uid = c.uidのため、すべての基礎となるテーブルにa.uidを使用して、すべてが子テーブルとして表示されるようにすることもできます。私はこれらの子テーブルはすべてルックアップテーブルであると仮定し、それらのすべてはそれに基づいて結合された "uid"を表すそれぞれのフィールドにインデックスを持ちます。 MySQLの下にこのクエリに

SELECT 
     f.field_fmno_value as fo, 
     fn.field_full_name_value as fullname, 
     c.mail as email, 
     t.field_type_value as persontype, 
     ti.field_title_value as persontitle, 
     sc.field_skill_code_value as skillcode, 
     sg.field_skill_group_value as skillgroup, 
     dn.field_department_value as deptt, 
     r.field_region_for_real_value as region, 
     cl.field_region_value as citylocation, 
     goc.field_goc_office_value as goc, 
     hu.field_hub_value as hub,    
     ge.field_gender_value as gender, 
     ft.field_full_tenure_value as tenure, 
     tsa.field_tenure_since_associate_value as tass, 
     b.category as category, 
     b.subcategory as subcategory, 
     b.section as industry, 
     b.title as title, 
     a.browser_platform, 
     b.path, 
     b.title, 
     a.referer, 
     a.time, 
     a.id 
    FROM 
     track_da_files a 
     JOIN track_da_files_paths b 
      ON a.pid = b.pid 
     JOIN users c 
      ON a.uid = c.uid 
     JOIN field_data_field_region_for_real r 
      ON a.uid = r.entity_id 
     JOIN field_data_field_fo f 
      ON a.uid = f.entity_id 
     JOIN field_data_field_full_name fn 
      ON a.uid = fn.entity_id 
     JOIN field_data_field_type t, 
      ON a.uid = t.entity_id 
     JOIN field_data_field_title ti, 
      ON a.uid = ti.entity_id 
     JOIN field_data_field_s_code sc, 
      ON a.uid = sc.entity_id 
     JOIN field_data_field_s_group sg, 
      ON a.uid = sg.entity_id 
     JOIN field_data_field_department dn, 
      ON a.uid = dn.entity_id 
     JOIN field_data_field_region cl, 
      ON a.uid = cl.entity_id 
     JOIN field_data_field_g_office goc, 
      ON a.uid = goc.entity_id 
     JOIN field_data_field_hub hu, 
      ON a.uid = hu.entity_id 
     JOIN field_data_field_gender ge, 
      ON a.uid = ge.entity_id 
     JOIN field_data_field_full_ten ft, 
      ON a.uid = ft.entity_id 
     JOIN field_data_field_ten_since_associate tsa 
      ON a.uid = tsa.entity_id 
    where 
     a.uid <> 0 
    GROUP BY 
     a.pid 
    ORDER BY 
     1 DESC 

最後にもう一つの可能​​性は

SELECT STRAIGHT_JOIN 
     f.field_fmno_value as fo ...(rest of query). 

STRAIGHT_JOINは、すべてが子のルックアップのように見えるので、私は提供テーブルの順序でクエリを実行するためにMySQLを伝えている、あなたはに駆動表をしたいです主要な "a"テーブル参照になります。

+0

素晴らしいです。 1つの小さなグリップ。それは異なる行だけを表示しています。すべての行を表示することは可能ですか? – Steve

+1

@Steve、GROUP BY句を削除する – DRapp

関連する問題