SET SHOWPLAN_TEXT (Transact-SQL)
Hace que Microsoft SQL Server no ejecute instrucciones Transact-SQL. En su lugar, SQL Server devuelve información detallada sobre el modo en que se ejecutan las instrucciones.
Se aplica a: SQL Server (SQL Server 2008 a versión actual), Windows Azure SQL Database (Versión inicial a versión actual). |
Convenciones de sintaxis de Transact-SQL
Sintaxis
SET SHOWPLAN_TEXT { ON | OFF }
Comentarios
La opción SET SHOWPLAN_TEXT se establece en tiempo de ejecución, no en tiempo de análisis.
Cuando SET SHOWPLAN_TEXT es ON, SQL Server devuelve información acerca de la ejecución de cada instrucción Transact-SQL, sin ejecutarla. Cuando esta opción está establecida en ON, se devuelve información acerca del plan de ejecución de todas las instrucciones SQL Server siguientes hasta que se vuelve a establecer en OFF. Por ejemplo, si se ejecuta una instrucción CREATE TABLE cuando SET SHOWPLAN_TEXT es ON y después se ejecuta una instrucción SELECT en la que se especifica la tabla creada, SQL Server devuelve un mensaje de error en el que se indica que la tabla especificada no existe. Por ello, las referencias posteriores que se hagan a la tabla generarán un error. Cuando SET SHOWPLAN_TEXT está establecida en OFF, SQL Server ejecuta las instrucciones sin generar ningún informe con información del plan de ejecución.
SET SHOWPLAN_TEXT permite devolver una salida legible para las aplicaciones Microsoft Win32 del símbolo del sistema, como la utilidad osql. SET SHOWPLAN_ALL devuelve información más detallada, destinada a los programas diseñados para tratarla.
SET SHOWPLAN_TEXT y SET SHOWPLAN_ALL no se pueden especificar en un procedimiento almacenado. Deben ser las únicas instrucciones de un lote.
SET SHOWPLAN_TEXT devuelve la información como un conjunto de filas en forma de árbol jerárquico que representa los pasos que sigue el procesador de consultas de SQL Server al ejecutar cada instrucción. Cada instrucción reflejada en la salida contiene una fila con el texto de la instrucción, seguida de varias filas con los detalles de los pasos de su ejecución. La tabla muestra la columna que contiene la salida.
Nombre de columna |
Descripción |
---|---|
StmtText |
En las filas que no sean de tipo PLAN_ROW, esta columna contiene el texto de la instrucción Transact-SQL. En las filas de tipo PLAN_ROW, esta columna contiene una descripción de la operación. Esta columna contiene el operador físico y, opcionalmente, puede contener también el operador lógico. También puede ir seguida de una descripción determinada por el operador físico. Para obtener más información acerca de los operadores físicos, vea la columna Argument de SET SHOWPLAN_ALL (Transact-SQL) |
Para obtener más información acerca de los operadores físicos y lógicos que se pueden mostrar en la salida del plan de presentación, vea Referencia de operadores lógicos y físicos del plan de presentación.
Permisos
Para utilizar SET SHOWPLAN_TEXT, debe disponer de permisos suficientes para ejecutar las instrucciones en las que se ejecuta SET SHOWPLAN_TEXT, y debe tener el permiso SHOWPLAN para todas las bases de datos que contengan objetos a los que se hace referencia.
En el caso de las instrucciones SELECT, INSERT, UPDATE, DELETE, EXEC stored_procedure y EXEC user_defined_function, para producir un plan de presentación, el usuario debe:
Tener los permisos correspondientes para ejecutar las instrucciones Transact-SQL.
Tener el permiso SHOWPLAN en todas las bases de datos que contengan objetos a los que hacen referencia las instrucciones Transact-SQL, como tablas, vistas, etc.
Para las demás instrucciones, como DDL, USE database_name, SET, DECLARE, SQL dinámico, etc., solo son necesarios los permisos apropiados para ejecutar las instrucciones Transact-SQL.
Ejemplos
En este ejemplo se muestra la forma en que SQL Server utiliza los índices al procesar las instrucciones.
Ésta es la consulta que utiliza un índice:
USE AdventureWorks2012;
GO
SET SHOWPLAN_TEXT ON;
GO
SELECT *
FROM Production.Product
WHERE ProductID = 905;
GO
SET SHOWPLAN_TEXT OFF;
GO
El conjunto de resultados es el siguiente:
StmtText
---------------------------------------------------
SELECT *
FROM Production.Product
WHERE ProductID = 905;
StmtText
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|--Clustered Index Seek(OBJECT:([AdventureWorks2012].[Production].[Product].[PK_Product_ProductID]), SEEK:([AdventureWorks2012].[Production].[Product].[ProductID]=CONVERT_IMPLICIT(int,[@1],0)) ORDERED FORWARD)
Ésta es la consulta que no utiliza un índice:
USE AdventureWorks2012;
GO
SET SHOWPLAN_TEXT ON;
GO
SELECT *
FROM Production.ProductCostHistory
WHERE StandardCost < 500.00;
GO
SET SHOWPLAN_TEXT OFF;
GO
El conjunto de resultados es el siguiente:
StmtText
------------------------------------------------------------------------
SELECT *
FROM Production.ProductCostHistory
WHERE StandardCost < 500.00;
StmtText
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|--Clustered Index Scan(OBJECT:([AdventureWorks2012].[Production].[ProductCostHistory].[PK_ProductCostHistory_ProductCostID]), WHERE:([AdventureWorks2012].[Production].[ProductCostHistory].[StandardCost]<[@1]))