返回顶部
首页 > 资讯 > 精选 >CLR集成性能设计选择的示例分析
  • 101
分享到

CLR集成性能设计选择的示例分析

2023-06-17 21:06:20 101人浏览 独家记忆
摘要

这篇文章将为大家详细讲解有关CLR集成性能设计选择的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.编译过程 在编译 sql 表达式时,如果遇到对托管例程的引用,则生成 Microsoft 中间

这篇文章将为大家详细讲解有关CLR集成性能设计选择的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

1.编译过程

在编译 sql 表达式时,如果遇到对托管例程的引用,则生成 Microsoft 中间语言 (MSIL) 存根。该存根包含的代码用于将例程参数从 SQL Server 封送到 CLR、调用函数并返回结果。该“粘附”代码基于参数类型和参数方向(向内、向外或引用)。粘附代码支持特定于类型的优化,并确保有效地强制实现 SQL Server 语义,例如为 Null 性、约束方面、按值和标准异常处理。通过为确切类型的参数生成代码,可以避免跨调用边界的类型强制或包装对象创建开销(称为“装箱”)。随后,使用 CLR 的 JIT(实时)编译服务将生成的存根编译为本机代码,并针对 SQL Server 执行所在的特定硬件体系结构进行优化。JIT 服务是在方法级别调用的,并允许 SQL Server 宿主环境创建一个跨 SQL Server 和 CLR 执行的编译单元。编译存根之后,生成的函数指针即成为函数的运行时实现。此代码生成方法确保不会发生与运行时反射或元数据访问相关的其他调用开销。

在 SQL Server 和 CLR 之间快速转换
编译过程生成的函数指针可以在运行时通过本机代码调用。对于标量值用户定义函数,可基于每行调用此函数。为***程度地降低在 SQL Server 和 CLR 之间转换的成本,包含任何托管调用的语句都具有一个标识目标应用程序域的启动步骤。该标识步骤减少每行的转换成本。

2.性能注意事项
 
以下内容概述了 SQL Server 中特定于CLR集成性能的注意事项。有关更多详细信息,请参阅 MSDN 网站上的“Using CLR Integration in SQL Server 2005”(在 SQL Server 2005 中使用 CLR 集成)。有关托管代码性能的常规信息,请参阅 MSDN 网站上的“Improving .net Application PerfORMance and Scalability”(提高 .NET 应用程序的性能和可扩展性)。

3.用户定义函数

相较于 Transact-SQL 用户定义函数,CLR 函数可以从更快的调用路径中受益。此外,同 Transact-SQL 相比,托管代码在过程代码、计算和字符串操作方面具有决定性性能优势。需要大量计算和不执行数据访问的 CLR 函数采用托管代码编写时效果更好。但是与CLR集成性能相比,Transact-SQL 函数的确可以更有效地执行数据访问。

4.用户定义聚合

托管代码的性能大大优于基于游标的聚合。托管代码的执行速度通常稍慢于内置 SQL Server 聚合函数的执行速度。如果存在本机内置聚合函数,建议您使用该函数。对于所需聚合不受本机支持的情况,出于性能原因,请考虑使用 CLR 用户定义聚合,而不是基于游标的实现。

5.流式表值函数

应用程序通常需要返回一个表作为调用函数的结果。示例包括从文件读取表格格式数据作为导入操作的一部分,并将逗号分隔值转换为关系表示形式。通常,您可以通过在调用方使用结果表之前具体化和填充此结果表来实现此目的。CLR 与 SQL Server 的集成引入了一种名为流式表值函数 (STVF) 的新扩展性机制。托管 STVF 的性能优于可比扩展存储过程实现的性能。STVF 是返回 IEnumerable 接口的托管函数。IEnumerable 具有导航 STVF 返回的结果集的方法。当调用 STVF 时,返回的 IEnumerable 直接连接到查询计划。查询计划在需要提取行时调用 IEnumerable 方法。使用此迭代模型,结果在***行生成之后即可使用,而不需要等到整个表填充完。还可以极大地减少调用该函数而占用的内存。

