AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 184111
Accepted
SpaceGhost440
SpaceGhost440
Asked: 2017-08-23 11:14:41 +0800 CST2017-08-23 11:14:41 +0800 CST 2017-08-23 11:14:41 +0800 CST

Analisar programaticamente os parâmetros de procedimentos armazenados

  • 772

Eu tenho tentado descobrir como verificar os parâmetros de procs armazenados do plano de execução. Muitas vezes vejo que a maioria das pessoas sugere usar o ParameterList dentro do xml do plano de execução. Isso funciona bem quando há apenas uma instrução que usa todos os parâmetros. Entretanto, este normalmente não é o caso. Os parâmetros do procedimento armazenado podem ser distribuídos em várias consultas ou não serem usados ​​em uma consulta.

Nos meus exemplos abaixo, gostaria de saber como obter os parâmetros distintos e seus valores do exemplo usando funções sql xml. Além disso, você notará que nem todos os parâmetros são enviados para ParameterLists.

/***********************************************************************/
/*EXAMPLE: you have to scan all of the selects parameter lists to match up the parameter names to the proc parameters */
/***********************************************************************/
IF OBJECT_ID (N'dbo.TestFooProc') IS NULL
   EXEC('CREATE PROCEDURE dbo.TestFooProc AS SET NOCOUNT ON;');
GO

ALTER PROCEDURE dbo.TestFooProc (
    @p1 int,
    @p2 int,
    @p3 int = 8675309
) AS 
BEGIN
    --distribute the parameters over multiple selects
    SELECT * FROM master.dbo.[spt_values] sv WHERE [sv].[number] = @p2;

    -- other simulated queries ...

    SELECT * FROM master.dbo.[spt_values] sv WHERE [sv].[number] = @p1;

END
GO

EXEC dbo.TestFooProc @p1 = 5, @p2 = 22

SELECT [db_name] = DB_NAME([eps].[database_id]), qt.[text], qp.[query_plan]
FROM  sys.[dm_exec_procedure_stats] eps
CROSS APPLY sys.[dm_exec_sql_text](eps.sql_handle) qt
CROSS APPLY sys.dm_exec_query_plan(eps.plan_handle) AS qp
WHERE [eps].[database_id] = DB_ID() 
    AND qt.[text] LIKE '%dbo.TestFooProc%'


RETURN  -- CLEANUP

IF OBJECT_ID (N'dbo.TestFooProc') IS NOT NULL
   DROP PROCEDURE dbo.TestFooProc; 
GO
sql-server execution-plan
  • 2 2 respostas
  • 527 Views

2 respostas

  • Voted
  1. SpaceGhost440
    2017-08-24T08:18:11+08:002017-08-24T08:18:11+08:00

    Ok, depois de muito pesquisar sobre isso, determinei que isso nem sempre é possível. Detalharei os seguintes cenários que decompõem a capacidade de obter os parâmetros originais do plano de execução.

    • Se o parâmetro não for usado em uma cláusula where. Cenários:
      • O parâmetro é colocado em uma variável local como uma maneira de contornar o sniffing de parâmetros
      • O parâmetro é usado em um cálculo em uma variável local
    • Se o parâmetro for usado em uma cláusula where, mas uma função for usada nele
    • Se o parâmetro for usado em várias instruções sql no proc armazenado, ele aparecerá em várias listas de parâmetros.

    Eu só queria uma lista de todos os parâmetros originais passados ​​para o proc armazenado e seus valores da criação do plano original para que eu pudesse recriar a chamada, se necessário. Eu sei que poderia obter essas informações usando eventos estendidos ou criador de perfil, mas estava tentando extraí-las dos planos de consulta.

    • 0
  2. Best Answer
    SpaceGhost440
    2017-08-24T13:21:40+08:002017-08-24T13:21:40+08:00

    Isso é o mais próximo que cheguei de extrair os parâmetros e seus valores do plano. No entanto, essa consulta não consegue obter os parâmetros 100% das vezes devido aos motivos listados acima.

    EDIT: Removida a consulta postada anterior. Esta versão agrupa todos os parâmetros e os encontra em qualquer nível no plano. Isso é o mais próximo do que eu queria originalmente. Também ignora se os parâmetros estão em um StmtSimple ou um StmtCond:

    ;WITH XMLNAMESPACES (DEFAULT 'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
    SELECT qs.[sql_handle], qt.[text], qp.[query_plan], [ParamXml] = CAST(fnParams.[ParamXml] AS xml)
    FROM sys.[dm_exec_procedure_stats] qs
    CROSS APPLY sys.dm_exec_sql_text(qs.plan_handle) as qt
    CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp
    OUTER APPLY (
        SELECT [ParamXml] = (
            SELECT [@Parameter] = t1.[Column], [@Value] = t1.[Value] 
            FROM (
                SELECT [Column] =  CAST(stmts.stmt.value('@Column', 'varchar(8000)') AS varchar(8000)),  
                    [Value] = CAST(stmts.stmt.value('@ParameterCompiledValue', 'varchar(8000)') AS varchar(8000))
                FROM qp.query_plan.nodes('/ShowPlanXML/BatchSequence/Batch/Statements//ParameterList/ColumnReference') AS stmts(stmt)
                WHERE stmts.stmt.value('count(.)', 'int') > 0 
            ) t1 
            GROUP BY t1.[Column], t1.[Value]
            FOR XML PATH('Parameter'), ROOT('Parameters')
        )
    ) fnParams
    
    • 0

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve