Názor k článku Efektivní používání PL/pgSQL od Radoslav Golian - Omylom sa mi podarilo submitnut nedokoncenu reakciu.. zaujala ma...

  • Článek je starý, nové názory již nelze přidávat.
  • 16. 8. 2011 23:25

    Radoslav Golian (neregistrovaný)

    Omylom sa mi podarilo submitnut nedokoncenu reakciu..
    zaujala ma veta:
    "FOR EXECUTE nepoužívá cache pro prováděcí plány a tudíž prováděcí plán bude vždy odpovídat hodnotám parametrů"
    to naozaj takto funguje v postgre? vzdy sa vytvara novy exekucny plan pri pouziti dynamickeho SQL? Nie je to prilis narocne?

    Som sice oraclista, ale celkom by ma to zaujimalo :)
    V Oracle funguje spracovanie prikazu nasledovne
    1) pri dynamickom sql sa vzdy vykona tzv. soft parse - spravi sa hash + overia sa prava a pod.
    2) ak uz je plan v cache tak sa pouzije existujuci plan
    3) ak nie je plan v cache tak sa vykona fyzicka optimalizacia, tj. hladaju sa a ocenuju exekucne plany, skusaju sa kadejake transformacie a pod., co je velmi narocna operacia..

    1-3 = tzv. hardparse, jedna z najhorsich co mozete oracle databaze urobit je nepouzit viazane premenne (napr: "select ... where id =" + $id) - pre oracle je to vzdy iny selekt, takze vzdy robi hardparse..

    ak by sa pouzila viazana premenna select ... where id = :1, tak by to bol vzdy den isty selekt ak by to slo cez execute immediate tak by sa robil len soft parse..

    Takze toto v postgre funguje inak? nie je rozdiel medzi konkatenaciou a medzi viazanymi premennymi z hladiska vykonosti? (jasne ze je rozdiel z bezpecnostneho hladiska) vzdy sa pocita plan?

    2)
    Takze postgre ma tiez bind-peeking? tj optimalizuje plan podla hodnoty viazanej premennej ktora bola v selekte pocas hardparsu (prvy krat ked ten do db prisiel)

    dakujem za odpovede