condition pour créer une instruction préparée en utilisant cfqueryparam?

Est- cfquery que cfquery devient une instruction préparée tant qu'il y a 1 cfqueryparam ? Ou y a-t-il d'autres conditions?

Que se passe-t-il lorsque la clause ORDER BY ou FROM est dynamic? Est-ce que chaque combinaison unique deviendrait une déclaration préparée?

Et que se passe-t-il lorsque nous faisons cfloop avec INSERT , avec toutes les valeurs cfqueryparam'ed, et invoquons la cfquery avec un nombre différent d'itérations?

Des problèmes potentiels avec trop de déclarations préparées?

Comment DB gère-t-il les instructions préparées? Vont-ils être convertis en quelque chose de similaire à la procédure de magasin?

Dans quelles circonstances ne devrions-nous pas utiliser une déclaration préparée?

Je vous remercie!

Je peux répondre à certaines parties de votre question:

une requête deviendra <queryparam tant qu'il y <queryparam un <queryparam . J'ai ajouté dans le passé un where 1 = <cfqueryparam value="1" aux requêtes qui n'avaient pas de parameters dynamics, afin de les faire fonctionner comme des where 1 = <cfqueryparam value="1" préparées

La plupart des DB gèrent les PreparedStarements de la même manière que les procédures stockées, qui sont simplement conservées temporairement, plutôt que sur le long terme, mais les détails sont susceptibles d'être spécifiques à la database.

En supposant que vous utilisez les pilotes fournis avec ColdFusion, si vous activez la checkbox 'Log Activity' dans le panneau avancé de la configuration de DataSource, vous obtiendrez des informations très détaillées sur la manière dont CF interagit avec la database. un nouveau PreparedStatement et quand il les réutilise. Je vous recommand de l'essayer par vous-même, car de nombreux facteurs sont impliqués (configuration de la database, pilote, version CF, etc.). Si vous utilisez la journalisation de database, redémarrez CF avant d'exécuter votre code de test, afin de pouvoir le voir créer les instructions préparées, sinon vous le verrez réutiliser des instructions par ID, sans voir ce que sont ces instructions.

En outre, si vous posez des questions sur les plans d'exécution, il y a plus que le nombre de PreparedStatement généré. C'est un sujet énorme et très dépendant de la database. Je n'ai pas la compréhension d'un DBA, mais je peux répondre à quelques questions sur MS SQL.

Que se passe-t-il lorsque la clause ORDER BY ou FROM est dynamic? Est-ce que chaque combinaison unique deviendrait une déclaration préparée?

La base sql est différente. Vous obtiendrez donc des plans d'exécution distincts pour chaque clause ORDER BY unique .

Et que se passe-t-il lorsque nous faisons cfloop avec INSERT, avec toutes les valeurs cfqueryparam'ed, et invoquons la cfquery avec un nombre différent d'itérations?

MS SQL devrait réutiliser le même plan pour toutes les itérations car seuls les parameters changent.

La vue sys.dm_exec_cached_plans est très utile pour voir quels plans sont mis en cache et à quelle fréquence ils sont réutilisés.

 SELECT p.usecounts, p.cacheobjtype, p.objtype, t.text FROM sys.dm_exec_cached_plans p CROSS APPLY sys.dm_exec_sql_text( p.plan_handle) t ORDER BY p.usecounts DESC 

Pour effacer le cache en premier, utilisez DBCC FLUSHPROCINDB . Évidemment , ne l' utilisez pas sur un server de production.

 DECLARE @ID int SET @ID = DB_ID(N'YourTestDatabaseName') DBCC FLUSHPROCINDB( @ID )