[NDBT] Co dělá SqlPreprocesor a proč ničí prepared statement?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
CZechBoY
Člen | 3608
+
0
-

Zdravím,
potýkám se s výkonostním problémem a přišel jsem na to, že to může nepoužívání prepared statements.
Je nějaký důvod proč se používá SqlPreprocesor pro zahazování prepared statementů?

Dík.

Jan Tvrdík
Nette guru | 2595
+
0
-

přišel jsem na to, že to může nepoužívání prepared statements

Jak jsi na to přišel? Skutečné prepared statements jsou v reálu skoro vždycky pomalejší.

CZechBoY
Člen | 3608
+
0
-

Protože si databáze nenacachuje query plán. Alespoň tak to vidím já. Pokud zapnu prepared statements tak vše jede stejně jako třeba v admineru. Když vypnu tak každá změna query znamená třeba 300ms navíc.

Ale je možný, že chyba je i někde v nastavení db no.

David Grudl
Nette Core | 8228
+
+2
-

Vycházím z toho, že prepared statements nemají pozitivní vliv na rychlost – to samozřejmě už nemusí pro některé databáze platit a pak se s tím může něco dělat.

Vlastně NDB nepoužívá prepared statements u krátkých řetězců, booleanů a integerů kvůli čitelnosti vygenerovaných SQL příkazů, ale to už dnes řeší panel v Tracy po svém a dá se to změnit velice jednoduše.

U typů float a datetime by to vyžadovalo trošku výzkum, jak je správně předávat, např. u microsoftích databází.

Samotné PDO v případě MySQL používá defaultně PDO::ATTR_EMULATE_PREPARES, které je třeba vypnout, aby se prepared statements vůbec používaly, jenže to způsobí BC break, protože některé příkazy jako třeba USE dbname nebo BEGIN se pak musí volat funkcí PDO::exec(), kterou NDB nepoužívá.

V případě PostreSQL by došlo k BC breaku třeba při $db->fetch('SELECT ?', 123), použití prepared statements by vedlo k chybě could not determine data type of parameter.

CZechBoY
Člen | 3608
+
0
-

Diky za objasneni.
Nevim proc ale v oraclu mi prepared statements trvaji o 300ms mene nez v opacnem pripade. Asi si to cachne plan nebo neco takovyho.
Preprocesor jsem si prepsal aby vracel otazniky i pro pole a funguje to dobre.
Chapu ze nekonzistentni chovani db serveru se da takhle resit, ale bylo by dobre mit moznost takove chovani vypnout treba v driveru.

David Grudl
Nette Core | 8228
+
0
-

Kdybys pripravil testovaci prostredi pro Oracle, neco jako je Travis nebo Appveyor, dalo by se s tim asi neco udelat.

CZechBoY
Člen | 3608
+
+2
-

Ani s jedním (Travis|Appveyor) jsem nedělal, ale můžu něco zkusit.
Instalovat Oracle je horší než čistit si zuby štětkou na záchod.

CZechBoY
Člen | 3608
+
0
-

Tak jsem zjistil, ze to dela i na mysql.
Nema nekdo napad cim by to mohlo byt?

Kazda nova query trva strasne dlouho, po druhe uz trva normalni cas jako treba v sql developeru/admineru.