2

私の質問は、クエリSQLの最適化に関するものです。

私のクエリは、メンバーとその最後のトレーニングのリストを取得します。

最新のトレーニングを取得するために、すべてのメンバーのトレーニングの完全なリストを返すクエリの結果に参加します。

このクエリは機能しますが、非常に遅いので、誰かがそれをより速く実行するための解決策を持っているかどうか私は本当に興味があります。

私の質問(約16秒):

SELECT 
    m.nom,
    m.prenom,
    m.ville,
    m.maj,
    mbf.libelle,
    mbf.datefin,
    m.id as idmb
FROM
    membres m
    LEFT JOIN (
        select *
        from membreform
        where idformation = 1
        order by datefin DESC
    ) as mbf ON mbf.idmembre = m.id
WHERE
    role > 0 AND visible = 1
group by m.id
ORDER BY m.maj DESC
limit 0 , 20

私のデータ構造:

membreform(1000エントリ)

  • idint(11)NOT NULL AUTO_INCREMENT、
  • idmembreint(11)NOT NULL、
  • libellevarchar(128)NOT NULL、
  • idformationint(11)NOT NULL、
  • datedebut日付はNULLではありません、
  • datefin日付NOTNULLDEFAULT '0000-00-00'、
  • descriptテキストNOTNULL、
  • キーidid)、
  • キーidmembreidmembre)、
  • キーidformationidformation

membres(500エントリ)

  • idint(3)NOT NULL AUTO_INCREMENT、
  • nomvarchar(255)NOT NULL、
  • prenomvarchar(255)NOT NULL、
  • villevarchar(255)NOT NULL、
  • emailvarchar(255)NOT NULL、
  • maj日時NOTNULL、
  • roletinyint(4)NOT NULL DEFAULT '1'、
  • 主キー(id)、
  • キーrolerole)、
  • キーmajmaj

私はこれを他の方法(約0.40秒)でテストしましたが、それが本当にきれいだとは思いません

SELECT 
    m.nom,
    m.prenom,
    m.ville,
    m.maj,
    m.id as idmb,
    (select 
            libelle
        from
            membreform
        where
            idformation = 1
                AND m.id = membreform.idmembre
        order by datefin DESC
        limit 1
    ) libelle,
    (select 
            datefin
        from
            membreform
        where
            idformation = 1
                AND m.id = membreform.idmembre
        order by datefin DESC
        limit 1
    ) datefin
FROM
    membres m
WHERE
    role > 0 AND visible = 1
group by m.id
ORDER BY m.maj DESC
limit 0 , 20

私は少し立ち往生しているので、私はどんな提案にもオープンです

ありがとうございました

4

1 に答える 1

0

一時テーブルを使用してパフォーマンスを向上させることができます。例(MS SQL)1ステップ-関連するすべてのwhere条件を追加して、メンバーフォームデータを一時テーブルに取得します

select * INTO #TempMembreform from membreform where idformation = 1 ... order by datefin DESC

2ステップ-上記の最初の例で行ったように、左外側の結合を行います。例えば

SELECT 
    m.nom,
    m.prenom,
    m.ville,
    m.maj,
    mbf.libelle,
    mbf.datefin,
    m.id as idmb
FROM
    membres m
    LEFT JOIN #TempMembreForm as mbf 
        ON mbf.idmembre = m.id
WHERE
    role > 0 AND visible = 1
group by m.id
ORDER BY m.maj DESC
limit 0 , 20

3ステップ-データがミッションクリティカルでない場合は、NOLOCKキーワードを追加します(例:Bank tracnsactions)

select *
INTO #TempMembreform 
from membreform WITH(NOLOCK)
where idformation = 1
order by datefin DESC

SELECT 
    m.nom,
    m.prenom,
    m.ville,
    m.maj,
    mbf.libelle,
    mbf.datefin,
    m.id as idmb
FROM
    membres m with(nolock)
    LEFT JOIN #TempMembreForm as mbf 
        ON mbf.idmembre = m.id
WHERE
    role > 0 AND visible = 1
group by m.id
ORDER BY m.maj DESC
limit 0 , 20

私のプロフィール

于 2012-11-30T12:30:54.330 に答える