Editar: +1 funciona en esta situación porque resulta que FILE_NUMBER
es una versión de cadena con relleno de cero de un entero. Una mejor solución aquí para las cadenas es agregar ''
(la cadena vacía), ya que agregar un valor puede afectar el orden, o para que los números agreguen algo que es una constante pero que contiene una función no determinista, como sign(rand()+1)
. La idea de 'romper el género' todavía es válida aquí, es solo que mi método no era ideal.
+1
No, no quiero decir que estoy de acuerdo con nada, lo digo como una solución. Si cambia su consulta a, ORDER BY cj.FILE_NUMBER + 1
entonces TOP 1
se comportará de manera diferente.
Verá, con el objetivo de fila pequeña establecido para una consulta ordenada, el sistema intentará consumir los datos en orden, para evitar tener un operador Ordenar. También evitará construir una tabla hash, ya que probablemente no tenga que trabajar demasiado para encontrar esa primera fila. En su caso, esto está mal: por el grosor de esas flechas, parece que tiene que consumir muchos datos para encontrar una sola coincidencia.
El grosor de esas flechas sugiere que su DOCUMENT_QUEUE
tabla (DQ) es mucho más pequeña que su CORRESPONDENCE_JOURNAL
tabla (CJ). Y que el mejor plan sería verificar las filas DQ hasta encontrar una fila CJ. De hecho, eso es lo que haría el Optimizador de consultas (QO) si no tuviera este molesto ORDER BY
, eso está bien respaldado por un índice de cobertura en CJ.
Entonces, si dejaste caer el ORDER BY
completo, espero que obtenga un plan que involucre un bucle anidado, iterando sobre las filas en DQ, buscando en CJ para asegurarse de que exista la fila. Y con TOP 1
esto, esto se detendría después de que una sola fila fuera retirada.
Pero si realmente necesitas la primera fila en FILE_NUMBER
orden, entonces podría engañar al sistema para que ignore ese índice que parece (incorrectamente) ser muy útil al hacerlo ORDER BY CJ.FILE_NUMBER+1
, lo que sabemos mantendrá el mismo orden que antes, pero lo más importante es que el QO no lo hace El QO se centrará en obtener todo el conjunto, para que un operador Top N Sort pueda estar satisfecho. Este método debe producir un plan que contenga un operador Compute Scalar para calcular el valor para ordenar y un operador Top N Sort para obtener la primera fila. Pero a la derecha de estos, debería ver un bonito Nested Loop, haciendo muchas búsquedas en CJ. Y un mejor rendimiento que ejecutar a través de una gran tabla de filas que no coinciden con nada en DQ.
El Hash Match no es necesariamente horrible, pero si el conjunto de filas que está devolviendo de DQ es mucho más pequeño que CJ (como yo esperaría que fuera), entonces el Hash Match escaneará mucho más CJ de lo que necesita
Nota: Utilicé +1 en lugar de +0 porque es probable que el optimizador de consultas reconozca que +0 no cambia nada. Por supuesto, lo mismo podría aplicarse al +1, si no ahora, en algún momento en el futuro.
DOCUMENT_ID
relación entre las dos tablas (o cada registroCORRESPONDENCE_JOURNAL
tiene un registro coincidenteDOCUMENT_QUEUE
)?