0

このソースは良いですが、遅すぎます。機能: SC と %%5 および 2013.07.11 < 日付 < 2013.07.18 の場合にすべての行を選択し、いくつかの古い行が行を表す方法: X カウント行を検索します。一貫性があるかどうかを1つずつ確認する28日間

select efi_name, efi_id, count(*) as dupes, id, mlap_date
from address m
where 
mlap_date > "2013.07.11"
and mlap_date < "2013.07.18"  
and mlap_type = "SC"
and calendar_id not like "%%5"

and  concat(efi_id,irsz,ucase(city), ucase(address)) in (
    select concat(k.efi_id,k.irsz,ucase(k.city), ucase(k.address)) as dupe
    from address k
    where k.mlap_date > adddate(m.`mlap_date`,-28)
    and k.mlap_date < m.mlap_date
    and k.mlap_type = "SC"
    and k.calendar_id not like "%%5"
    and k.status = 'Befejezett'
    group by concat(k.efi_id,k.irsz,ucase(k.city), ucase(k.address))
    having (count(*) > 1)
)
group by concat(efi_id,irsz,ucase(city), ucase(address))

助けてくれてありがとう!

4

2 に答える 2

1

NOT LIKEさらに、ワイルドカードのプレフィックスが付いた用語は、インデックスの使用をキラーします。

IN+ インライン テーブルをinner join:に置き換えてみることもできます。オプティマイザーはNOT LIKEクエリを 2 回実行しますか (説明プランを参照してください)?

MySql を使用している可能性があるようです。その場合、に基づいてハッシュ列を作成できます。

efi_id 
irsz
ucase(city)
ucase(address))

その列を直接比較します。これは、MySql でハッシュ結合を実装する方法です。

于 2013-07-20T09:13:01.227 に答える