【问题标题】:Get the query plan using jdbc PreparedStatement on sql server在sql server上使用jdbc PreparedStatement获取查询计划
【发布时间】:2016-07-04 15:11:17
【问题描述】:

使用 Statment,resultSet.getObject 以 xml 形式返回查询计划

 Connection conn = getConnection();
        String query = " SET SHOWPLAN_XML on ";
        Statement st = conn.createStatement();
        boolean execute=st.execute(query);
        log.info("execute status {} " , execute);
         query = " SELECT ATMPROFILES.TERMID as COLUMNID, ATMPROFILES.TERMID as COLUMNNAME FROM ATMPROFILES (NOLOCK) "
                + " WHERE Authprocessname = 'ATMST' "
                + "ORDER BY ATMPROFILES.TERMID ";
        ResultSet rs = st.executeQuery(query);
        while(rs.next())
        {
            Object object = rs.getObject(1);
            log.info("Query Plan {}  ", object);
        }

但是如果我通过 PreparedStatement 执行相同的操作,它会返回实际结果而不是 QueryPlan

 Connection conn = getConnection();
        String query = " SET SHOWPLAN_XML on ";
        PreparedStatement ps = conn.prepareStatement(query);
        boolean execute = ps.execute();
        log.info("execute status {} " , execute);

         query = " SELECT ATMPROFILES.TERMID as COLUMNID, ATMPROFILES.TERMID as COLUMNNAME FROM ATMPROFILES (NOLOCK) "
                + " WHERE Authprocessname = 'ATMST' "
                + "ORDER BY ATMPROFILES.TERMID ";
        ps=conn.prepareStatement(query);
        execute=ps.execute();
        log.info("execute status {} " , execute);
        ResultSet rs = ps.getResultSet();
        while(rs.next())
        {
            Object object = rs.getObject(1);
             // here it returns selected object
            log.info("Query Plan {}  ", object); 

        }

通过 PreparedStatement 实现这一点的任何想法。

【问题讨论】:

    标签: java sql-server jdbc prepared-statement


    【解决方案1】:

    我没有找到任何参考资料,为什么将SET SHOWPLAN_XML ON 作为准备好的语句执行是行不通的;但是,当您直接运行此语句并将实际查询作为准备好的语句时,您应该会获得所需的结果。在代码中:

    Connection conn = getConnection();
    String showplanQuery = "SET SHOWPLAN_XML ON";
    Statement st = conn.createStatement();
    st.execute(showplanQuery);
    
    String actualQuery = "SELECT ATMPROFILES.TERMID FROM ATMPROFILES (NOLOCK) ";
    PreparedStatement ps=conn.prepareStatement(actualQuery);
    ps.execute();
    ResultSet rs = ps.getResultSet();
    while(rs.next())
    {
        Object object = rs.getObject(1);
        // should log the query plan
        log.info("Query Plan {}  ", object); 
    }
    

    希望对您有所帮助。

    【讨论】:

    • 我试过这个eariler,没用。 ps.getResultSet();的结果集为 Null
    • @vels4j:您使用的是哪个 SQL Server 版本和 JDBC 驱动程序?我在家里尝试使用 SQL Server 2012、jTDS 1.3.1 和与您不同的表;但是,我没想到这些差异很重要。那么,在我的示例中,ps.getResultSet() 不是 null
    • 通过maven使用sqljdbc4-4.0.2206.100.jar
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 2011-11-13
    • 2020-04-30
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多