6.数组与游标

当 Transact-SQL 游标必须遍历更容易表示为数组的数据时,使用托管代码可以显著提高性能。

7.字符串数据

SQL Server 字符数据(如 varchar)在托管函数中可以是 SqlString 或 SqlChars 类型。SqlString 变量将整个值的实例创建到内存中。SqlChars 变量提供可用于获得更好性能和可扩展性的流式接口,而无需将整个值的实例创建到内存中。这对于大型对象 (LOB) 数据尤为重要。此外,还可以通过 SqlXml.CreateReader() 返回的流式接口访问服务器 XML 数据。

8.CLR 与扩展存储过程

允许托管过程向客户端回发结果集的 Microsoft.SqlServer.Server 应用程序编程接口 (api) 的性能优于扩展存储过程使用的开放式数据服务 (ODS) API。此外,System.Data.SqlServer API 支持 xml、varchar(max)、nvarchar(max) 和 varbinary(max) 等 SQL Server 2005 中引入的数据类型,但是尚未将 ODS API 扩展为支持新的数据类型。

通过托管代码,SQL Server 管理对内存、线程和同步等资源的使用。这是因为公开这些资源的托管 API 是针对 SQL Server 资源管理器实现的。相反,SQL Server 无法查看或控制扩展存储过程的资源使用情况。例如,如果扩展存储过程占用过多 CPU 或内存资源,则无法通过 SQL Server 检测或控制此种情况。但是,SQL Server 可以使用托管代码检测到给定线程已有很长一段时间未生成结果,并强制该任务生成以便安排其他工作。因此,使用托管代码可以提高可扩展性,并改善系统资源使用情况。托管代码可能带来维护执行环境和执行安全检查所需的额外开销。例如,当在 SQL Server 内运行并需要执行从托管代码到本机代码的大量转换时,可能会发生此种情况(因为在托管代码和本机代码之间来回转换时,SQL Server 需要对特定于线程的设置进行额外维护)。因此,对于在托管代码和本机代码之间进行频繁转换的情况,扩展存储过程的性能大大优于在 SQL Server 内运行的托管代码的性能。

注意:
建议您不要开发新的扩展存储过程,因为已不推荐使用此功能。

9.用户定义类型的本机序列化

用户定义类型 (UDT) 是作为标量类型系统的扩展性机制设计的。SQL Server 实现称为 Format.Native 的 UDT 序列化格式。在编译期间,检查该类型的结构以便生成针对该特定类型定义自定义的 MSIL。本机序列化是针对 SQL Server 的默认实现。用户定义序列化调用由类型作者定义的方法以执行序列化。应尽可能使用 Format.Native 序列化以便获取***性能。

10.可比 UDT 的规范化

关系操作(例如对 UDT 进行排序和比较)是针对值的二进制表示形式直接执行的。通过在磁盘上存储 UDT 状态的规范化(二进制排序)表示形式可以实现此目的。规范化具有两个优点:避免构造类型实例和方法调用开销,进而极大地降低了比较操作的成本;为 UDT 创建二进制域,支持构造直方图、索引以及该类型的值的直方图。因此,规范化 UDT 的性能配置文件类似于未涉及方法调用的操作的本机内置类型性能配置文件。

11.可扩展内存使用量

为了在 SQL Server 中很好地执行和调整托管垃圾回收,请避免使用大型单一分配。大小大于 88 千字节 (KB) 的分配将被放置到大对象堆,这将导致垃圾回收的性能和调整结果远不如多个较小分配的性能和调整结果。例如,如果需要分配一个大型多维数组,***分配一个交错(分散)数组。

关于“CLR集成性能设计选择的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: CLR集成性能设计选择的示例分析

