SQL 填充因子

建SQL SERVER索引的时候有一个选项,即Fillfactor(填充因子)。

这个可能很少人会去注意它,但它也是比较重要的。大家可能也都知道有这个东西,但是如何去使用它,可能会比较迷糊。另外,即使你理解了它的原理,也不一定能使用好它,这个还要具体分析索引字段的更新频率等等。

记得看书知道有这么个东西,但是都是看的迷迷糊糊的,不知道干吗的,好象设置不设置都一样的。其实,像索引这些东西,当数据达到几十万上百万的时候,它的效果就表现的很明显。

填充因子定义:索引中叶级页的数据充满度。它的作用:当系统新建或重建索引时,在每一个索引页上预先留出一部分空间。使得系统在新增索引信息时能够保持索引页不分裂。它的目的是使索引的页分裂最小并对性能微调。

看图A,通过前面说的我们知道数据是按页存的,根据定义,填充因子是指图A中的Page100(Page110,Page120,Page130)的数据的充满度。如果按默认,填充因子是为0(0和100%是一样的),即完全充满。如果设置60%,则Page100的数据只充满空间的60%,会有40%的剩余空间。

填充因子只在创建索引时执行;索引创建后,当表中进行数据的添加、删除或更新时,不会保持填充因子。即创建索引完后添加数据,比如添加”COM”,则会添加在Page100的”CON”的前面,此时Page100的剩余空间将小于40%。因为充满度只有60%,所以”Barr”和”CON”之间会有空隙,所以”COM”将直接插入他们之间,不会照成数据移动和页分裂。如果充满度是100%即整页充满数据,则会照成”CON”及它后面的数据都向后移动1位,然后在”CON”前面插入”COM”,而Page100会大约一半的行(后半部)移到新页中以便为新行腾出空间(这种重组称为页拆分。页拆分会降低性能并使表中的数据存储产生碎片.),在这些移动的过程中一方面速度明显下降,另一方面会产生碎片。添加完数据后要使填充因子继续保持60%则需要重建索引。

有人将填充因子比喻成下面这个例子:

为了给一个班的10个同学排一下顺序,我们可以给每一位同学一个编号,如:
a. 从1,2,3,4,5,6,7,9,10。这时,我们说填充因子是100.
此时,如果又来了新同学,而其排名要在中间某位置的话,我们就要改变许多个同学的号码,如新同学排第5位,就需要4号以后的同学号码都加1,再将新同学编为5号才行.
b.我们又可以给同学这样编号:1,3,5,7,9,11,13,15,17,19
也同样完成了顺序的排列.我们说这时填充因子是50%,此时如果来了新同学,又是排在第5位的话,那么我们只需将其号码编为8就行了.其它同学都不用变.

可见,填充因子大的时候,点用的号码空间小,耗费资源少,小的时候,占用资源加大,但操作方便,迅速.

填充因子大的时候,插入或修改记录后重新索引的工作会很大,磁盘IO操作增加,性能必然降低,但其占用空间小.填充因子小的时候,索引文件占用磁盘及内存空间相对要大,但是,系统本身重新索引所需IO操作减少,性能提高,只是多占用一些存储空间. 孰轻孰重要自已决定。

通常只有当不会对数据进行更改时(例如,在只读表中)才会使设置100%。另外,只有当在表中根据现有数据创建新索引,并且可以精确预见将来会对这些数据进行哪些更改时,将填充因子选项设置为另一个值才有用。所以填充因子不是很容易设置的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用 SQL 语句填充 Excel 单元格,你可以使用 VBA 中的 ADO(ActiveX Data Objects)连接到数据库,执行 SQL 查询,并将结果加载到 Excel 单元格中。以下是一个示例: ```vba Sub FillExcelCellsWithSQLData() Dim conn As Object Dim rs As Object Dim strConn As String Dim strSQL As String Dim rng As Range Dim i As Integer ' 创建连接对象 Set conn = CreateObject("ODB.Connection") ' 设置连接字符串,这里假设你要连接的数据库是一个 Access 文件,路径为 "C:\path\to\your\database.accdb" strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\path\to\your\database.accdb;" ' 打开连接 conn.Open strConn ' 构建查询语句 strSQL = "SELECT Name, Age FROM TableName WHERE Age > 30" ' 创建记录集对象 Set rs = CreateObject("ADODB.Recordset") ' 执行查询操作 rs.Open strSQL, conn ' 指定要填充数据的单元格范围,这里假设要填充到 Sheet1 的 A2:Bx 区域 Set rng = ThisWorkbook.Worksheets("Sheet1").Range("A2:B" & rs.RecordCount + 1) ' 将查询结果加载到 Excel 单元格中 i = 1 Do Until rs.EOF rng.Cells(i, 1).Value = rs.Fields("Name").Value rng.Cells(i, 2).Value = rs.Fields("Age").Value rs.MoveNext i = i + 1 Loop ' 关闭记录集和连接对象 rs.Close conn.Close ' 释放对象 Set rs = Nothing Set conn = Nothing End Sub ``` 在上面的示例中,我们使用 ADO 创建了一个连接对象 `conn`,并设置连接字符串 `strConn` 来连接到数据库。然后,我们构建了一个查询语句 `strSQL`,并使用记录集对象 `rs` 执行查询操作。接下来,我们指定要填充数据的单元格范围 `rng`,并使用循环将查询结果逐行填充到 Excel 单元格中。 请注意,你需要根据实际情况修改连接字符串中的数据库路径、查询语句和要填充数据的单元格范围。另外,你还需要在 VBA 编辑器的工具->引用中添加对 "Microsoft ActiveX Data Objects x.x Library" 的引用(x.x 表示版本号)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值