簡體   English   中英

sql,查詢優化和內連接?

[英]sql, query optimisation with and inner join?

我正在嘗試優化我的查詢,它有一個內部聯接和合並。

連接表,是一個簡單的表,有一個整數字段,我添加了一個唯一的密鑰。

對於我的where子句,我已經為這三個字段創建了一個鍵。

但是,當我看到計划時,它仍然說它正在使用表掃描。

我哪里錯了?

這是我的查詢

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;

很可能你的JOIN表達式不能使用任何索引,它是通過進行date(a.startdate, '+'||(bn*a.interval)||' '||a.intervaltype)掃描並計算date(a.startdate, '+'||(bn*a.interval)||' '||a.intervaltype)來計算的。行。

BTW:這本身就是一個非常奇怪的連接條件。 我建議你找到一個更好的方法來將billsndeposits加入util_nums (如果真的需要)。

我想我明白你想要實現的目標。 但是這種聯接是緩慢表現的一個因素。 即使您刪除日期計算和合並(即將一個日期與另一個日期進行比較),即使使用索引,它仍然會很慢(與整數聯接相比)。 而且因為您正在動態創建新日期,所以無法將它們編入索引。

我建議創建一個臨時表,其中包含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,然后使臨時數據過期。

我知道這會為您的原始查詢添加更多工作,但這是一個有保證的性能改進,並且應該自然地適合經常運行的腳本。

問候,

編輯

我要做的另一件事是make enddate默認值= date('2013-02-26'),除非它會影響其他代碼和/或沒有商業意義。 這樣您就不必使用合並。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM