Różnice mogą być subtelne, czasami ważne, a czasami skutecznie nieistniejące.
Na ogół przygotowana instrukcja 1. jest przygotowywana z serwerem (przeanalizowana SQL, wygenerowany plan wykonania itp.), 2. jest wykonywana z dodatkowymi parametrami, a następnie 3. jest zamykana. Pozwala na ponowne użycie tego samego SQL z różnymi parametrami przekazywanymi za każdym razem, może pomóc w ochronie przed wstrzyknięciem SQL, może zapewnić pewne ulepszenia wydajności (specyficzne dla sterownika/protokołu, YMMV) i zapobiec powtarzaniu kroków, jak w generowaniu planu wykonania i parsowaniu SQL w przygotuj krok powyżej.
Dla kogoś, kto pisze kod źródłowy, przygotowana instrukcja może być wygodniejsza niż łączenie ciągów i wysyłanie ich do serwera DB.
DB.Query()
Metoda przyjmuje SQL jako ciąg i zero lub więcej argumentów (tak jak robi Exec()
lub QueryRow()
). Ciąg SQL bez dodatkowych argumentów spowoduje zapytanie dokładnie o to, co napisałeś. Jednak pod warunkiem dostarczenia ciągu SQL z symbolami zastępczymi i dodatkowymi argumentami, przygotowana instrukcja jest przygotowywana pod maską.
DB.Prepare()
metoda jawnie wykonuje przygotowaną instrukcję, do której następnie przekazujesz argumenty, na przykład:stmt.Exec(...args)
.
Jest kilka rzeczy, o których warto pomyśleć, jeśli chodzi o różnice między nimi i dlaczego warto korzystać z jednej lub drugiej.
Możesz użyć DB.Query()
bez argumentów. Może to być bardzo wydajne, ponieważ może ominąć przygotuj --> wykonaj --> zamknij kolejność, przez którą musi przejść przygotowana instrukcja.
Możesz również użyć go z dodatkowymi argumentami i symbolami zastępczymi w ciągu zapytania, a wykona przygotowaną instrukcję pod okładkami, jak wspomniałem powyżej. Potencjalny problem polega na tym, że gdy wykonujesz wiele zapytań, każde z nich daje w wyniku przygotowane pod maską oświadczenie. Ponieważ wiąże się to z dodatkowymi krokami, może to być raczej nieefektywne, ponieważ ponownie przygotowuje się, wykonuje i zamyka za każdym razem, gdy wykonujesz to zapytanie.
Dzięki wyraźnej, przygotowanej instrukcji możesz prawdopodobnie uniknąć tej nieefektywności, gdy próbujesz ponownie użyć przygotowanego wcześniej SQL, z potencjalnie różnymi argumentami.
Ale to nie zawsze działa tak, jak można by się spodziewać... Ze względu na podstawową pulę połączeń zarządzaną przez db/sql, twoje "połączenie z bazą danych" jest dość wirtualne. DB.Prepare()
Metoda przygotuje instrukcję dla konkretnego połączenia, a następnie spróbuje odzyskać to samo połączenie, gdy nadejdzie czas na wykonanie, ale jeśli to połączenie jest niedostępne, po prostu pobierze to, które jest dostępne, i ponownie przygotuje się i wykona na nim. Jeśli używasz tego samego przygotowanego oświadczenia w kółko, możesz, nieświadomie, także przygotowywać go w kółko. To oczywiście wychodzi na jaw, gdy masz do czynienia z dużym ruchem.
Więc oczywiście to, w jakich okolicznościach używasz, zależy od konkretnego przypadku użycia, ale mam nadzieję, że powyższe szczegóły pomogą ci wyjaśnić na tyle, że możesz podjąć najlepszą decyzję w każdym przypadku.
Aktualizacja
Biorąc pod uwagę aktualizację w OP, zasadniczo nie ma różnicy, kiedy zapytanie musi zostać wykonane tylko raz, ponieważ zapytania z argumentami są wykonywane jako przygotowane instrukcje zakulisowe.
Skorzystaj z metod bezpośrednich, np. DB.Query()
i jego odpowiedniki, w przeciwieństwie do jawnego używania przygotowanych instrukcji, ponieważ spowoduje to nieco prostszy kod źródłowy.
Ponieważ w tym przypadku przygotowane oświadczenia są wykorzystywane ze względów bezpieczeństwa, warto zająć się kwestiami bezpieczeństwa innymi sposobami i zamiast tego użyć zapytań w postaci zwykłego tekstu, ponieważ poprawi to wydajność. Wszelkie zyski mogą być jednak nieistotne, chyba że ruch jest wystarczający (lub przewiduje się znaczny wzrost ruchu w przyszłości), aby wymuszać zmniejszenie obciążenia serwera. Ponownie sprowadza się to do rzeczywistego przypadku użycia.
Dla każdego, kto jest zainteresowany niektórymi metrykami różnicy między przygotowanymi instrukcjami a bezpośrednimi zapytaniami w postaci zwykłego tekstu, polecamy dobry artykuł tutaj (co również doskonale wyjaśnia wiele z powyższych).