Langsame Abfrage mit cfqueryparam, die nach indizierten Spalten mit Hashes sucht

Ich habe die folgende Abfrage, die in 16 ms - 30 ms ausgeführt wird.

<code><cfquery name="local.test1" datasource="imagecdn">
    SELECT hash FROM jobs WHERE hash in(
        'EBDA95630915EB80709C69089315399B',
        '3617B8E6CF0C62ECBD3C48DDF8585466',
        'D519A38F09FDA868A2FEF1C55C9FEE76',
        '135F94C3774F7719CFF8FF3A275D2D05',
        'D58FAE69C559273D8427673A08193789',
        '2BD7276F209768F2FCA6635659D7922A',
        'B1E3CFBFCCFF6F5B48A849A050E6D424',
        '2288F5B8A797F5302E8CA24323617236',
        '8951883E36B5D38A4643DFAA0396BF13',
        '839210BD564E30BE1355D1A6D4EF7081',
        'ED4A2CB0C28B608C29576819CF7BE19B',
        'CB26925A4874945B810707D5FF0B91F2',
        '33B2FC229F0CC797A02AD163CDBA0875',
        '624986E7547DBAC0F47B3005CFDE0A16',
        '6F692C289BD805CEE41EF59F83F16F4D',
        '8551F0033C617BD9EADAAD6CEC4B3E9E',
        '94C3C0A74C2DE085FF9F1BBF928821A4',
        '28DC1A9D2A69C2EDF5E6C0E6368A0B3C'
    )
</cfquery>
</code>

Wenn ich dieselbe Abfrage ausführe, aber cfqueryparam verwende, läuft sie in 500 ms - 2000 ms.

<code><cfset local.hashes = "[list of the same ids as above]">
<cfquery name="local.test2" datasource="imagecdn">
    SELECT hash FROM jobs WHERE hash in(
        <cfqueryparam cfsqltype="cf_sql_varchar" value="#local.hashes#" list="yes">
    )
</cfquery>
</code>

Die Tabelle enthält ungefähr 60.000 Zeilen. Die "Hash" -Spalte ist varchar (50) und hat einen eindeutigen nicht gruppierten Index, ist jedoch nicht der Primärschlüssel. DB-Server ist MSSQL 2008. Auf dem Webserver wird die neueste Version von CF9 ausgeführt.

Irgendeine Idee, warum das cfqueryparam die Leistung veranlasst, heraus zu bombardieren? Es verhält sich jedes Mal so, egal wie oft ich die Seite aktualisiere. Wenn ich die Liste mit nur 2 oder 3 Hashes kopple, ist die Leistung mit 150-200 ms immer noch schlecht. Wenn ich das cfqueryparam eliminiere, ist die Leistung wie erwartet. In dieser Situation gibt es die Möglichkeit der SQL-Injection und daher wäre die Verwendung von cfqueryparam sicherlich vorzuziehen, aber es sollte nicht 100 ms dauern, bis 2 Datensätze aus einer indizierten Spalte gefunden wurden.

Bearbeitungen:

Wir verwenden Hashes vonhash() keine UUIDS oder GUIDS. Der Hash wird von a generierthash(SerializeJSON({ struct })) enthält den Plan für eine Reihe von Vorgängen, die für ein Image ausgeführt werden sollen. Der Zweck hierfür ist, dass wir vor dem Einfügen und vor dem Abfragen der genauen eindeutigen ID für diese Struktur wissen können. Diese Hashes dienen als "Index" für die Strukturen, die bereits in der DB gespeichert wurden. Außerdem führt dieselbe Struktur mit Hashes zum selben Ergebnis, was für UUIDS und GUIDS nicht zutrifft.

Die Abfrage wird auf 5 verschiedenen CF9-Servern ausgeführt und alle weisen dasselbe Verhalten auf. Für mich schließt dies die Idee aus, dass CF9 etwas zwischenspeichert. Alle Server stellen eine Verbindung zur exakt gleichen Datenbank her. Wenn also ein Caching stattfindet, muss dies die Datenbankebene sein.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage