Basic家族vb6miniVBSwpsHome.cn作者成长之路轻.增值

(VBS日记.A017)~VBS对象之ADOX-ADOX.Index 对象

ADOX 是 ActiveX Data Objects Extensions for Data Definition Language and Security,它是ADO的一个扩展,专门用于数据定义语言(DDL)和安全性。ADOX 提供了一组对象,允许用户通过编程方式创建、修改或删除数据库对象,如表、视图、用户、组等。在使用ADOX时,确保已经安装了相应的数据提供者,并且具有对数据库进行操作的权限。ADOX通常用于更高级的数据库管理和安全性任务。

CreateObject(“ADOX.Index”)

ADOX.Index对象用于访问数据库的索引
可以从Indexes对象集合中提取或枚举Index对象
ADOX.Index对象有7个属性0个方法0个事件

(一)属性:
Clustered 聚集索引。类型:Boolean。缺省值False
Columns 索引的字段(只读)。类型:Columns对象
IndexNulls 索引对Null值的处理方式。类型:Long。缺省值adIndexNullsDisallow
Name 索引名。类型:String
PrimaryKey 主键索引。类型:Boolean。缺省值False
Properties 索引的属性(只读)。类型:Properties对象
Unique 唯一键索引。类型:Boolean。缺省值False

(二)说明:
数据库的表一般是字段+记录的结构,记录是逐行排列的

当记录数达到几万行、几十万行或更多时,数据查询可能会很慢
比如最后一行记录才是你要查询的

为字段创建索引可以有效加快查询速度
索引中复制了索引字段的所有字段值,并以 B+树 的结构进行顺序排列
索引是靠B+树结构来加快查询速度的,而不是靠预先顺序排列
索引中还保存了各字段值所对应的记录行的主键值,或物理地址

每次对索引字段的记录进行增删改,都会导致重建索引,所以索引会降低写入性能
推荐为查询频繁的字段建立索引,不推荐为写入频繁的字段建立索引

既查询频繁又写入频繁的字段,要根据不同的数据库系统来实际测试
测试是否建立索引,建立什么样的索引,记录数几十万行时索引的效果,几千万行时的效果……

如果索引字段是自动增量类型,或者字段值是数据库的系统时间
因为索引是排序的,所以每次写入记录后,新的索引会添加在原索引的末尾,而不是插入到中间
这样索引结构不会有重大调整,对系统性能影响不太大
表是字段+记录的结构,索引是B+树的结构,两者是分开存放的

聚集索引,就是把索引和表聚集在一起
直接把表的结构改造为B+树结构,不存在独立的索引了
由于索引是排序的,所以全部记录行都要根据索引字段重新排列,系统性能开销很大

一个表只能有一个聚集索引,在一个恰当的字段上建立聚集索引,查询时要比普通索引快很多
例如,SQL SERVER中可以把某个查询从普通索引的128秒提速到了聚集索引的2秒

Access数据库不支持聚集索引
比如表1中仅为字段1建立了索引,那么:

SELECT 字段1 FROM 表1 WHERE 字段1 > 3
这个查询,会从索引中直接获取符合条件的字段值,不会再去表1中查询

SELECT 字段1, 字段2 FROM 表1 WHERE 字段1 = 3
这个查询,会先从索引获取字段1的值,再从索引查到字段1所在的记录行,再从该行获取字段2的值

如果字段1和字段2都会被频繁查询,那么可以创建一个包含字段1和字段2的索引
这样上述2个查询就都会从索引中直接获取符合条件的字段值,不会再去表1中查询
缺点是索引占用的存储空间变大,且字段1和字段2的修改都会导致索引重建
IndexNulls 这个属性表示当索引字段的字段值为Null时的处理方式

Access数据库不支持其中的 adIndexNullsIgnore 和 adIndexNullsIgnoreAny

比如Access数据库:
CREATE TABLE 表1(字段1 VARCHAR, 字段2 VARCHAR, 字段3 VARCHAR)
INSERT INTO 表1(字段1, 字段3) VALUES(NULL, ”)
这里INSERT INTO语句添加的这条记录中,字段1和字段2是Null值,字段3不是
已在Indexs对象集合中的Index对象,所有属性均为只读

(三)示例:
‘示例:Index对象,Access数据库
Option Explicit
Dim oFSO, oConnection, oCatalog, oIndex, s

Const FILE = “D:\1\1.mdb” ‘数据库文件,要求目标文件夹已存在

‘AllowNullsEnum
Const adIndexNullsAllow = 0 ‘允许Null值加入索引
Const adIndexNullsDisallow = 1 ‘索引字段出现Null值会报错(默认值)
Const adIndexNullsIgnore = 2 ‘索引会忽略字段值Null
Const adIndexNullsIgnoreAny = 4 ‘多字段的索引,任何一个字段出现Null值都会被忽略

