展望微软下一代数据库系统
次高层次: 外部接触(EXTERNAL_ACCESS)。它允许接触外部的系统资源
最低层次: 不安全接触(UNSAFE)。只要不对系统的稳定性造成影响,就不加限制。
在T-SQL和管理程序(Managed code)之间的取舍
管理程序非常适于进行数字密集型的计算和复杂的逻辑处理。.NET对于字符串 (String),规则表达式(regular expressions),错误捕捉等等有着更好的支持。另外.NET提供的上千个类(Class) 和方法可以在自定义函数(user-defined functions),存储过程(stored procedures)和触发(triggers)中很方便的使用。所以对于有大量字符创操作,数学计算,日期运算,系统资源存取,高级加密运算,文件操作,图像处理或是XML的情形,管理的存储过程,函数,触发,集合要比传统意义上的T-SQL等强大和简洁。
使用管理的程序的另外一个好处就是类型安全。在管理的程序执行之前,CLR要对其进行检查以保证它的安全运行。比如说,对于一个内存读写的操作,CLR要先进行检查以保证在读取的时候没有写操作在进行。
在准备编写存储过程,触发,或是UDFs之前,你要权衡各种情况,在传统的T-SQL和管理程序(Managed code)之间做出选择。选择的标准是你当前问题的具体特点。如果你的主要操作是数据存取以及相对简单的逻辑运算,那么T-SQL则非常合适。对于有大量数值计算以及复杂逻辑运算的情况,管理程序(Managed code)则更适用。
程序放置在什么地方也是很关键的一步。T-SQL和管理程序(Managed code)都是在数据库的引擎内运行。把.NET和数据库紧密放置在一起可以有效的发挥服务器的硬件运算能力。当然最好是用SQL数据库的Profile程序来测量一下你的具体程序的运行性能,然后再做出决定。Yukon的Profile程序有了进一步的增强。可以更深层次的测量SQL数据库内的CLR的性能,并且会以更直观的图形方式来输出对比测试结果。下面就让我们来具体看看Yukon中新增的一些功能。
用户定义的类,函数和集合(User-defined Types, Functions, and Aggregates)
Yukno支持扩展的CLR的类系统。这些扩展的类可以在服务器端定义表(table),也可以在客户端进行数据操作。用户自定义类型(UTDs)允许用户扩展已有的类。这些扩展的具体实现是用的管理程序(managed code)。比如说,你可以定义一些用于地理空间的类型,一些特殊的金融类型或是特别的时间日期类型以适应你独特的要求。
用.NET的术语来说,UTDs是结构(struct)或是参考类型(reference type),而不是类(class)或枚举(enum)。这意味着内存的是用是由CLR控制优化的。不过,UTDs不支持继承和多态性(inheritance and polymorphism)。它可以有公用或是私有函数(public and private functions)。事实上,诸如限制检查(constraint checking)应该由私有函数来完成。举例来说吧,如果你想定义一个地理空间的类型,这可能包含经度,纬度也许还有高度信息,你可以定义相应的私有成员来完成这一任务。这类型创建完成后,你可以把他注册到SQL数据库中。这个被编译的DLL就会被存放在SQL数据库中。
用户自定义函数(UDFs)有两种类型:一种是标量值型的(scalar-valued),这种函数返回单一的值,如字符串,整数,比特等等。另外一种是表格值型的(Table-valued)。这种函数返回有一个或多个列组成的数据集合。
Yukon允许用户定义新的集合(aggregate)操作的能力远远超过了以前的版本。用户用管理语言开发的集合可以被T-SQL或是其他的管理语言调用。这些新开发的集合是.NET的类,它可以引用数据库中存在的其他编译好的类库(Class Library)。你可以使用用户定义的集合将数据库中的数据转化为数值型变量。比如你最近的一次用户调查的数据存放到数据库中,通过一个用户定义的统计函数你可以得到加权平均或是标准偏差。
管理的存储过程
这是一种管理程序,其工作方式就像传统的存储过程一样。如果你希望返回一个简单的数据集和(resultset)或是只是进行一个数据操作(使用DML或是DDL)。一旦被注册到数据库中,那么使用它就像是用一个普通的存储过程那样。将一段管理程序包装成存储过程的语法如下(基于现在早期的Yukon版本)
《展望微软下一代数据库系统(第2页)》