Consulta lenta con búsqueda de cfqueryparam en una columna indexada que contiene hashes

Tengo la siguiente consulta que se ejecuta en 16ms - 30ms.

<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>

Si ejecuto la misma consulta pero uso cfqueryparam, se ejecuta en 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>

La tabla tiene aproximadamente 60,000 filas. La columna "hash" es varchar (50) y tiene un índice único no agrupado, pero no es la clave principal. El servidor DB es MSSQL 2008. El servidor web está ejecutando la última versión de CF9.

¿Alguna idea de por qué el cfqueryparam hace que el rendimiento se bombardee? Se comporta de esta manera cada vez, sin importar cuántas veces actualice la página. Si emparejo la lista a solo 2 o 3 hashes, todavía funciona mal a unos 150-200ms. Cuando elimino el cfqueryparam el rendimiento es el esperado. En esta situación, existe la posibilidad de una inyección SQL y, por lo tanto, sería preferible utilizar cfqueryparam, pero no debería tomar 100 ms para encontrar 2 registros de una columna indexada.

Ediciones:

Estamos utilizando hashes generados porhash() no UUIDS o GUIDS. El hash es generado por unhash(SerializeJSON({ struct })) que contiene el plan para un conjunto de operaciones para ejecutar en una imagen. El propósito de esto es que nos permite saber antes de insertar y antes de consultar la ID única exacta para esa estructura. Estos hashes actúan como un "índice" de las estructuras que ya se han almacenado en la base de datos. Además, con los hash, la misma estructura se hará con el mismo resultado, lo que no es cierto para UUIDS y GUIDS.

La consulta se está ejecutando en 5 servidores CF9 diferentes y todos ellos muestran el mismo comportamiento. Para mí, esto descarta la idea de que CF9 está almacenando algo en caché. Todos los servidores se están conectando exactamente a la misma base de datos, por lo que si ocurriera el almacenamiento en caché tendría que ser el nivel de base de datos.

Respuestas a la pregunta(3)

Su respuesta a la pregunta