Call RunAs32() ‘使vbs运行在32位应用程序模式
s = “20240613” ‘数据库密码

‘连接字符串
s = “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=” & FILE & “;Jet OLEDB:Database Password=” & s

‘删除数据库文件并新建,防止已有数据库文件导致示例出错
Set oFSO = CreateObject(“Scripting.FileSystemObject”)
If oFSO.FileExists(FILE) Then oFSO.DeleteFile FILE, True
CreateObject(“ADOX.Catalog”).Create s

Set oConnection = CreateObject(“ADODB.Connection”)
oConnection.Open s

oConnection.Execute “CREATE TABLE 表1(字段1 INT, 字段2 INT, 字段3 INT, ” & _
“CONSTRAINT p1 PRIMARY KEY (字段1, 字段2), ” & _
“CONSTRAINT u1 UNIQUE (字段3))”
oConnection.Execute “CREATE TABLE 表2(字段4 INT, 字段5 INT, 字段6 INT)”

Set oCatalog = CreateObject(“ADOX.Catalog”)
Set oCatalog.ActiveConnection = oConnection

s = “”
For Each oIndex In oCatalog.Tables.Item(“表1”).Indexes
s = s & “索引名 ” & vbTab & oIndex.Name & vbLf & _
“聚集索引” & vbTab & oIndex.Clustered & vbLf & _
“Null值 ” & vbTab & AllowNullsEnum(oIndex.IndexNulls) & vbLf & _
“主键索引” & vbTab & oIndex.PrimaryKey & vbLf & _
“唯一索引” & vbTab & oIndex.Unique & vbLf & _
“索引字段” & vbTab & JoinColumns(oIndex.Columns) & vbLf & vbLf
Next
MsgBox Left(s, Len(s) – 2)

Set oIndex = CreateObject(“ADOX.Index”)
oIndex.Name = “索引1”
oIndex.Clustered = False
oIndex.Columns.Append “字段4”
oIndex.Columns.Append “字段5”
oIndex.IndexNulls = adIndexNullsDisallow
oIndex.PrimaryKey = True

oCatalog.Tables.Item(“表2”).Indexes.Append oIndex

Set oIndex = CreateObject(“ADOX.Index”)
oIndex.Name = “索引2”
oIndex.Columns.Append “字段6”
oIndex.IndexNulls = adIndexNullsAllow
oIndex.Unique = True

oCatalog.Tables.Item(“表2”).Indexes.Append oIndex

s = “”
For Each oIndex In oCatalog.Tables.Item(“表2”).Indexes
s = s & “索引名 ” & vbTab & oIndex.Name & vbLf & _
“聚集索引” & vbTab & oIndex.Clustered & vbLf & _
“Null值 ” & vbTab & AllowNullsEnum(oIndex.IndexNulls) & vbLf & _
“主键索引” & vbTab & oIndex.PrimaryKey & vbLf & _
“唯一索引” & vbTab & oIndex.Unique & vbLf & _
“索引字段” & vbTab & JoinColumns(oIndex.Columns) & vbLf & vbLf
Next
MsgBox Left(s, Len(s) – 2)

oConnection.Close()
MsgBox “ok”, vbSystemModal

Sub RunAs32()
Dim oWshShell, oFSO, s, i
Set oWshShell = CreateObject(“WScript.Shell”)
Set oFSO = CreateObject(“Scripting.FileSystemObject”)
s = oWshShell.ExpandEnvironmentStrings(“%windir%\SysWOW64\WScript.exe”)
If oFSO.FileExists(s) And LCase(WScript.FullName) <> LCase(s) Then
s = s & ” “”” & WScript.ScriptFullName & “”” “
For Each i In WScript.Arguments
If InStr(i, ” “) > 0 Then i = “””” & i & “”””
s = s & i & ” “
Next
oWshShell.Run Left(s, Len(s) – 1)
WScript.Quit()
End If
End Sub

Function AllowNullsEnum(ByVal IndexNulls)
Dim arr1, arr2, i
arr1 = Array(0, _
1, _
2, _
4)
arr2 = Array(“adIndexNullsAllow”, _
“adIndexNullsDisallow”, _
“adIndexNullsIgnore”, _
“adIndexNullsIgnoreAny”)
For i = 0 To UBound(arr1)
If IndexNulls = arr1(i) Then AllowNullsEnum = arr2(i) : Exit Function
Next
End Function

Function JoinColumns(ByVal Columns)
Dim oColumn, s
s = “”
For Each oColumn In Columns
s = s & oColumn.Name & ” “
Next
JoinColumns = Left(s, Len(s) – 1)
End Function

Views: 72

Hi, I’m vbsgirl

办公职员