sql >> Databáze >  >> RDS >> Mysql

prohlášení o přípravě ovladače golang sql

Rozdíly mohou být jemné, někdy důležité a někdy fakticky neexistující.

Obecně se připravený příkaz 1. připraví se serverem (analyzuje SQL, vygeneruje plán provádění atd.), 2. se provede s dalšími parametry a 3. se zavře. Umožňuje znovu použít stejné SQL s různými parametry předávanými pokaždé, může pomoci chránit před vkládáním SQL, může poskytnout určitá vylepšení výkonu (specifické pro ovladač/protokol, YMMV) a zabránit opakovaným krokům, jako je generování plánu provádění a analýza SQL v připravit krok výše.

Pro někoho, kdo píše zdrojový kód, může být připravený příkaz pohodlnější než zřetězení řetězců a jejich odeslání na DB server.

DB.Query() metoda bere SQL jako řetězec a žádný nebo více argumentů (stejně jako Exec() nebo QueryRow() ). Řetězec SQL bez dalších argumentů se bude dotazovat přesně na to, co jste napsali. Pokud však máte řetězec SQL se zástupnými symboly a dalšími argumenty, připravuje se pro vás pod pokličkou připravený příkaz.

DB.Prepare() metoda explicitně provede připravený příkaz, kterému pak předáte argumenty, jako v:stmt.Exec(...args) .

Existuje několik věcí, které stojí za zamyšlení, pokud jde o rozdíly mezi těmito dvěma a proč používat jednu nebo druhou.

Můžete použít DB.Query() bez argumentů. To může být velmi efektivní, protože to může obejít připravit --> spustit --> zavřít sekvence, kterou připravený příkaz nutně prochází.

Můžete jej také použít s dalšími argumenty a zástupnými symboly v řetězci dotazu a provede připravený příkaz pod kryty, jak jsem uvedl výše. Potenciální problém je v tom, že když zadáváte několik dotazů, výsledkem každého je pod kapotou připravené prohlášení. Vzhledem k tomu, že se jedná o dodatečné kroky, může to být dosti neefektivní, protože se znovu připravuje, spouští a zavře pokaždé, když provedete dotaz.

S explicitně připraveným příkazem se můžete vyhnout této neefektivitě, když se pokoušíte znovu použít SQL, který jste dříve připravili, s potenciálně odlišnými argumenty.

Ale ne vždy to funguje, jak byste očekávali... Kvůli základnímu fondu připojení, který je spravován db/sql, je vaše „databázové připojení“ docela virtuální. DB.Prepare() metoda připraví příkaz pro konkrétní připojení a poté se pokusí získat stejné připojení zpět, když je čas na provedení, ale pokud toto připojení není k dispozici, jednoduše vezme to, které je k dispozici, a znovu se připraví a provede proti němu. Pokud používáte stejné připravené prohlášení znovu a znovu, můžete ho nevědomky také připravovat znovu a znovu. To samozřejmě většinou vyjde najevo, když se potýkáte s hustým provozem.

Je tedy zřejmé, které použití za jakých okolností závisí na vašem konkrétním případu použití, ale doufám, že výše uvedené podrobnosti vám pomohou dostatečně objasnit, abyste se v každém případě mohli rozhodnout nejlépe.

Aktualizovat

Vzhledem k aktualizaci v OP není v podstatě žádný rozdíl, kdy dotaz stačí provést pouze jednou, protože dotazy s argumenty jsou prováděny jako připravené příkazy v zákulisí.

Použijte přímé metody, např. DB.Query() a jeho analogy, vs. explicitně pomocí připravených příkazů, protože to povede k poněkud jednoduššímu zdrojovému kódu.

Vzhledem k tomu, že připravené příkazy jsou v tomto případě používány z bezpečnostních důvodů, může stát za námahu řešit bezpečnostní problémy jinými prostředky a místo toho používat dotazy v prostém textu, protože to zlepší výkon. Jakékoli zisky však mohou být irelevantní, pokud není dostatečný provoz (nebo se předpokládá, že provoz v budoucnu výrazně poroste), aby bylo nutné snížit zatížení serveru. Opět jde o případ použití v reálném světě.

Pro každého, kdo se zajímá o nějaké metriky o rozdílu mezi připravenými výpisy a přímými dotazy v prostém textu, je dobrý článek zde (což také skvěle vysvětluje mnohé z výše uvedeného).



  1. Protokolování auditu pro PostgreSQL

  2. Zvyšování laťky správy MySQL, MariaDB, PostgreSQL a MongoDB

  3. Proč PL/SQL nerespektuje oprávnění udělená rolemi?

  4. Rozdělte čárkami oddělené hodnoty sloupce v řádku pomocí dotazu Oracle SQL