Sql server ColdFusion中的SQL执行计划

Sql server ColdFusion中的SQL执行计划,sql-server,coldfusion,Sql Server,Coldfusion,我想知道ColdFusion是否可以从Microsoft SQL Server获得执行计划? 甚至是估计的执行计划。 如果能得到所有成本的查询,那就太好了。这似乎涵盖了您要找的内容 然后将其包装在中,正如@James post链接中提到的,有几种方法可用于使用简单的cfquery检索有关执行计划的信息。要记住以下几点: 选项通常应用于会话连接,这意味着如果使用连接池(这是不可取的),它们可能会持续存在于当前请求之外。确保在查询结束时始终禁用设置,即使出现错误 一些SET SHOWPLAN选项

我想知道ColdFusion是否可以从Microsoft SQL Server获得执行计划? 甚至是估计的执行计划。
如果能得到所有成本的查询,那就太好了。

这似乎涵盖了您要找的内容


然后将其包装在

中,正如@James post链接中提到的,有几种方法可用于使用简单的
cfquery
检索有关执行计划的信息。要记住以下几点:

  • 选项通常应用于会话连接,这意味着如果使用连接池(这是不可取的),它们可能会持续存在于当前请求之外。确保在查询结束时始终禁用设置,即使出现错误

  • 一些
    SET SHOWPLAN
    选项返回多个结果集
    CFQuery
    仅返回单个结果集。因此,它可能无法捕获返回的所有数据

  • 大多数系统视图和过程(,等等)需要提升权限。必须授予数据源用户使用这些对象的特殊访问权限。因此,请记住安全问题

…若要执行sys.dm_exec_query_计划,用户必须是 sysadmin固定服务器角色或具有对的查看服务器状态权限 服务器


更新: 正如@Travis在评论中提到的,
SET SHOWPLAN
选项必须单独运行。因此,您需要单独的cfquery来在主查询之前和之后切换设置
ON | OFF
。下面是一个简单的例子。注意,事务是为了确保在整个过程中使用相同的连接。这可能有点过分,但不应该伤害任何东西

<cftransaction>
    <cftry>
        <!--- note, SHOWPLAN_ALL does NOT execute the SQL --->
        <cfquery name="toggleStats" datasource="someDSN">
            SET SHOWPLAN_ALL ON
        </cfquery>
        <cfquery name="getQueryStats" datasource="someDSN">
            --- some sql query here 
        </cfquery>
        <cfcatch>
            <!--- rethrow and rollback automatically --->
            <cfrethrow>
        </cfcatch>
        <cffinally>
            <!--- always disable the setting --->
            <cfquery name="toggleStats" datasource="someDSN">
                SET SHOWPLAN_ALL OFF
            </cfquery>
        </cffinally>
    </cftry>
</cftransaction>

<cfif structKeyExists(variables, "getQueryStats")>
    <cfdump var="#getQueryStats#" label="Query Statistics">
</cfif>

将SHOWPLAN\u设置为全部打开
---这里有一些sql查询
将SHOWPLAN\u全部关闭

set showplan\u all
set showplan\u text
set showplan\u xml
这样的命令不能在存储过程中运行,也不能作为单个命令运行,因此我理解这意味着您还需要多个cfquery标记来设置它,发送查询,然后再发送另一个来设置。可以使用showplan_xml获取xml,然后使用cf对其进行解析。我的sql server连接没有连接,因此我无法测试任何东西,因此我没有足够的信心做出可能的回答。@Travis-是的,这也是我的理解。(当然,我在查询分析器之外很少使用这些命令。)您可以在主查询之前和之后运行单独的查询来切换设置
on\off
。我可能会将这三个都打包到一个事务中,以确保它保持相同的dsn连接。后者可能有点过火,但不会造成任何伤害。这也可能是假设你的SQL Server在你的Web服务器上,但情况可能并非如此,所以不管怎样,它都是不成功的,不管怎样,它都是不成功的,我不确定我是否同意。哪一部分?@Travis-不,结果只是一个字符串,“对于应用程序,以nvarchar(max)的形式返回输出…其中XML输出随后被其他工具使用。”。显示结果时,SSMS可能会合并一些临时文件。但从cfquery来看,它只是
getQueryStats[“MICROSOFT SQL SERVER 2005 XML SHOWPLAN”][rowNumber]
。我第一次看到这个问题时就阅读了这个链接,没有看到任何可能进入cfquery标记的内容。我遗漏了什么吗?@James-上面的代码经过测试了吗?IIRC
GO
不能在jdbc中使用。它是仅由MS SQL工具(查询分析器等)识别的非标准关键字。另外,请参阅我的回复,了解有关持续性
showplan
设置的重要说明best@James莫勒-哈?你的评论是针对丹还是针对我?我想说的是,Leigh的回答比我更能回答最初的问题。