本文链接: https://lsjlt.com/news/293025.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • CLR集成性能设计选择的示例分析
    这篇文章将为大家详细讲解有关CLR集成性能设计选择的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.编译过程 在编译 SQL 表达式时,如果遇到对托管例程的引用,则生成 Microsoft 中间...
    99+
    2023-06-17
  • CLR程序集的示例分析
    小编给大家分享一下CLR程序集的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、CLR程序集教程之体系结构程序集是一个抽象的概念,程序集是一个或多个托管...
    99+
    2023-06-17
  • 为JAVA性能而设计的示例分析
    这篇文章主要介绍为JAVA性能而设计的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!  第一部分: 接口事宜  概要  许多通常的 Java 性能问题都起源于在设计过程早期中的类设计的思想, 早在许多开发者开...
    99+
    2023-06-03
  • CSS属性选择器的示例分析
    这篇文章主要介绍CSS属性选择器的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具有特定属性的HTML元素样式具有特定属性的HTML元素样式不仅仅是class和id。注意:I...
    99+
    2024-04-02
  • jQuery选择器之属性过滤选择器的示例分析
    小编给大家分享一下jQuery选择器之属性过滤选择器的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体内容如下<...
    99+
    2024-04-02
  • Css3属性选择器和伪类选择器的示例分析
    这篇文章主要介绍了Css3属性选择器和伪类选择器的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。属性选择器: [attr~...
    99+
    2024-04-02
  • SpringBoot集成redis的示例分析
    这篇文章给大家分享的是有关SpringBoot集成redis的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。如何使用springBoot集成redis 定义REmote ...
    99+
    2024-04-02
  • Spring集成MyBatis的示例分析
    这篇文章主要为大家展示了“Spring集成MyBatis的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Spring集成MyBatis的示例分析”这篇文...
    99+
    2024-04-02
  • css选择器的示例分析
    这篇文章主要介绍了css选择器的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。语法结构Id选择器格式#id :#+元素的i...
    99+
    2024-04-02
  • css中属性和值选择器的示例分析
    这篇文章将为大家详细讲解有关css中属性和值选择器的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 属性和值选择器 下面的例子为 title="W3...
    99+
    2024-04-02
  • jQuery设计的示例分析
    这篇文章主要介绍了jQuery设计的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。选择元素jQuery的基本设计思想和主要用法,就是...
    99+
    2024-04-02
  • Web性能测试实例设计分析
    本篇内容介绍了“Web性能测试实例设计分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先,为什么要进行性能测试?性能不佳的应用通常无法实...
    99+
    2023-06-05
  • struts2与Ajax集成的示例分析
    这篇文章主要介绍struts2与Ajax集成的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在当今——Web 2.0概念铺天盖地的Internet环境下,简易的AJAX集成对于一个成功的WEB框架来说是不可或...
    99+
    2023-06-17
  • spring boot集成shiro的示例分析
    小编给大家分享一下spring boot集成shiro的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!spring boot提供了一个自带的认证框架,同时...
    99+
    2023-05-30
  • springboot 1.5.2 集成kafka的示例分析
    这篇文章主要介绍springboot 1.5.2 集成kafka的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体如下:随着spring boot 1.5版本的发布,在spring项目中与kafka集成更为...
    99+
    2023-05-30
    springboot kafka
  • spring boot集成rabbitmq的示例分析
    这篇文章主要为大家展示了“spring boot集成rabbitmq的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“spring boot集成rabbitmq的示例分析”这篇文章吧。一、...
    99+
    2023-05-30
    springboot rabbitmq
  • OpenStack和TF集成的示例分析
    小编给大家分享一下OpenStack和TF集成的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!OpenStack和TF集成OpenStack是虚拟机和容器...
    99+
    2023-06-03
  • C4C和Outlook的集成示例分析
    这篇文章将为大家详细讲解有关C4C和Outlook的集成示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。从C4C系统下载Outlook的Addin, 安装之后,会在Outlook里看见一个新的面板:...
    99+
    2023-06-04
  • JavaScript中选择器的示例分析
    这篇文章给大家分享的是有关JavaScript中选择器的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。undefined在html5之前只有下面四种选择器.getElem...
    99+
    2024-04-02
  • Hibernate性能的示例分析
    这篇文章将为大家详细讲解有关Hibernate性能的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Hibernate在解决性能问题方面做得非常好。有了它的缓存机制,使用第三方缓存和数据库连接池,就...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作