Saltar al contenido

Qué desencadena esta advertencia: la conversión de tipo en la expresión puede afectar “CardinalityEstimate” en la elección del plan de consultas

Solución:

La razón por la que no hay una advertencia de “conversión de tipo / estimación de cardinalidad” en esta consulta:

SELECT LEFT(30500600, 2);

…es porque no hay estimación de cardinalidad. Es una expresión constante que se pasa a una función determinista, garantizada para devolver solo una “fila”. Creo que la explicación es tan simple como eso, ya que la advertencia es más sobre los posibles problemas de cardinalidad (en lugar de solo la simple existencia de la conversión de tipos).

Si obtengo el plan de ejecución estimado para esa declaración, es solo un elemento “seleccionar sin consulta”:

<?xml version="1.0" encoding="utf-16"?>
<ShowPlanXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="1.518" Build="13.0.5081.1" xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan">
  <BatchSequence>
    <Batch>
      <Statements>
        <StmtSimple StatementCompId="1" StatementId="1" StatementText="select LEFT(30500600, 2)" StatementType="SELECT WITHOUT QUERY" RetrievedFromCache="false" />
      </Statements>
    </Batch>
  </BatchSequence>
</ShowPlanXML>

Por lo que vale, incluso la versión de la variable de la tabla no muestra la advertencia en SQL Server 2017 (porque es realmente una advertencia inútil cuando la conversión no puede afectar una estimación de cardinalidad, como en su ejemplo).

Para ser claros, esa advertencia no es siempre inútil. Toma este ejemplo:

SELECT message_id 
INTO #SomeNumbers
from sys.messages;

SELECT * 
FROM #SomeNumbers
WHERE LEFT(message_id, 2) = '50';

Esto coloca 280192 filas en una tabla temporal. La consulta SELECT tiene esta advertencia y la advertencia es legítima. SQL Server estima que hay 28.019,2 filas coincidentes (10% de la tabla), cuando en realidad solo hay 2.156 filas coincidentes (<1% de la tabla).

Con respecto a su ejemplo en el que lanza esta entrada en el LEFT función, observe que la advertencia ha cambiado ligeramente de CONVERT_IMPLICIT para sólo CONVERT:

Escriba la conversión en la expresión (CONVERT (varchar (12),[test].[col1], 0)) puede afectar a “CardinalityEstimate” en la elección del plan de consulta

Por lo tanto, solo está reemplazando una conversión implícita por una explícita, lo que aún justifica una advertencia.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *