DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 956|回复: 0
打印 上一主题 下一主题

[待整理] SQL Server 2008中使用稀疏列和列集的方法

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-13 13:46:39 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
尽管存储的成本已经很低了,但是我们仍然需要考虑使用多种技术(例如压缩和存档)来节省空间。当你思考怎样节省空间时,你第一个想到的是文件系统,但是空间节省也可以用在数据库。当我们创建一个数据库时,我们确保数据文件具有合适的大小和增长速度。我们定期分析我们的数据库规模并执行缩小操作。我们可能执行这些任务用于不同的目的,但是有一个方面是相同的,这些任务帮助我们确保我们的数据库具有最佳的存储。Microsoft SQL Server为我们提供了用于降低数据库所用空间的各种技术。SQL Server 2008推出了一个用于定位可为空字段的技术,它为可为空字段提供了最佳的存储。在SQL Server 2008中的这个新特性就是稀疏列。这篇文章不会讲述很多关于稀疏列的特性,它介绍了具有列集的稀疏列的使用,以及在使用它们时你需要了解和考虑的事情。

        这篇文章描述:

◆什么是稀疏列?

◆什么是列集?

◆在一个列集中插入和更新数据。

◆使用触发器跟踪变更。

◆对列集实施安全。

什么是稀疏列?

        稀疏列是一个普通字段,就像其它字段一样,但是它降低了对空值的存储要求。一个可为空字段可以在表创建或修改时添加SPARSE关键字来成为稀疏列。如果一个列是稀疏列,那么SQL Server不会为空值分配空间。注意,在使用这个特性时它会增加对非空值数据提取的花费。因此你需要计算可以节省的空间来仔细地对字段应用这个特性。推荐只在空间至少可以节省20%至40%时使字段成为稀疏列。BLO提供了一个包含字段中每个数据类型所需空值百分比的表,以便使这些字段成为稀疏列。

什么是列集?

        列集是一个显示所有稀疏列的字段,它作为一个XML类型的字段添加到表中。它不是物理上存在于这个表中的,它只像是一个计算出来的字段,但是它允许你对它进行修改。推荐你只在有很多稀疏列时使用列集,因为如果使用了列集而不是使用各个稀疏列,那么它会加快修改和提取。

        下面的代码显示了为一个表创建一个列集的方法。

        代码1:创建一个具有稀疏列和一个列集的表。


        我为所有可为空字段添加了SPARSE关键字,但是如同我前面提到的,应该在使它们成为稀疏列之前分析空值所占百分比。注意,当你创建这个表时你需要添加这个字段。SQL Server 不允许你没有稀疏列的情况下拥有列集字段。之后添加为稀疏列的字段可以使用添加的列集,看下面的代码:

        代码2:创建具有一个列集的表,不使任何字段成为稀疏列。


      


在一个列集中插入和更新数据

        可以对稀疏列插入记录而不使用列集,但是一旦插入了,那么记录就可以使用列集来获得。

       代码1:对列集插入一个记录而不插入任何值。


         可以使用这个列集来插入和更新记录。代码2显示了通过列集来插入一个记录和更新一个记录的方法。

         代码2:插入和更新这个列集。



       这是一个小技巧。一般我们使用UPDATE()函数来查看一个特定列是否更新了。如果你在一个与具有稀疏列和列集的表所关联的触发器中执行了它,那么UPDATE()函数返回的值不会是你所预期的。下面的代码测试了这一点。

       代码1:对Customers表创建一个UPDATE触发器。


        当你显式更新列集时,UPDATE()函数对这个列集返回true。不只这样,写给所有稀疏列的UPDATE()函数都返回true。当一个稀疏列被显式更新时,UPDATE()函数对稀疏列和列集返回true。

        代码2:在触发器中更新这个表,并测试UPDATE()函数。


        如果你为INSERT 语句写了相同的触发器,那么你将看到INSERT操作出现相同的行为。当对一个稀疏列插入一个值并且你使得其它为NULL时,UPDATE()函数对稀疏列和列集返回true。当对列集插入值时,UPDATE()函数对列集和所有稀疏列返回true。





对列集实施安全


        对列集实施安全就像对其它字段实施安全一样,但是稀疏列的权限可能会影响从列集获取数据。让我们做些测试。

首先,让我们授予对所有稀疏列的SELECT权限,并试图从列集获取数据。你需要有一个用于这个测试的单独账户。如果你没有额外的账户,那么创建一个登录和一个用户为User1。让我们使用User1权限来试着获取数据。

         代码1:使用User1的帐户获取和更新数据。


          代码2:将稀疏列的SELECT权限授予User1并执行代码1。

         尽管我们授予了对所有稀疏列的SELECT权限,但是用户却不能从列集获取数据。它要求显式的SELECT权限。但是如果我们授予稀疏列上的SELECT和UPDATE权限,User1就将可以访问这个列集。但是User1不能更新这个列集。

        代码3:授予稀疏列上的SELECT和UPDATE权限给User1并执行代码1。


       现在让我们授予对列集的SELECT权限,并尝试访问稀疏列。
       代码4 :授予列集上的SELECT权限给User1并执行代码1。

         就像代码3中的代码一样,如果我们授予对列集的SELECT和UPDATE权限给User1,那么SELECT语句2将会成功。此外,User1将可以对列集执行UPDATE语句,但不能对稀疏列执行UPDATE语句。看下面的代码5。

        代码5:授予对列集的SELECT和UPDATE权限给User1并执行代码1。


        现在让我们测试DENY权限是怎样传播的。让我们授予对稀疏列的SELECT权限并拒绝对列集SELECT的权限。正如你所预料的,User1将可以访问所有的稀疏列,但不能访问列集。拒绝对列集SELECT的权限不会影响稀疏列。

         代码6:授予对稀疏列SELECT的权限并拒绝列集的SELECT权限给User1并执行代码1。



        但是当对稀疏列SELECT的权限被拒绝时,它会传播到列集。看代码7。User1将不能访问到列集,即使我们授予了列集上的SELECT权限。

        代码7:拒绝对稀疏列SELECT的权限并授予对列集SELECT的权限给User1并执行代码1。



使用触发器跟踪变更
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2025-1-11 22:41 , 耗时 0.091478 秒, 21 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表