|
| select ... where (x,y) in (select ...) ine~ Fra : Leif Neland |
Dato : 12-01-10 15:05 |
|
MySql
Jeg skal importere 20000 varer ind i en tabel, hvor
(producent,producent_varenr) skal være unikt. Det er de bare ikke, så
det skal tilrettes manuelt.
select prodid,p_vnr from imptab
group by 1,2
having count(*)>1
giver mig ca rækker på "no time"
Men jeg vil gerne have alle felterne, så jeg kan rette i tabellen (med
phpmyadmin)
select * from imptab where (prodid,p_vnr) in (
select prodid,p_vnr from imptab
group by 1,2
having count(*)>1)
tager 160 sekunder.
Jeg har index på både prodid,p_vnr og (prodid,p_vnr) (Det første er
unødvendigt, ved jeg, men nu tester vi...)
Kan det ikke gøres smartere/effektivere? Jeg vil gerne undgå at skulle
lave en løkke i php f.ex.
Dog, gentager jeg forespørgslen kort tid efter, tager det kun 0.0010 sec
, så noget må ligge i cache.
Leif
| |
Leif Neland (12-01-2010)
| Kommentar Fra : Leif Neland |
Dato : 12-01-10 16:05 |
|
Leif Neland wrote:
> MySql
> Jeg skal importere 20000 varer ind i en tabel, hvor
> (producent,producent_varenr) skal være unikt. Det er de bare ikke, så
> det skal tilrettes manuelt.
>
> select prodid,p_vnr from imptab
> group by 1,2
> having count(*)>1
>
> giver mig ca rækker på "no time"
>
> Men jeg vil gerne have alle felterne, så jeg kan rette i tabellen (med
> phpmyadmin)
>
> select * from imptab where (prodid,p_vnr) in (
> select prodid,p_vnr from imptab
> group by 1,2
> having count(*)>1)
>
> tager 160 sekunder.
> Jeg har index på både prodid,p_vnr og (prodid,p_vnr) (Det første er
> unødvendigt, ved jeg, men nu tester vi...)
>
Selvom et view bare er et select pakket ind, så fungere dette glimragende:
create view dobbelt as select prodid,p_vnr from imptab
group by 1,2 having count(*)>1
select imptab.* from imptab inner join dobbelt using (prodid,p_vnr)
Denne select tager cirka 0.01 sec. Det kan jeg godt leve med.
Leif
| |
|
|