Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi [MSSQL+ADO] Wozu sp_prepare/sp_Unprepare (https://www.delphipraxis.net/95332-%5Bmssql-ado%5D-wozu-sp_prepare-sp_unprepare.html)

alzaimar 5. Jul 2007 09:46

Datenbank: MS SQL-Server • Version: 2000 • Zugriff über: ADO

[MSSQL+ADO] Wozu sp_prepare/sp_Unprepare
 
Hiho!

Beim Analysieren einer DB-Verbindung frage ich mich, wieso ADO jedes Skript erstmal mit 'sp_prepare' vorbereitet, dann mit 'sp_unprepare' weitermacht, um dann das Skript selbst auszuführen.
Das Lustige (na ja) ist, das ADO das auch dann macht, wenn ich im TADODataset die Eigenschaft 'Prepared' auf 'FALSE' setze. :shock: Nach allgemeinem Verständnis der englischen Sprache, der OH und nach Rückfrage mit meinem Großhirn, wo ab und an mein 'gesunder Menschenverstand' einen Zwischenstopp einlegt, sollte 'Prepared := False' doch eigentlich ADO davon abhalten, etwas derartiges zu machen, oder?
Auch ein Setzen von 'Use Procedure for Prepare=0' im Connectionstring der TADOConnection wird ignoriert.

So sieht das Skript aus, das ADO generiert:
SQL-Code:
declare @P1 int
exec sp_prepare @P1 output, NULL, N'select * from OrderView'
select @P1
go
exec sp_unprepare 3
go
select * from OrderView
go
Ist das nicht ein wenig krank?

Meine Fragen hierzu:

1. Was soll das?
2. Ist es sp_prepare/sp_unprepare wenigstens garantiert immer schneller?
3. If Answer(2)=NO Then 'Wie kann man das abstellen'

Zu 3: Eigentlich reicht es mir, wenn ADO einfach nur mein Skript/Befehl durchreicht, OHNE ihn mit 'sp_prepare' anzufassen.


NACHTRAG: Es passiert natürlich nur beim allerersten Mal, also wenn das Dataset zum 1.Mal geöffnet wird...

generic 6. Jul 2007 08:56

Re: [MSSQL+ADO] Wozu sp_prepare/sp_Unprepare
 
zu 1)
Das dient dazu alte Programme welche damals per ODBC zugriffen hatten und auf ado umgestellt worden zu optimieren in der geschwindigkeit. eigendlich erfüllt es heute keinen zweck mehr.
Man kann eine bessere optimierung erreichen wenn man selbst die sp's programmiert, was mircosoft auch inzwsichen so vor sieht. (s.h. .net ado)

zu 2)
Ja und Nein - Wenn du komplexe SQL's abschiesst dann optimiert er die in einer stored procedure. das bringt allerdings nur was wenn du die sql's nicht immer neu zusammen baust (mit string operationen), dann wird es langsamer. eine optimierung wird erreicht wenn du oft das gleiche sql ausführst.
(da empfielt sich aber eine sp zu programmieren)

zu 3)
ich schalte das in meinen anwendungen immer ab.

ich nutze folgenden connectionsstring an einen adoconnection objekt:
Code:
Connect=Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=datenbankname;Data Source=datenserver;Use Procedure for Prepare=0;Application Name=Anwendungsname
deine letzte frage:
es reicht wenn du nur den sql befehl rüber schiesst.
bei Use Procedure for Prepare=1 fummelt er sich das selbst hin mit dem sp's.
das ist das was du im profiler entdeckt hast.

alzaimar 6. Jul 2007 10:55

Re: [MSSQL+ADO] Wozu sp_prepare/sp_Unprepare
 
Hi generic,

Beim 1.Mal (und nur dann) ruft er prepare/unprepare aus, egal was man im Connectionstring einstellt. Meine Abhilfe: Ich halte die Datamodule in einem Pool, sodass das '1.Mal' nur ein mal auftritt.

Das Ganze ist ein 'stateless AppServer'.

generic 6. Jul 2007 12:36

Re: [MSSQL+ADO] Wozu sp_prepare/sp_Unprepare
 
benutzt du native ado oder die borland wrapper componeten die von tdataset abgeleitet sind?

alzaimar 6. Jul 2007 12:42

Re: [MSSQL+ADO] Wozu sp_prepare/sp_Unprepare
 
Die Delphi-Wrapper. Aber so wie ich das sehe, wird 'Prepared' 1:1 durchgereicht...


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz