2016-06-01 4 views
2

は、私は、クエリを持っている:チューン高価なクエリ

SELECT MIN(Numero) 
FROM view_OperatoriCpuLiberi 
WHERE IDCpu = '9e2da792-be47-e311-aea8-b4b52fb677e0' 
AND Numero > 100 AND IDGruppo IN 
(
    SELECT AssociazioniCampo.IDOggetto AS IDGruppiAutorizzati 
    FROM Anag.ListeAssociazioni 
    INNER JOIN Anag.AssociazioniCampo ON ListeAssociazioni.IDLista = AssociazioniCampo.IDLista 
    INNER JOIN Campo.Oggetti ON AssociazioniCampo.IDOggetto = Oggetti.IDOggetto 
    WHERE ListeAssociazioni.IDTipoMacroOggetto = 5 
    AND ListeAssociazioni.IDTipoAssociatoCampo = 74 
    AND Deleted = 0 
    AND IDMacroOggetto = 'c3f2c542-a195-11e0-a2e3-000c2962b9f0' 
) 

「view_OperatoriCpuLiberiは」81981行と(括弧の間)ネストされたクエリ861行が含まれています。クエリには2秒以上かかりました。ネストされたクエリを削除してから 'IDGruppo IN'命令を削除すると、非常に高速になりました。私は何ができますか?

+0

あなたはどのデータベースを使用していますか?そしてあなたはあなたのテーブル構造とそのテーブル上の任意のインデックスを投稿できますか?ありがとう。 – Nick

+6

は副選択でなければなりません。それは普通の結合として書き直すことができます... –

+0

あなたのDBに依存しているように感じますが、古いバージョンのSQLではWhere句のサブクエリでかなり大きなパフォーマンスが得られたことを思い出しています。サブクエリをFROM句に移動してから、Marc Bの提案に従ってジョインしてみてください。 –

答えて

1

これは、それが良好に動作するか否かのものがインデックス化されているかに依存する場合がありますが、私はおそらく、このクエリを記述する方法をである、など

あなたはあなたのすべての列にエイリアスを使用していないので、私が持っていましたそれらのうちのいくつかがどこから来ていたかを推測する。

SELECT 
    MIN(OCL.Numero) 
FROM 
    view_OperatoriCpuLiberi OCL -- Ugh. Object name prefixes are evil. 
INNER JOIN Anag.AssociazioniCampo AC ON 
    AC.IDOggetto = OCL.IDGruppo 
INNER JOIN Anag.ListeAssociazioni LA ON 
    LA.IDLista = AC.IDLista AND 
    LA.IDTipoMacroOggetto = 5 AND 
    LA.IDTipoAssociatoCampo = 74 AND 
    LA.Deleted = 0 AND 
    LA.IDMacroOggetto = 'c3f2c542-a195-11e0-a2e3-000c2962b9f0' 
INNER JOIN Campo.Oggetti O ON O.IDOggetto = AC.IDOggetto 
WHERE 
    OCL.IDCpu = '9e2da792-be47-e311-aea8-b4b52fb677e0' AND 
    OCL.Numero > 100 AND 

少なくとも、テーブル間のすべての外部キーのインデックスが必要です。

+0

偉大な答え。ちょっと不思議なことに、なぜオブジェクト名接頭辞が悪いと思いますか?格納されたproc "usp_GetCustomerList"の名前を付けたり、この場合はビュー "view_myAwesomeView"の名前を付けたりすることを意味しますか? ...最後のものは少し冗長だが、あなたはその点を得る。 –

+0

オブジェクトが既にビューであることを知っておく必要があります。ビューがテーブルになる必要がある場合(またはその逆の場合)、何をしますか。私はテーブル(tblWhatever)がパーティションを横断したビューに置き換えられたところで起こっていました。今や名前はもはや正確ではありません。おそらくあなたはそれをリファクタリングすることができますが、それは難しいかもしれません。さらに、私はコードを読者が読んで自然に読めるようにしています。すべてのオブジェクトに型プレフィックスを追加すると、それが傷つきます。結局、 "悪"は誇張ですが、私はあなたがそれからほとんど何も得られないと思っていますが、潜在的に多くを失います。 –

+0

さて、私はビューにテーブルを切り替える場合は考慮しませんでした。リファクタリングは間違いなくいくつかの問題を引き起こす可能性があります。 –

関連する問題