文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

运用SQL SERVER 2005 CLR解决XML 的实例分析

2023-06-17 21:09

关注

运用SQL SERVER 2005 CLR解决XML 的实例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

大家都知道SQL SERVER 2005 CLR(公共语言运行库),而在编程中SQL Server 开发人员和数据库管理员 (DBA) 有时会遇到这种情况,即用户在工作高峰期向服务器提交长时间运行的查询,因而降低了服务器的响应速度。在这里给大家将介绍两种方法可以防止这一情况的发生:
1.DBA 可使用 sp_configure 将 query governor cost limit 选项设置为特定阈值。(这是一个高级选项。)该阈值在整个服务器内是有效的。
2.要影响连接的阈值,DBA 可以使用 SET QUERY_GOVERNOR_COST_LIMIT 语句。

可以想像一下需要更细粒度控制的情况。例如,用户可能有三个等效但语法结构不同的查询,并希望以执行速度尽可能最快的形式自动提交该查询。此外,用户还可能希望不执行任何估计执行成本超过特定阈值的查询。以编程方式访问查询成本,将允许用户通过控制基于估计执行成本的查询提交过程来构建服务器友好的应用程序。本文中描述的技术允许使用 SQLCLR 用户定义的过程、XPath、XQuery 以及 Visual C# 技术,以编程方式访问查询的估计执行成本。如本文所述,通过用户定义的过程使用 SQLCLR 来访问 SQL Server 2005 的基本技术也可用于其他应用程序。

在 SQL Server 2005 中,可以使用 .NET Framework 中可用的任何编程语言(例如 Microsoft Visual Basic .NET 或 Visual C#)来定义用户定义的类型、函数、过程以及聚合。从概念上讲,在定义了用户定义的实体后,就可以在 SQL Server 中使用该实体,就像是由 SQL Server 本身提供的实体一样。例如,定义用户定义的 T 类型之后,还可以定义带有一列 T 类型的关系型表。定义了用户定义的 P 过程后,就可以使用 EXEC P 调用该过程,就像 Transact-SQL 过程一样。

使用 SQL SERVER 2005 CLR 存储过程和进程内数据访问提取查询成本

实现该解决方案
1. .NET Framework 语言(本文中使用 Visual C#)定义存储过程,该过程将从给定查询的 XML Showplan 中获得查询成本。
2.正在运行 SQL Server 的服务器注册此过程。此操作需要两个子步骤:
1) SQL Server 中注册该程序集。
2)建一个引用外部 CLR 方法的存储过程。

运用SQL SERVER 2005 CLR解决XML 的实例分析

显示用于创建用户定义的 CLR 存储过程的示意图。

以下步骤循序渐进地介绍该解决方案的过程。

A 包含一个 Visual C# 程序 (ShowplanXPath.cs),该程序从运行 SQL Server 的服务器中提取 XML 格式的 Showplan,然后在获得的 Showplan 上执行 XPath 表达式,以提取估计查询执行成本。第一步包括,使用 Visual C# 编译器编译该程序并生成一个 DLL (ShowplanXPath.dll)。可使用以下命令行来进行编译。该命令生成一个名为 ShowplanXPath.dll 的 DLL:

<path-to-.NET-framework>\csc.exe   /out:ShowplanXPath.dll  /target:library   /reference:<path-to-.NET-framework>\System.dll  /reference:<path-to-.NET-framework>\System.Data.dll  /reference:<path-to-SQL-Server-installation>\sqlaccess.dll  ShowplanXPath.cs

其中,应该将替换为指向 Microsoft .NET Framework 位置的正确路径,例如

C:\WINNT\Microsoft.NET\Framework\v2.0.40607

或将其添加到系统环境变量 PATH 中。请注意,您需要根据计算机上安装的 .NET Framework 的版本来修改“v2.0.40607”。将替换为指向 SQL Server 2005 安装的二进制文件的正确路径,例如

"C:\Program Files\MicrosoftSQL Server\MSSQL.1\MSSQL\Binn\"

如果该路径包含空格,那么就像本示例那样将该路径用引号括起来。

下一步,使用客户端(例如 SQL Server 2005 Management Studio)发布的以下 Transact-SQL 命令来让 SQL Server 2005 知道该程序集 (ShowplanXPath.dll):

use AdventureWorks   go   CREATE ASSEMBLY ShowplanXPath   FROM '<path-to-compiled-DLL>\ShowplanXPath.dll'   go

替换为指向第一步所编译 DLL 的位置的路径。

注册的程序集 (ShowplanXPath.dll) 中创建引用外部 CLR 方法的用户定义的存储过程。

CREATE PROCEDURE dbo.GetXMLShowplanCost   (   @tsqlStmt   NVARCHAR(MAX),   @queryCost   NVARCHAR(MAX) OUT   )   AS EXTERNAL NAME ShowplanXPath.xmlshowplanaccess.GetXMLShowplan   go

请注意,此外部名称的逻辑格式为:assembly_name.class_name.method_name。@tsqlStmt 参数将包含一个查询,而且将使用 OUT 参数 @queryCost 返回查询成本。

端使用以下代码调用 CLR 用户定义的存储过程:

DECLARE @query nvarchar(max)-- the query   DECLARE @cost nvarchar(max)-- its estimated execution cost   -- set this to your query   set @query = N'select * from person.address'   -- execute the procedure   EXECdbo.GetXMLShowplanCost @query, @cost OUTPUT   select @cost-- print the cost   -- note that @cost is nvarchar, we use explicit comparison in case of an error    -- and implicit conversion for actual cost   if (@cost != '-1') and (@cost <= 0.5)-- if query is cheap to execute,   EXEC(@query)-- execute it; else don't execute   -- replace 0.5 with your own threshold   go

请注意,可以通过 @query 变量提交一组查询(一个批处理),然后返回该批处理的总成本。如果查询或批处理中有错误,则返回“-1”作为其成本。可以修改附录 A 中的异常处理代码,以便在出现错误时能更好地满足您的需要。

输出参数 @cost 将该查询的估计执行成本返回到客户端。如步骤 4 中的代码示例所示。

端可根据 @cost 的值,选择是否将该查询提交到 SQL Server 来加以执行,如步骤 4 中的代码所示。

运用SQL SERVER 2005 CLR解决XML 的实例分析


显示执行存储过程的主要步骤

一旦调用该过程,它就会接收到一个成本有待估计的查询。
2.CLR 存储过程将 SHOWPLAN_XML 模式设置为 ON。不执行提交到该连接的任何语句;然而,将为这些语句生成 showplan。将该查询本身发送到 SQL Server。
3.该服务器以 XML 格式逐段返回此 showplan,然后 Visual C# 程序将这些片段整理在一起。
4.该过程将 SHOWPLAN_XML 模式设置为 OFF。
5. CLR 存储过程准备并以 XML 格式在 showplan 上执行一个 XPath 表达式,以提取查询成本。该批处理中每条语句中的每个查询计划的成本均被提取并总计。
6.估计查询执行成本返回到调用程序中。如果 SQL 代码中出现错误,则返回“-1”作为成本。

注 DLL 与 SQL Server 之间的通信称为进程内数据访问,这是因为已将该 DLL 链接到 SQL Server 进程。由于已将 DLL 动态链接到该 SQL Server 进程,因此交换数据并不跨越 SQL Server 进程边界。当执行进程内数据访问时,只能将 XPath 查询发送到 SQL Server;XQuery 查询不能使用进程内数据访问。使用就是 SQL SERVER 2005 CLR 存储过程和进程内数据访问提取查询成本的一个案例。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网行业资讯频道,感谢您对编程网的支持。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