Tag Archives: sql

Oi jūs vaikai, nerūkykit to ką aš rūkau…

Žodžiu taip. Krapštinėju čia vieną tokią apmokėjimo sistemą (būna gi kartais tokių užsakovų norų – iš gero daikto padarykit fufelį), tai tarp debesies užklausų kurias pagimdžiau viena buvo tokia nenormali (sudėta į perl kintamąjį):

$disk_usage = "SELECT (SELECT
                        res.value*res.multiplier AS diskspace
                        FROM ve ve
                          LEFT JOIN resource AS r
                          ON ve.platform_id = r.platform_id
                          LEFT JOIN subscr_ve AS suve
                          ON ve.ve_id = suve.ve_id
                          LEFT JOIN subscr_orders AS sord
                          ON suve.subscr_id = sord.subscr_id
                          LEFT JOIN order_res AS res
                          ON sord.ar_doc_id = res.ar_doc_id
                          AND r.res_id = res.res_id
                        WHERE   ( suve.ve_id IS NOT NULL AND
                                sord.subscr_id IS NOT NULL AND
                                res.ar_doc_id IS NOT NULL AND
                                ve.ve_id=(SELECT ve_id
                                          FROM subscr_ve
                                          WHERE subscr_id='$sid'
                                          AND ve_id IS NOT NULL)
                        AND r.short_name IN ('diskspace'))
                        ORDER BY sord.start_date LIMIT 1) as space,
            (SELECT MAX(diskusage) AS diskusage
                    FROM ve_quota_stat_history
                    WHERE ve_id=(SELECT ve_id
                                 FROM subscr_ve
                                 WHERE subscr_id='$sid'
                                 AND ve_id IS NOT NULL)
                    AND interval_type=0
                    AND time_stamp BETWEEN '$times[0]' AND '$times[1]'
                    ORDER BY diskusage DESC LIMIT 1) as used;";

Kad dar nors kalba eitų apie MySQL 5.x – tada būtų galima labai supaprastinti reikalą. Betgi dabar turiu bėdą su 4.1, kurios negalima upgradinti ar keisti. Sutinku, kad užklausa neoptimali (ir turint laiko netgi žinau ką reiktų pakeisti), bet užtat veikia! =)
Iš vienos pusės – kapanotis po nedokumentuotus sistemos vidurius kaip ir neturėtų smarkiai vežti, iš kitos – užsivedžiau, ir galutiniame rezultate gavosi 2K eilučių monstras, kuris panašu kad jau daro tai ką reikia.
Sekant skaitytom frazėm:

  • Kiekviena programa turi bent vieną bugą
  • Kiekvieną programą galima sumažinti bent viena eilute

Padarom išvadą, kad kiekvieną programą galima sumažinti iki vienos eilutės, kurioje būtinai bus bugas…

Paskaičius tokių filosofijų bei parašinėjus tokias užklausas man nebereiks ir rūkyt (ko ir taip nedarau jau gerą laiką) – nuo skriptavojimo užsivesiu. Laiku tik į klubą kokį nulėkt! ;-)