当前位置:文档之家› 数据库存储及效率

数据库存储及效率

4、在查询经常用到的所有列上创建非聚集索引。 这可以最大程度地利用隐蔽查询。
q江xz南vb大@1学63.2c0o1m2
返回本节首页
5、物理创建索引所需的时间在很大程度上取 决于磁盘子系统。需要考虑的重要因素包括 :(1)用于存储数据库和事务日志文件的 RAID(独立磁盘冗余阵列)等级;(2)磁盘阵 列中的磁盘数(如果使用了RAID);(3)每个 数据行的大小和每页的行数。这将决定为创 建索引须从磁盘读取的数据页的数目;(4) 索引中的列数和使用的数据类型。这将决定 必须写入磁盘的索引页的数目。
索引可以简单理解为是键值与键值关联行的 存取地址的一张表,而键值是根据指定的排序次 序排列的。数据库使用索引的方式与使用书的目 录很相似:通过搜索索引找到特定的键值,然后 根据键值对应的地址找到关联行。
q江xz南vb大@1学63.2c0o1m2
返回本节首页
q江xz南vb大@1学63.2c0o1m2
declare @dt1 datetime declare @i int declare @s char(40) declare @hm1 int declare @hm2 int select @dt1=getdate()
q江xz南vb大@1学63.2c0o1m2
返回本节首页
select @hm1=DATEPART(hh, @dt1)*3600000+DATEPART(mi, @dt1)*60000+DATEPART(ss, @dt1)*1000+DATEPART(ms, @dt1)
6、检查列的唯一性。
7、在索引列中检查数据分布。通常情况下,
为包含很少唯一值的列创建索引或在这样的
列上执行联接将导致长时间运行的查询。
q江xz南vb大@1学63.2c0o1m2
返回本节首页
实验示例
q江xz南vb大@1学63.2c0o1m2
返回本节首页
1、创建表itbl,并插入4万条记录。
请在SQL Server集成管理器查询子窗口中,选择某用 户数据库,执行如下命令,生成80000条记录,见图8-1。
返回本节首页
关于创建索引的建议如下:
1、将更新尽可能多的行的查询写入单个语句内, 而不要使用多个查询更新相同的行。仅使用一个 语句,就可以利用优化的索引维护。
2、使用索引优化向导分析查询并获得索引建议。
3、对聚集索引使用整型键。另外,在唯一列、非 空列或 IDENTITY 列上创建聚集索引可以获得性 能收益。
Select @i=@i+1
End
q江xz南vb大@1学63.2c0o1m2
返回本节首页
q江xz南vb大@1学63.2c0o1m2
图8-1 在表itbl中生成80000条记录
2、下面是测试命令执行的代码。运行时把“待测试命令” 替换成你的测试命令,在查询分析器中执行后,能返回命令 执行的大致时间(单位为:毫秒)。
实验8 数据库存储及效率
q江xz南vb大@1学63.2c0o1m2
本章目录
背景知识 实验示例 实验内容与要求(选做)
q江xz南vb大@1学63.2c0o1m2
返回本章首页
ቤተ መጻሕፍቲ ባይዱ
背景知识
q江xz南vb大@1学63.2c0o1m2
返回本节首页
q江xz南vb大@1学63.2c0o1m2
返回本节首页
可以利用索引快速访问数据库表中的特定信 息。索引是对数据库表中一个或多个列(例如, employee表的姓氏(lname)列)的值进行排序的结 构。如果想按特定职员的姓来查找他或她,则与 在表中搜索所有的行(因未建索引)相比,索引有 助于更快地获取信息。
Select * from itbl order by id 把以上命令放在测试代码段中,运行后得到运行时间2186
毫秒,如图8-2所示。
q江xz南vb大@1学63.2c0o1m2
declare @i int select @i=1
q江xz南vb大@1学63.2c0o1m2
返回本节首页
while @i<=80000
begin
insert into itbl(rq,srq,hh,mm,ss,num) values(getdate(),cast(getdate() as varchar(20)),DATEPART(hh, getdate()),DATEPART(mi, getdate()),DATEPART(ss, getdate()),cast(rand(@i)*100 as numeric(12,3)))
CREATE TABLE itbl(id bigint IDENTITY (1, 1) NOT NULL, rq datetime NULL,srq varchar(20) NULL, hh smallint NULL, mm smallint NULL, ss smallint NULL, num numeric(12, 3))
select @s='time--'+convert(char(10),@hm2)
RAISERROR (@s, 16, 1)
q江xz南vb大@1学63.2c0o1m2
返回本节首页
3、未建索引时: 1) 单记录插入(约10毫秒,给出的毫秒数在特定环境下得出 的,只作参考,下同)
select @i=DATEPART(ms, @dt1)
insert into itbl(rq,srq,hh,mm,ss,num) values(getdate(),cast(getdate() as varchar(20)),DATEPART(hh, getdate()),DATEPART(mi, getdate()), DATEPART(ss, getdate()),cast(rand(@i)*100 as numeric(12,3))) 2) 查询所有记录,按id排序(约2180毫秒)
“待测试命令” -- 此行将用测试命令替代
select @dt1=getdate()
select @hm2=DATEPART(hh, @dt1)*3600000+DATEPART(mi, @dt1)*60000+DATEPART(ss, @dt1)*1000+DATEPART(ms, @dt1) - @hm1
相关主题