2012-02-26 13 views
4

私はクエリを最適化しようとしていますが、内部結合と結合があります。sql、クエリの最適化と内部結合?

結合テーブルは、単純な1つのフィールドのフィールドを持つテーブルです。私は一意のキーを追加しました。

私のwhere句では、3つのフィールドのキーを作成しました。

しかし、私が計画を見ると、まだテーブルスキャンを使用していると言われています。

どこが間違っていますか?ここで

は私のクエリは

select date(a.startdate, '+'||(b.n*a.interval)||' '||a.intervaltype) as due 

from billsndeposits a 

inner join util_nums b on date(a.startdate, '+'||(b.n*a.interval)||' 
    '||a.intervaltype) <= coalesce(a.enddate, date('2013-02-26')) 

where not (intervaltype = 'once' or interval = 0) and factid = 1 

order by due, pid; 
+1

これはmysqlと思われます。 –

+0

使用しているDBの名前を入力してください。あなたが考えることができる他のオプションがあるかもしれません。 –

+0

'date(a.startdate、 '+' ||(b.n * a.interval)|| '' || a.intervaltype)'これは機能しますか? – Isaac

答えて

2

私はあなたが達成しようとしていることを理解していると思います。しかし、この種の結合は、パフォーマンスが遅いというレシピです。日付の計算を取り除き合併(つまり、ある日付と別の日付を比較)しても、インデックスの場合でも(整数結合と比較して)遅くなります。そして、あなたはその場で新しい日付を作成しているので、それらをインデックスに登録することはできません。

私は2列(1)PID(またはものは何でもbillsndepositsに使うID)を持つ一時テーブルを作成し、(2)このクエリを使用して新しいテーブルを移入

をrecurrence_dtお勧め:

INSERT INTO TEMP 
SELECT PID, date(a.startdate, '+'||(b.n*a.interval)||' '||a.intervaltype) 
FROM billsndeposits a, util_numbs b; 

次に、recurrence_dt列とrunstatsに索引を作成します。今すぐあなたのselect文は次のようになります。

SELECT recurrence_dt 
FROM temp t, billsndeposits a 
WHERE t.pid = a.pid 
    AND recurrence_dt <= coalesce(a.enddate, date('2013-02-26')) 

あなたはこの新しいテーブルの上にexp_tsを追加し、その後、一時的なデータを期限切れにすることができます。

これは、元のクエリに多くの作業を追加することがわかっていますが、これはパフォーマンスの向上が保証されているため、頻繁に実行されるスクリプトに自然に適合するはずです。

よろしく、

編集

私はどうなるもう一つ、それは他のコードに影響を与え、および/または行いますしない限り、ENDDATEのデフォルト値=日付(「2013年2月26日」)作るですビジネスには意味がありません。このようにして、合体で作業する必要はありません。

3

ほとんどの場合、あなたのJOIN式は任意のインデックスを使用することはできませんし、それはNATURALスキャンを行うことによって計算され、行ごとにdate(a.startdate, '+'||(b.n*a.interval)||' '||a.intervaltype)を計算します。

BTW:これは本当に奇妙な結合条件です。 billsndepositsを​​(実際に必要な場合)に参加させるより良い方法を見つけることをお勧めします。

+0

まあ、私はintervaltypeフィールドに日、月などを格納し、間隔によって生成された数値を追加して、カスタム日付の再帰を生成するために評価します。 util_numsは純粋に将来再発を提供するためのものです。例えば'+ 7 months' – Jules

+0

@Jules私はあなたが達成しようとしているものと、両方のテーブルの構造と内容が何であるかを頭で覆すことはできません。テーブル構造とサンプルコンテンツあなたが達成したいことの説明。 –

関連する問題