The SQL Booklet · SQL Server
SQL Server para todos los días.
Sintaxis, exploración, diagnóstico y planes de ejecución reunidos en un mismo lugar.
SELECT y FROM: elegir qué información queremos leer
Una tabla puede contener decenas de columnas, pero una consulta rara vez necesita mostrarlas todas. A veces buscamos el nombre y el correo de un cliente; otras veces necesitamos su…
Consultar ReferenciaWHERE: decidir qué filas cumplen la condición
Seleccionar las columnas correctas no siempre es suficiente. Podemos necesitar únicamente clientes activos, pedidos confirmados o movimientos ocurridos dentro de un periodo.
Consultar ReferenciaDISTINCT, TOP y ORDER BY: reducir y ordenar un resultado
Una consulta puede devolver todas las filas que cumplen una condición y aun así no responder exactamente lo que buscamos. Quizá necesitamos conocer los estados existentes sin repet…
Consultar ReferenciaINNER JOIN: conservar las coincidencias
Tenemos clientes en una tabla y pedidos en otra. Las dos contienen información distinta sobre la misma operación: una identifica a la persona y la otra registra lo que ocurrió con …
Consultar ReferenciaLEFT, RIGHT y FULL JOIN: conservar filas sin coincidencia
Un INNER JOIN responde bien cuando solo nos interesan las filas relacionadas. El problema cambia cuando también necesitamos ver lo que quedó fuera: clientes sin pedidos, productos …
Consultar ReferenciaCROSS JOIN, CROSS APPLY y OUTER APPLY: combinar y evaluar filas
Estas construcciones comparten una palabra, pero resuelven necesidades distintas. CROSS JOIN genera combinaciones entre dos conjuntos. APPLY permite ejecutar una expresión tabular …
Consultar ReferenciaCOUNT, SUM, AVG, MIN y MAX: resumir un conjunto
A veces no necesitamos observar cada producto por separado. Queremos saber cuántos están activos, cuánto suman sus precios o cuáles son los valores mínimo y máximo del catálogo.
Consultar ReferenciaGROUP BY y HAVING: resumir y filtrar por grupo
Un total general puede decirnos cuántos pedidos existen, pero no cómo se distribuyen. Si necesitamos una cantidad por cliente, por estado o por mes, debemos formar grupos antes de …
Consultar ReferenciaCASE: expresar decisiones dentro de una consulta
Una consulta no siempre debe devolver el valor exactamente como está almacenado. A veces necesitamos clasificar una existencia, traducir un estado o calcular un valor distinto segú…
Consultar ReferenciaCOALESCE, ISNULL y NULLIF: trabajar con valores ausentes
Un valor NULL representa información desconocida o no disponible. No equivale a cero, a una cadena vacía ni a una cadena formada por espacios. Esos estados pueden necesitar el mism…
Consultar ReferenciaINSERT: agregar filas de forma explícita
Cuando registramos un cliente, un pedido o un movimiento de inventario necesitamos crear filas nuevas. INSERT indica la tabla de destino, las columnas que recibiremos y los valores…
Consultar ReferenciaUPDATE: modificar únicamente las filas previstas
Actualizar datos parece sencillo hasta que una condición afecta más filas de las esperadas. La parte esencial de un UPDATE no es la asignación, sino demostrar antes cuáles filas ca…
Consultar ReferenciaDELETE y TRUNCATE: retirar datos con alcances diferentes
Eliminar información exige distinguir dos intenciones: borrar filas seleccionadas o vaciar una tabla completa. DELETE y TRUNCATE TABLE pueden dejar una tabla sin datos, pero no sig…
Consultar ReferenciaUNION y UNION ALL: combinar resultados compatibles
Algunas veces la información vive en tablas distintas pero representa el mismo tipo de entidad. Podemos tener pedidos actuales y pedidos históricos, o resultados provenientes de do…
Consultar ReferenciaSubconsultas, EXISTS y NOT EXISTS: utilizar resultados relacionados
Una consulta puede necesitar la respuesta de otra: saber si un cliente tiene pedidos, comparar un precio con el promedio o recuperar un valor calculado para la fila actual.
Consultar ReferenciaWITH y CTE: nombrar un resultado intermedio
Una consulta extensa puede repetir cálculos, mezclar demasiados niveles o esconder la intención principal. Una expresión de tabla común, conocida como CTE, permite dar nombre a un …
Consultar ReferenciaOVER y PARTITION BY: calcular sin perder el detalle
Una agregación con GROUP BY reduce varias filas a un resumen. Eso funciona cuando solo necesitamos el total, pero no cuando queremos conservar cada partida y mostrar junto a ella e…
Consultar ReferenciaROW_NUMBER, RANK y DENSE_RANK: numerar y clasificar filas
Ordenar un resultado no asigna una posición que podamos reutilizar. Si necesitamos elegir el pedido más reciente de cada cliente, numerar resultados o representar empates, utilizam…
Consultar ReferenciaOFFSET y FETCH: dividir un resultado ordenado en páginas
Una pantalla de búsqueda rara vez muestra miles de filas a la vez. Necesitamos solicitar una porción del resultado: la primera página, la segunda o cualquier bloque posterior.
Consultar ReferenciaCAST, CONVERT, TRY_CAST y TRY_CONVERT: controlar tipos de datos
SQL Server puede convertir algunos valores de forma implícita, es decir, sin que la consulta solicite la conversión de manera expresa. Confiar en ello puede ocultar errores, altera…
Consultar ReferenciaFunciones de texto: construir, localizar y normalizar cadenas
Los textos suelen llegar con mayúsculas diferentes, espacios adicionales o fragmentos que necesitamos localizar. SQL Server incluye funciones para combinar, extraer, buscar, reempl…
Consultar ReferenciaFunciones de fecha: calcular periodos y construir límites seguros
Las fechas representan instantes —puntos concretos en el tiempo— o periodos —intervalos entre dos límites—, no textos con un formato visual. Para sumar días, medir diferencias, obt…
Consultar ReferenciaTablas temporales y variables de tabla: conservar resultados durante un proceso
Algunas tareas necesitan separar una consulta compleja en etapas, reutilizar un conjunto o inspeccionarlo antes de modificar datos. SQL Server ofrece tablas temporales y variables …
Consultar ReferenciaTransacciones y TRY/CATCH: completar o revertir una unidad de trabajo
Cuando una operación modifica varias tablas, conservar solo la primera mitad puede dejar datos inconsistentes. Una transacción agrupa instrucciones para confirmarlas juntas con COM…
Consultar ReferenciaOperadores de comparación y lógicos: construir condiciones precisas
Una condición es una expresión cuyo resultado decide si una fila cumple una regla. Puede ser sintácticamente válida y aun así seleccionar filas distintas a las que imaginamos. Los …
Consultar ReferenciaDECLARE, SET y asignación con SELECT: trabajar con variables
Una consulta reutilizable no debería obligarnos a modificar valores dispersos dentro del código. Una variable conserva un valor bajo un nombre durante su alcance. Puede representar…
Consultar ReferenciaIF, ELSE y BEGIN...END: decidir qué instrucciones ejecutar
Algunos procesos deben seguir rutas distintas según exista información, un parámetro sea válido o una operación haya afectado filas. IF evalúa una condición y decide qué instrucció…
Consultar ReferenciaWHILE, BREAK y CONTINUE: repetir con un límite visible
SQL está diseñado principalmente para operar sobre conjuntos: indicar qué filas deben afectarse sin recorrerlas una por una. Aun así, algunos procesos necesitan repetir un bloque m…
Consultar ReferenciaCREATE, ALTER y DROP: administrar el ciclo de vida de un objeto
Las consultas trabajan con objetos: estructuras con nombre definidas dentro de la base, como tablas, vistas, procedimientos, funciones e índices. CREATE, ALTER y DROP representan t…
Consultar ReferenciaCREATE TABLE y restricciones: expresar reglas desde el esquema
Una tabla no es solo una lista de columnas. También debe expresar cómo se identifica cada fila, qué relaciones son válidas y qué valores puede aceptar.
Consultar ReferenciaALTER TABLE: cambiar una estructura que ya contiene datos
Las bases evolucionan: aparece un dato nuevo, cambia una longitud o necesitamos proteger una regla que antes solo vivía en la aplicación.
Consultar ReferenciaVistas: nombrar y reutilizar una consulta
Una misma selección puede aparecer en reportes, integraciones y pantallas diferentes. Una vista es un objeto que asigna un nombre a una consulta y presenta su resultado como un con…
Consultar ReferenciaProcedimientos almacenados: encapsular una operación con parámetros
Cuando una consulta debe ejecutarse desde varias aplicaciones o necesita combinar validaciones, lecturas y modificaciones, un procedimiento permite darle un nombre y una interfaz e…
Consultar ReferenciaFunciones definidas por el usuario: reutilizar un cálculo o un conjunto
Algunas reglas aparecen una y otra vez dentro de consultas: calcular un importe, obtener una etiqueta o seleccionar un conjunto mediante un parámetro. Una función les asigna un nom…
Consultar ReferenciaPIVOT y UNPIVOT: cambiar la orientación de un conjunto
Un reporte puede necesitar una columna por estado, mes o categoría aunque los datos originales estén almacenados como filas. PIVOT convierte valores de una columna en encabezados y…
Consultar ReferenciaINTERSECT y EXCEPT: comparar conjuntos de filas
Cuando necesitamos saber qué elementos comparten dos consultas o cuáles aparecen solamente en una, podemos expresar la comparación directamente como una operación entre conjuntos.
Consultar ReferenciaOUTPUT, inserted y deleted: observar las filas modificadas
Después de insertar, actualizar o eliminar datos, a menudo necesitamos conocer las filas realmente afectadas. OUTPUT devuelve valores de las imágenes lógicas inserted y deleted com…
Consultar ReferenciaSTRING_AGG y STRING_SPLIT: reunir y separar texto delimitado
Algunas salidas necesitan presentar varios valores en una sola cadena; otras reciben una cadena con elementos delimitados que debemos convertir en filas. STRING_AGG reúne y STRING_…
Consultar ReferenciaJSON: leer, transformar y producir documentos desde SQL Server
Una API —una interfaz mediante la que dos sistemas intercambian solicitudes y respuestas— o integración puede entregar un documento JSON que necesitamos validar y convertir en fila…
Consultar ReferenciaMERGE: comparar una fuente con una tabla de destino
Una carga puede traer filas que debemos insertar cuando son nuevas y actualizar cuando ya existen. MERGE expresa esa comparación mediante una fuente —el conjunto entrante—, un dest…
Consultar ReferenciaOPTION y query hints: influir en la compilación
Una consulta describe el resultado que necesitamos. El optimizador de SQL Server compara alternativas y elige un plan para producirlo. Un **query hint** —una indicación aplicada a …
Consultar Casos aplicadosConsultar clientes con sus pedidos confirmados
Necesitamos preparar una lista de pedidos confirmados. El nombre del cliente está en Cliente, mientras que la fecha y el estado pertenecen a Pedido.
Consultar Casos aplicadosEncontrar clientes que todavía no tienen pedidos
Queremos identificar clientes activos que aún no aparecen en Pedido. La dificultad consiste en conservar precisamente las filas que no encuentran correspondencia.
Consultar Casos aplicadosMostrar el primer teléfono disponible de cada cliente
El sistema guarda teléfono móvil y teléfono de casa en columnas distintas. Queremos presentar un único teléfono de contacto, prefiriendo el móvil y evitando tratar una cadena vacía o compuesta por espacios como un número
Consultar Casos aplicadosObtener ventas totales por cliente y filtrar las más altas
Queremos conocer cuánto ha comprado cada cliente en pedidos confirmados o enviados. Cada partida tiene cantidad, precio unitario y descuento; por tanto, el total no está guardado directamente en Pedido.
Consultar Casos aplicadosInsertar un pedido y sus partidas de forma segura
Un pedido y sus partidas representan una sola operación. Una transacción permite confirmar todos sus cambios o revertirlos como una unidad. Si el encabezado se guarda pero una partida falla, no queremos dejar información
Consultar Casos aplicadosActualizar precios de una categoría con validación previa
Necesitamos aumentar 8% el precio de los productos activos de la categoría Accesorios. Antes de modificar, queremos ver el alcance; durante la actualización, registrar los valores anteriores y nuevos.
Consultar Casos aplicadosCombinar pedidos actuales e históricos
Los pedidos recientes permanecen en Pedido y PedidoDetalle; los antiguos fueron resumidos en PedidoHistorico. Queremos una cronología única sin ocultar de dónde procede cada fila.
Consultar Casos aplicadosObtener el último pedido de cada cliente
Queremos mostrar una sola fila por cliente con su pedido más reciente. Agrupar por cliente y utilizar MAX(FechaPedido) obtiene la fecha, pero no trae de manera segura el identificador y el estado de esa misma fila.
Consultar Casos aplicadosCalcular venta diaria y total acumulado
Necesitamos una serie diaria de ventas y, junto a cada día, el importe acumulado desde el inicio del periodo. La primera cifra reduce partidas a una fila diaria; la segunda utiliza esas filas sin volver a reducirlas.
Consultar Casos aplicadosConstruir una búsqueda paginada con filtros opcionales
Una pantalla de productos permite escribir parte del nombre, elegir una categoría y limitar un rango de precios. Todos los filtros son opcionales y el resultado debe dividirse en páginas estables.
Consultar Desarrollo y exploraciónBuscar una tabla o vista por nombre
Conocemos una palabra del nombre —por ejemplo, “Pedido”— pero no sabemos si el objeto es una tabla, una vista ni en qué esquema se encuentra. Abrir carpeta por carpeta funciona en una base pequeña; en una base heredada p
Consultar Desarrollo y exploraciónBuscar una columna en toda la base
Una pantalla, un error o un requisito menciona IdCliente, pero todavía no sabemos qué tablas guardan ese dato. El nombre de una columna suele ser una pista útil para empezar a reconstruir el modelo.
Consultar Desarrollo y exploraciónBuscar texto dentro de procedimientos, vistas y funciones
Necesitamos saber dónde aparece el nombre de una tabla, una columna o una llamada concreta. Revisar manualmente cada procedimiento almacenado puede ocultar justo la referencia que explica un comportamiento.
Consultar Desarrollo y exploraciónConsultar dependencias de un objeto
Antes de modificar una tabla, vista o procedimiento queremos saber qué objetos menciona y qué otros objetos lo mencionan. La duda no es solo “¿existe?”, sino “¿qué podría verse afectado?”.
Consultar Desarrollo y exploraciónListar relaciones y llaves foráneas
Encontramos una tabla, pero aún no sabemos qué otras tablas apuntan hacia ella ni a cuáles apunta. Las llaves foráneas registran una parte de esas relaciones y también revelan reglas que pueden afectar una eliminación o
Consultar Desarrollo y exploraciónConsultar llaves primarias, restricciones únicas e índices
Necesitamos entender cómo se identifica cada fila y qué estructuras existen para conservar unicidad o apoyar búsquedas. Ver solo el nombre de un índice no basta: también importan el orden de sus columnas, las columnas in
Consultar Desarrollo y exploraciónListar columnas con tipo, longitud, nulabilidad y valor predeterminado
Encontramos la tabla que buscábamos, pero todavía no sabemos qué datos espera. Antes de escribir un INSERT, preparar una integración o cambiar una columna, necesitamos una radiografía legible de su estructura.
Consultar Desarrollo y exploraciónEncontrar triggers y sus tablas asociadas
Un INSERT, UPDATE o DELETE produce cambios adicionales, rechaza una operación o tarda más de lo esperado. Parte de esa lógica puede estar en un trigger y ejecutarse sin aparecer en la instrucción original.
Consultar Desarrollo y exploraciónEncontrar objetos modificados recientemente
Un comportamiento cambió después de un despliegue o necesitamos reconocer qué objetos han recibido modificaciones recientes. El catálogo ofrece una fecha útil para reducir la búsqueda inicial.
Consultar Desarrollo y exploraciónObtener conteos aproximados de todas las tablas
Queremos reconocer rápidamente cuáles tablas están vacías, cuáles tienen miles de filas y cuáles dominan el volumen de la base. Ejecutar COUNT(*) sobre cada tabla puede ser innecesariamente costoso para una primera explo
Consultar Desarrollo y exploraciónMedir el espacio utilizado por cada tabla
La base está creciendo o necesitamos decidir dónde concentrar una revisión. El número de filas ayuda, pero no revela cuánto almacenamiento consumen los datos, índices y páginas reservadas.
Consultar Desarrollo y exploraciónRevisar columnas IDENTITY y su valor actual
Una tabla presenta saltos en sus identificadores, recibió una carga con valores explícitos o se acerca al límite de su tipo numérico. Antes de modificar la secuencia necesitamos conocer su definición y el último valor ge
Consultar Desarrollo y exploraciónDetectar registros duplicados por una clave de negocio
Una carga contiene clientes con correos repetidos, o una tabla permite guardar varias filas que representan el mismo dato funcional. La llave primaria distingue cada registro, pero no responde si el negocio los considera
Consultar Desarrollo y exploraciónDetectar registros huérfanos
Una carga contiene pedidos cuyo cliente no aparece en el catálogo recibido. También puede ocurrir en una base sin llaves foráneas, después de una migración incompleta o cuando la relación se valida únicamente en la aplic
Consultar Desarrollo y exploraciónComparar dos conjuntos de datos
Una carga de productos debería coincidir con la tabla actual, pero necesitamos saber qué filas faltan y cuáles contienen valores diferentes. Comparar solo el número de registros puede ocultar cambios importantes.
Consultar Desarrollo y exploraciónValidar conversiones antes de modificar una columna
Una tabla de carga guarda fechas y cantidades como texto. Antes de convertir las columnas o mover los datos a tablas definitivas necesitamos encontrar los valores que no cumplen el formato esperado.
Consultar Desarrollo y exploraciónEjecutar un UPDATE con validación y reversión controlada
Necesitamos aumentar el precio de los productos activos de una categoría. La condición parece sencilla, pero un filtro incorrecto podría modificar más filas de las previstas y dejar el error confirmado antes de detectarl
Consultar Desarrollo y exploraciónEjecutar un DELETE con respaldo lógico y reversión controlada
Una corrección requiere retirar movimientos de inventario identificados y anteriores a una fecha. Además de comprobar el filtro, necesitamos conservar una copia recuperable si la eliminación llega a confirmarse.
Consultar Desarrollo y exploraciónComparar la estructura de dos bases de datos
Una aplicación funciona en desarrollo, pero falla al desplegarse porque una columna tiene otra longitud, permite valores nulos o utiliza un tipo diferente en producción. Revisar las tablas una por una hace fácil pasar po
Consultar Desarrollo y exploraciónDescribir el resultado de una consulta o procedimiento
Necesitamos integrar una consulta en una aplicación, pero no sabemos con certeza qué nombres, tipos y nulabilidad devolverá. Ejecutarla con datos reales puede ser costoso o exigir parámetros que todavía no tenemos prepar
Consultar Desarrollo y exploraciónEncontrar tablas sin llave primaria
Una actualización necesita identificar cada fila de manera inequívoca, pero no sabemos qué tablas declaran una llave primaria. También queremos localizar estructuras que merecen revisión antes de una integración o migrac
Consultar Desarrollo y exploraciónBuscar un valor en columnas seleccionadas
Conocemos un nombre, correo o referencia, pero no recordamos en cuál de varias columnas de texto se guardó. Generar una búsqueda sobre toda la base sería costoso y podría leer información que no necesitamos.
Consultar Diagnóstico y optimizaciónVer solicitudes activas y su consulta SQL
La aplicación responde con lentitud y necesitamos saber qué está ejecutando SQL Server en este momento. Una lista de sesiones conectadas no basta: una conexión puede existir sin tener una solicitud activa.
Consultar Diagnóstico y optimizaciónIdentificar sesiones bloqueadoras y bloqueadas
Una solicitud permanece suspendida y muestra un identificador en blocking_session_id. Necesitamos saber quién espera, qué sesión está delante y qué texto podemos inspeccionar en ambos extremos.
Consultar Diagnóstico y optimizaciónConstruir la cadena de bloqueo
Varias sesiones aparecen bloqueadas y algunas de ellas también bloquean a otras. Leer pares aislados dificulta encontrar la sesión que encabeza el problema.
Consultar Diagnóstico y optimizaciónEncontrar transacciones abiertas por mucho tiempo
Una sesión encabeza bloqueos o el log crece mientras una transacción permanece abierta. Necesitamos medir desde cuándo existe y relacionarla con la sesión que la mantiene.
Consultar Diagnóstico y optimizaciónEncontrar sesiones inactivas con transacción abierta
Una sesión aparece como sleeping, pero continúa bloqueando otras solicitudes o impide reutilizar espacio del log. No está ejecutando una petición y, aun así, conserva una transacción.
Consultar Diagnóstico y optimizaciónVer esperas de las solicitudes activas
Una solicitud está suspendida, pero el tipo de espera mostrado en su fila no explica todas las tareas que participan. Esto ocurre especialmente en consultas paralelas, donde distintas tareas pueden esperar por motivos di
Consultar Diagnóstico y optimizaciónRevisar las principales esperas acumuladas
El servidor se percibe lento en distintos momentos, pero una captura de solicitudes activas no muestra un patrón estable. Necesitamos saber en qué familias de espera se ha concentrado el tiempo desde el inicio de la medi
Consultar Diagnóstico y optimizaciónEncontrar consultas con mayor consumo total de CPU
El uso de CPU es elevado o presenta picos repetidos. Antes de revisar planes al azar, necesitamos localizar las sentencias terminadas que más CPU han acumulado entre los planes todavía presentes en caché.
Consultar Diagnóstico y optimizaciónEncontrar consultas con mayor lectura lógica
La carga de datos parece excesiva o determinadas operaciones presionan memoria y CPU. Queremos identificar sentencias terminadas que han solicitado más páginas al búfer durante la vida de sus planes en caché.
Consultar Diagnóstico y optimizaciónEncontrar consultas con mayor duración promedio
Los usuarios informan respuestas lentas, pero el consumo total oculta operaciones poco frecuentes. Necesitamos localizar sentencias cuyo tiempo transcurrido promedio es alto entre los planes todavía presentes en caché.
Consultar Diagnóstico y optimizaciónRecuperar el plan de ejecución almacenado
Una sentencia aparece entre las de mayor CPU, lecturas o duración. Para entender cómo SQL Server decidió ejecutarla, queremos recuperar el plan asociado que todavía se encuentra en caché.
Consultar Diagnóstico y optimizaciónRevisar sugerencias de índices faltantes
Una consulta realiza muchas lecturas o presenta un acceso costoso y el plan sugiere un índice. Queremos reunir las sugerencias registradas para la base actual y ordenarlas por su beneficio acumulado estimado.
Consultar Diagnóstico y optimizaciónRevisar uso de índices
Una tabla tiene varios índices y necesitamos saber cuáles han participado en lecturas y cuáles han recibido mantenimiento por cambios de datos. La comparación ayuda a encontrar candidatos que merecen una revisión más pro
Consultar Diagnóstico y optimizaciónRevisar fragmentación de índices con alcance controlado
Un índice grande participa en lecturas relevantes y queremos conocer su fragmentación antes de considerar mantenimiento. La revisión debe limitarse a un objeto concreto para no convertir el diagnóstico en una carga innec
Consultar Diagnóstico y optimizaciónRevisar antigüedad y modificación de estadísticas
Un plan estima cantidades de filas muy distintas de las observadas o cambia de forma inesperada. Necesitamos saber cuándo se actualizaron sus estadísticas, cuánto se muestreó y cuántas modificaciones registra la columna
Consultar Diagnóstico y optimizaciónMedir el uso de espacio y log de cada base
Una base se acerca al límite del volumen o el archivo de log crece con frecuencia. Necesitamos separar tamaño asignado, espacio utilizado y espacio todavía disponible dentro de los archivos actuales.
Consultar Diagnóstico y optimizaciónDiagnosticar por qué el log no puede reutilizarse
El porcentaje utilizado del log sigue creciendo o no disminuye después de la operación esperada. Necesitamos identificar qué condición reporta SQL Server como impedimento actual para truncar y reutilizar registros inacti
Consultar Diagnóstico y optimizaciónRecuperar deadlocks recientes de system_health
Una aplicación recibe errores de víctima de deadlock, pero el bloqueo ya desapareció cuando se revisa el servidor. Necesitamos recuperar el grafo conservado por la sesión system_health para conocer procesos y recursos pa
Consultar Diagnóstico y optimizaciónEncontrar consultas degradadas mediante Query Store
Una operación que antes respondía con normalidad ahora tarda más, pero el plan anterior ya no está en caché. Necesitamos comparar una ventana reciente con un periodo base conservado por Query Store.
Consultar Diagnóstico y optimizaciónEncontrar sesiones y solicitudes que consumen tempdb
tempdb crece, se acerca a su límite o muestra presión durante una carga concreta. Necesitamos saber qué sesiones conservan asignaciones de objetos de usuario e internos y cuánto corresponde a tareas todavía activas.
Consultar Diagnóstico y optimizaciónRevisar concesiones de memoria pendientes o excesivas
Hay esperas RESOURCE_SEMAPHORE, consultas suspendidas o pocas operaciones que parecen reservar gran parte de la memoria disponible para ejecución. Necesitamos ver solicitudes pendientes y concesiones grandes que siguen a
Consultar Diagnóstico y optimizaciónCalcular latencia de lectura y escritura por archivo
Las esperas apuntan a entrada y salida o varias bases comparten almacenamiento. Necesitamos comparar cuánto esperan las lecturas y escrituras de cada archivo según los contadores acumulados por SQL Server.
Consultar Diagnóstico y optimizaciónEncontrar consultas con varios planes y rendimientos diferentes
Una misma consulta alterna entre respuestas rápidas y lentas, o la [comparación de ventanas en Query Store](/es/diagnostico/encontrar-consultas-degradadas/) mostró una degradación. Queremos comparar los planes que Query
Consultar Planes de ejecuciónPara qué sirve un plan de ejecución
Escribimos una consulta para indicar qué resultado necesitamos. SQL Server todavía debe decidir cómo localizar, combinar y procesar los datos para producirlo. El plan de ejecución representa esa estrategia.
Consultar Planes de ejecuciónPlan estimado, plan real y estadísticas en vivo
SQL Server puede mostrar la estrategia de una consulta antes de ejecutarla, después de observar una ejecución o mientras el trabajo continúa. Las tres modalidades representan el plan, pero no contienen la misma evidencia
Consultar Planes de ejecuciónCómo se organiza el árbol de un plan de ejecución
Un plan de ejecución puede extenderse de izquierda a derecha en la pantalla, pero su estructura se describe como un árbol. Reconocer sus partes permite seguir la estrategia sin depender todavía del significado de cada ic
Consultar Planes de ejecuciónFlechas, propiedades y número de ejecuciones
El dibujo de un plan permite reconocer operadores y conexiones, pero no contiene toda la evidencia en sus etiquetas visibles. Las flechas ofrecen una primera orientación; las propiedades permiten comprobar qué cantidad r
Consultar Planes de ejecuciónMapa de operadores: qué papel cumple cada nodo
Un plan pequeño puede contener búsquedas, filtros, uniones, cálculos y ordenamientos en la misma rama. Leer los nombres como una lista aislada obliga a memorizar iconos; agruparlos por la función que cumplen permite reco
Consultar Planes de ejecuciónFilas estimadas y filas reales
SQL Server calcula cuántas filas espera en cada operador y, cuando capturamos un plan real, registra cuántas observó durante esa ejecución. Comparar ambas cifras permite localizar una suposición que no coincidió con los
Consultar Planes de ejecuciónIndex Seek, Index Scan y Table Scan
Dos consultas pueden devolver la misma fila y, aun así, recorrer estructuras distintas para encontrarla. El nombre del operador resume ese acceso; las propiedades muestran cuánto leyó, qué entregó y qué condición aplicó.
Consultar Planes de ejecuciónKey Lookup y trabajo repetido
Un índice puede localizar las filas solicitadas sin contener todas las columnas que necesita la consulta. SQL Server utiliza entonces el localizador guardado en ese índice para volver a la fila completa. El plan represen
Consultar Planes de ejecuciónFilter, Compute Scalar y Top
No todos los operadores buscan datos o relacionan tablas. Algunos reciben un flujo ya producido y lo transforman: descartan filas, calculan una columna o detienen la entrega cuando alcanzan un límite.
Consultar Planes de ejecuciónNested Loops, Hash Match y Merge Join
Una consulta puede escribir un solo INNER JOIN y obtener el mismo resultado mediante estrategias físicas distintas. El tipo de JOIN pertenece a la expresión lógica; Nested Loops, Hash Match y Merge Join describen cómo SQ
Consultar Planes de ejecuciónSort, Segment y Sequence Project
Una función de ventana conserva cada fila y agrega un valor calculado sobre filas relacionadas. Para producir una numeración por grupo, el plan necesita ordenar el flujo, reconocer dónde cambia cada grupo y mantener el e
Consultar Planes de ejecuciónStream Aggregate y Hash Match (Aggregate)
GROUP BY expresa que varias filas deben convertirse en un resultado por grupo. El plan todavía debe elegir cómo mantener esos grupos mientras calcula COUNT, SUM u otra agregación.
Consultar Planes de ejecuciónSpool: materialización y reutilización
Algunas ramas producen filas que otro operador podría solicitar varias veces. SQL Server puede conservar ese resultado intermedio en una estructura de trabajo y volver a leerlo en lugar de reconstruirlo siempre desde su
Consultar Planes de ejecuciónParallelism: distribuir, repartir y reunir filas
Un plan serial realiza el trabajo mediante un solo flujo. Un plan paralelo puede dividir una parte entre varios trabajadores y después coordinar las filas que cada uno produce.
Consultar Planes de ejecuciónAdvertencias del plan que requieren investigación
Un triángulo amarillo llama la atención sobre una condición que SQL Server pudo identificar al compilar o ejecutar una consulta. La advertencia señala dónde conviene mirar; no demuestra por sí sola qué causó una demora n
Consultar Planes de ejecuciónAcciones disponibles en el plan gráfico de SSMS
El plan gráfico no es solamente una imagen. SSMS permite inspeccionar un operador, abrir la representación XML, guardar el plan y preparar comparaciones o análisis. Cada acción abre evidencia distinta; ninguna convierte
Consultar Planes de ejecuciónCómo se organiza el XML Showplan
El plan gráfico de SSMS se construye a partir de un documento XML. El gráfico facilita la orientación; el XML conserva la estructura completa, los atributos de cada operador y, cuando se trata de un plan real, las métric
Consultar Planes de ejecuciónRecorrer Analyze Actual Execution Plan
Analyze Actual Execution Plan revisa un plan real y señala patrones que SSMS reconoce en la ejecución observada. La herramienta ayuda a localizar un punto que merece investigación; no confirma por sí sola la causa ni dec
Consultar Planes de ejecuciónLecturas con SET STATISTICS IO
El plan muestra la estrategia elegida para resolver una consulta. SET STATISTICS IO agrega otra pieza de evidencia: cuántas páginas leyó SQL Server de cada objeto durante esa ejecución.
Consultar Planes de ejecuciónCPU y duración con SET STATISTICS TIME
Una consulta lenta no necesariamente mantiene ocupado al procesador durante todo ese tiempo. SET STATISTICS TIME separa el trabajo de CPU del tiempo transcurrido y también informa cuánto tardaron el análisis y la compila
Consultar Planes de ejecuciónConstruir una línea base repetible
Una medición aislada describe una ejecución. Una línea base conserva las condiciones relevantes, repite la consulta y registra cuánto varían sus resultados antes de cambiar algo.
Consultar Planes de ejecuciónGuardar y comparar dos planes
Dos consultas pueden devolver el mismo resultado mediante estrategias distintas. Guardar cada plan como .sqlplan permite conservar la evidencia y abrir ambos en Compare Showplan sin depender de la memoria o de capturas s
Consultar Planes de ejecuciónHistorial y regresiones con Query Store
El plan que vemos en una ejecución no explica cómo se comportó la consulta ayer ni qué estrategia utilizó durante otro intervalo. Query Store conserva texto, planes y estadísticas de ejecución dentro de la base para pode
Consultar Planes de ejecuciónConvertir un escenario de Analyze Actual Execution Plan en una hipótesis
Un escenario de Analyze Actual Execution Plan señala una diferencia que merece investigación. Para convertir esa señal en una hipótesis necesitamos proponer una explicación, anticipar qué debería cambiar si fuera correct
Consultar Planes de ejecuciónLeer una sugerencia Missing Index en el plan
Una sugerencia Missing Index indica que el optimizador encontró una estructura hipotética con la que estimó un costo menor para la consulta. La señal merece revisión, pero no demuestra que el índice deba crearse ni que e
Consultar Planes de ejecuciónEntender el CREATE INDEX generado por SSMS
Missing Index Details convierte una solicitud del optimizador en una instrucción legible. La instrucción ayuda a reconocer una posible estructura, pero todavía no es un índice listo para crear: conserva un nombre provisi
Consultar Planes de ejecuciónDecidir, crear y comprobar un índice
Una sugerencia de índice se convierte en una decisión cuando se compara con las estructuras existentes, se prueba con la misma consulta y se documentan tanto el beneficio como el costo agregado. En esta prueba, el candid
Consultar Planes de ejecuciónDe una consulta lenta a una hipótesis comprobable
Una consulta lenta es un síntoma. Para convertirlo en una investigación útil hay que conservar la consulta, reunir evidencia y escribir una explicación que pueda fallar. La primera señal del plan no es todavía la causa.
Consultar Planes de ejecuciónEvaluar un cambio sin optimizar solo una ejecución
Una alternativa no se valida porque una ejecución termine rápido. Debe conservar el resultado, repetir el beneficio con parámetros distintos y mostrar qué aspectos mejoran, cuáles permanecen iguales y cuáles todavía no f
Consultar Planes de ejecuciónAnálisis guiado de una consulta empresarial reproducible
Una optimización termina cuando podemos explicar qué necesitaba el negocio, qué trabajo hacía SQL Server, qué cambió y qué falta comprobar. Este caso recorre el proceso completo sin atribuir a una sola ejecución más de l
ConsultarNo encontramos una entrada con esas palabras.