❶ sql2005重建表索引会不会对表数据有影响
重建普通的索引, 对表的数据不会有影响。
因为 索引 不修改数据, 只是 某些情况下, 帮助查询的时候,快速定位数据。
例如你现在有本 新华字典。
你按照 部首笔画, 找某个字。
就是先查找 索引, 通过索引, 知道 某个字, 在某一页上面, 然后再翻到那一页,去看这个字的说明。
❷ 如何重建SQL索引 要具体的命令
USE TableName
DECLARE @TableName varchar(255)
DECLARE TableCursor CURSOR FOR
SELECT table_name FROM information_schema.tables
WHERE table_type = 'base table'
OPEN TableCursor
FETCH NEXT FROM TableCursor INTO @TableName
WHILE @@FETCH_STATUS = 0
BEGIN
DBCC DBREINDEX(@TableName,' ',90)
FETCH NEXT FROM TableCursor INTO @TableName
END
CLOSE TableCursor
DEALLOCATE TableCursor
❸ mysql 数据库迁移的时候 如果之前的数据库使用了主键索引,那么需要重新构建主键索引么
不需要。数据库迁移的时候,MySql会自动重建主键索引。
❹ SQL Server 2000数据库中如何重建索引
连续索引页由从一个页到下一个页的指针链接在一起。当对数据的更改影响到索引时,索引中的信息可能会在数据库中分散开来。重建索引可以重新组织索引数据(对于聚集索引还包括表数据)的存储,清除碎片。这可通过减少获得请求数据所需的页读取数来提高磁盘性能。 在Microsoft�0�3 SQL Server�6�4 2000 中,如果要用一个步骤重新创建索引,而不想删除旧索引并重新创建同一索引,则使用 CREATE INDEX 语句的 DROP_EXISTING 子句可以提高效率。这一优点既适用于聚集索引也适用于非聚集索引。 以删除旧索引然后重新创建同一索引的方式重建聚集索引,是一种昂贵的方法,因为所有二级索引都使用聚集键指向数据行。如果只是删除聚集索引然后重新创建,则会使所有非聚集索引都被删除和重新创建两次。一旦删除聚集索引并再次重建该索引,就会发生这种情形。通过在一个步骤中重新创建索引,可以避免这一昂贵的做法。在一个步骤中重新创建索引时,会告诉 SQL Server 要重新组织现有索引,避免了删除和重新创建非聚集索引这些不必要的工作。该方法的另一个重要优点是可以使用现有索引中的数据排序次序,从而避免了对数据重新排序。这对于聚集索引和非聚集索引都十分有用,可以显着减少重建索引的成本。另外,通过使用 DBCC DBREINDEX 语句,SQL Server 还允许对一个表重建(在一个步骤中)一个或多个索引,而不必单独重建每个索引。 DBCC DBREINDEX 也可用于重建执行 PRIMARY KEY 或 UNIQUE 约束的索引,而不必删除并创建这些约束(因为对于为执行 PRIMARY KEY 或 UNIQUE 约束而创建的索引,必须先删除该约束,然后才能删除该索引)。
❺ oracle 数据库 索引有必要定时重建吗
需要,如果索引所在的表经常有插入删除操作时
❻ sql怎么建立索引
什么是索引
拿汉语字典的目录页(索引)打比方:正如汉语字典中的汉字按页存放一样,SQL Server中的数据记录也是按页存放的,每页容量一般为4K 。为了加快查找的速度,汉语字(词)典一般都有按拼音、笔画、偏旁部首等排序的目录(索引),我们可以选择按拼音或笔画查找方式,快速查找到需要的字(词)。
同理,SQL Server允许用户在表中创建索引,指定按某列预先排序,从而大大提高查询速度。
• SQL Server中的数据也是按页( 4KB )存放
• 索引:是SQL Server编排数据的内部方法。它为SQL Server提供一种方法来编排查询数据。
• 索引页:数据库中存储索引的数据页;索引页类似于汉语字(词)典中按拼音或笔画排序的目录页。
• 索引的作用:通过使用索引,可以大大提高数据库的检索速度,改善数据库性能。
索引类型
• 唯一索引:唯一索引不允许两行具有相同的索引值
• 主键索引:为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的,并且不能为空
• 聚集索引(Clustered):表中各行的物理顺序与键值的逻辑(索引)顺序相同,每个表只能有一个
• 非聚集索引(Non-clustered):非聚集索引指定表的逻辑顺序。数据存储在一个位置,索引存储在另一个位置,索引中包含指向数据存储位置的指针。可以有多个,小于249个
索引类型:再次用汉语字典打比方,希望大家能够明白聚集索引和非聚集索引这两个概念。
唯一索引:
唯一索引不允许两行具有相同的索引值。
如果现有数据中存在重复的键值,则大多数数据库都不允许将新创建的唯一索引与表一起保存。当新数据将使表中的键值重复时,数据库也拒绝接受此数据。例如,如果在stuInfo表中的学员员身份证号(stuID) 列上创建了唯一索引,则所有学员的身份证号不能重复。
提示:创建了唯一约束,将自动创建唯一索引。尽管唯一索引有助于找到信息,但为了获得最佳性能,建议使用主键约束或唯一约束。
主键索引:
在数据库关系图中为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的。当在查询中使用主键索引时,它还允许快速访问数据。
聚集索引(clustered index)
在聚集索引中,表中各行的物理顺序与键值的逻辑(索引)顺序相同。表只能包含一个聚集索引。例如:汉语字(词)典默认按拼音排序编排字典中的每页页码。拼音字母a,b,c,d……x,y,z就是索引的逻辑顺序,而页码1,2,3……就是物理顺序。默认按拼音排序的字典,其索引顺序和逻辑顺序是一致的。即拼音顺序较后的字(词)对应的页码也较大。如拼音“ha”对应的字(词)页码就比拼音“ba” 对应的字(词)页码靠后。
非聚集索引(Non-clustered)
如果不是聚集索引,表中各行的物理顺序与键值的逻辑顺序不匹配。聚集索引比非聚集索引(nonclustered index)有更快的数据访问速度。例如,按笔画排序的索引就是非聚集索引,“1”画的字(词)对应的页码可能比“3”画的字(词)对应的页码大(靠后)。
提示:SQL Server中,一个表只能创建1个聚集索引,多个非聚集索引。设置某列为主键,该列就默认为聚集索引
如何创建索引
使用T-SQL语句创建索引的语法:
CREATE [UNIQUE] [CLUSTERED|NONCLUSTERED]
INDEX index_name
ON table_name (column_name…)
[WITH FILLFACTOR=x]
q UNIQUE表示唯一索引,可选
q CLUSTERED、NONCLUSTERED表示聚集索引还是非聚集索引,可选
q FILLFACTOR表示填充因子,指定一个0到100之间的值,该值指示索引页填满的空间所占的百分比
在stuMarks表的writtenExam列创建索引:
USE stuDB
GO
IF EXISTS (SELECT name FROM sysindexes
WHERE name = 'IX_writtenExam')
DROP INDEX stuMarks.IX_writtenExam
/*--笔试列创建非聚集索引:填充因子为30%--*/
CREATE NONCLUSTERED INDEX IX_writtenExam
ON stuMarks(writtenExam)
WITH FILLFACTOR= 30
GO
/*-----指定按索引 IX_writtenExam 查询----*/
SELECT * FROM stuMarks (INDEX=IX_writtenExam)
WHERE writtenExam BETWEEN 60 AND 90
虽然我们可以指定SQL Server按哪个索引进行数据查询,但一般不需要我们人工指定。SQL Server将会根据我们创建的索引,自动优化查询。
索引的优缺点
• 优点
– 加快访问速度
– 加强行的唯一性
• 缺点
– 带索引的表在数据库中需要更多的存储空间
– 操纵数据的命令需要更长的处理时间,因为它们需要对索引进行更新
创建索引的指导原则
• 请按照下列标准选择建立索引的列。
– 该列用于频繁搜索
– 该列用于对数据进行排序
• 请不要使用下面的列创建索引:
– 列中仅包含几个不同的值。
– 表中仅包含几行。为小型表创建索引可能不太划算,因为SQL Server在索引中搜索数据所花的时间比在表中逐行搜索所花的时间更长
❼ oracle 索引什么时候重建和重建方法讨论
Normal 0 7.8 pt 0 2 false false false MicrosoftInternetExplorer4
oracle 索引什么时候重建和重建方法讨论
分类:数据库技术 字号: 大大中中小小 索引什么时候需要重建和重建的方法
一提到索引,大家都知道,但是怎样建索引,什么时候重建索引,重建索引用什么方法,可能有的就不太清楚了,我根据一些资料简单的整理一点,如果哪里不对或是不妥请大家指点,希望大家有更好经验也share出来。
索引的目的是为了加快寻找数据的速度,但是如果对表经常做改动,则索引也会相应改动,时间长了,查询速度的效率就会降低,就有可能要重建索引,那么什么时候需要重建索引和用什么方法重建索引可能是大家关心的。
一. 索引在内部进行自身的管理以确保对数据行的快速访问。但是数据表中大量的活动会导致oracle索引动态地对自身的进行重新配置,这些配置包括三个方面:
1.索引分割
当新数据行产生的索引节点要建立在现有级别上时,出现此动作。
2.索引生成
在某些位置,索引达到此级索引的最大容量的时候,就会生成更深一级的索引结构。
3.索引节点的删除
你可能了解到,删除表中的数据行后,索引中相应的节点不会从物理意义上删除,也没有从索引中删除此项目。而是从逻辑上删除此索引项目,并在索引树中留下了一个“死“节点,当索引删除了叶节点或是生成了过深的的级别层次后,就需要进行重建。
二 索引的种类:
a.B-tree(B树)索引
b.压缩B树索引
c.Bitmap(位图)索引
d.函数索引
e.Reverse Key Index(反向键索引)
f.Index Organized Table(索引组织表)
三 下面分别对各种索引进行说明
在进行介绍前先说明几个术语:
高基数:简单理解就是表中列的不同值多
低基数:建单理解就是表中的列的不同值少
以删除的叶节点数量:指得是数据行的delete操作从逻辑上删除的索引节点的数量,要记住oracle在删除数据行后,将“死“节点保留在索引中,这样做可以加快sql删除操作的速度,因此oracle删除数据行后可以不必重新平衡索引。
索引高度:索引高度是指由于数据行的插入操作而产生的索引层数,当表中添加大量数据时,oracle将生成索引的新层次以适应加入的数据行,因此, oracle索引可能有4层,但是这只会出现在索引数中产生大量插入操作的区域。Oracle索引的三层结构可以支持数百万的项目,而具备4层或是更多层的需要重建。
每次索引访问的读取数:是指利用索引读取一数据行时所需要的逻辑I/O操作数,逻辑读取不必是物理读取,因为索引的许多内容已经保存在数据缓冲区,然而,任何数据大于10的索引都需要重建。
1. B-tree(B树)索引
是现代关系型数据库中最常用的索引。除了存储索引数据外,还存储一个行ID,用来指出该行其余数据存储在这个被索引表中的什么地方。该索引以一种数结构格式存储这些值。
Oracle建议如果表经过排序,当返回40%一下的数据时使用索引,如果高于40%则使用全表扫描,如果没有经过排序,则当返回7%以下时,使用索引。看表是否排序,可以看dba_indexes字典中的CLUSTERING_FACTOR列,如果与表占用的数据块数相近,则经过了排序,如果与行数相近,则没有排序。那么什么时候重建呢?我们可以利用analyze index …….. compute statistics 对表进行分析。然后察看dba_indexes中的blevel。这列是说明索引从根块到叶快的级别,或是深度。如果级别大于等于4。则需要重建,如下:
Select index_name,blevel from dba_indexeswhere blevel>=4.
另一个从重建中受益的指标显然是当该索引中的被删除项占总的项数的百分比。如果在20%以上时,也应当重建,如下
SQL>anlyze index ------ validatestructure
SQL>select(del_lf_rows_len/lf_rows_len)*100 from index_stats where 删除并从头开始建立索引。
b. 使用alter index -------- rebuild 命令重建索引
c. 使用alter index -------- coalesce命令重建索引。
下面讨论一下这三种方法的优缺点:
1).删除并从头开始建索引:方法是最慢的,最耗时的。一般不建议。
2).Alter index ---- rebuild 快速重建索引的一种有效的办法,因为使用现有索引项来重建新索引,如果客户操作时有其他用户在对这个表操作,尽量使用带online参数来最大限度的减少索引重建时将会出现的任何加锁问题,alter index ------- rebuild online.但是,由于新旧索引在建立时同时存在,因此,使用这种技巧则需要有额外的磁盘空间可临时使用,当索引建完后把老索引删除,如果没有成功,也不会影响原来的索引。利用这种办法可以用来将一个索引以到新的表空间。
Alter index ------ rebuild tablespace -----。
这个命令的执行步骤如下:
首先,逐一读取现有索引,以获取索引的关键字。
其次,按新的结构填写临时数据段。
最后,一旦操作成功,删除原有索引树,降临时数据段重命名为新的索引。
需要注意的是alterindex ---rebuild 命令中必须使用tablespace字句,以保证重建工作是在现有索引相同的表空间进行。
3).alter index ----- coalesce 使用带有coalesce参数时重建期间不需要额外空间,它只是在重建索引时将处于同一个索引分支内的叶块拼合起来,这最大限度的减少了与查询过程中相关的潜在的加锁问题,但是,coalesce选项不能用来讲一个索引转移到其他表空间。
2.压缩B树索引
当B树索引基于大表时,尤其是当基于数据仓库或决策支持系统中的大表时,这些索引会耗费大量的存储空间,压缩(compressed)B树索引用来最大限度的减少某些类型的B树索引使用的空间。当一个B树索引得到压缩时,被索引的猎的重复出现就被消除掉,进而减少了存储索引的总的存储空间。例如:
压缩前:smith每次出现还要存储它的相关的rowid.
姓 关联rowid
smith AAABSOAAEAAAABTAAB
smith AAABSOAAEAAAABTAAC
smith AAABSOAAEAAAABTAAD
压缩后:smith项和rowid指存储一次。
smith AAABSOAAEAAAABTAAB,AAABSOAAEAAAABTAAB, AAABSOAAEAAAABTAAB
创建方法:
SQL>create index index_name ontable_name(column_name)
tablespace tablespace_name
compress;
另一种方法:
SQL>alter index index_name rebuildcompress;
3. itmap(位图)索引。
B树索引在数据具有高基数的列工作的最好,对于低基数的列,位图索引可能是更有效的选择。位图索引创建表行的一个二进制映像,并把映像存储在索引块中,这种类型的索引的DML操作少,长度大并且含有极少不同的值得列特别有用。位图索引不应当用在频繁发生insert,update,delete操作的表上,这些dml操作在性能方面的代价很高,因为,他们会引起位图级的加锁发生,而且要求动态的重建所有可能值的位图。为图索引最适合数据仓库和决策支持系统。
4.基于函数的索引
当把一个函数运用于被索引的列上时,该列德索引都变得无效,基于函数的索引就是为了解决这个问题。
5.反向键索引
是一种特殊类型的B树索引,在索引基于含有序数的列时使非常有用的,如果一个传统的B树索引基于一个含有这种数据的列,往往会产生许多级,由于B树索引有 4级以上的深度会降低性能,因此反向键索引更适合这种类型,反向键索引通过简单的烦象被索引的列中的数据来解决问题,他首先反向每个列键值的字节,然后在反向后的新数据上进行索引,而新数据在值的范围上的分布通常比原来的有序数更均匀。
6.索引组织表
由于B树、位图、反向键索引的使用而引起的性能将会导致这样的事实,这些索引中的项目直接指向索引基表中对应数据的行ID,这是从表行没有按任何特定的顺序来物理地存储表中检索表行的一种有效方法,这种表叫做堆表,oracle大多数表中以一种堆叠方式存储行数据,因为行以一种或多或少的随机方式被分配给表内的块,之所以出现这种随机性,是因为oracle在决定把一个行存储在何处时并不考虑改行的内容,oracle只是把该行存储在它从该表的freelist 上所发现的第一个块中。
如果希望按一种指定顺序来存储一个表的数据,就不能使用堆表,为此oracle提供了索引组织表,索引组织表不是存储一个指向行数据的其余部分存储在了何处的行的ID指针,而是把行数据全部存储在索引本身内,这产生了两个性能好处:
n 表行按索引顺序来存储。
n 使用B树索引时引起的先读取索引后读取表锁使用的额外I/O操作得到消除。
例如:
sql>create table emp
(last_name varchar2(9) primary key,
first_name varchar2(9),
hire_date date)
organization index tablespace users
pctthreshold 25
including first name
overflow tablespace qyl
mapping table;
所有索引组织表在将要作为索引基础的那一列上都必须有一个主键约束,索引组织表不能含有唯一性约束或是被聚簇。
下面说明各个参数的含义:
organization index:说明该表是索引组织表
pctthreshold :指定整个数据块的什么百分比要保持打开,以便存储一个与主键值相关联的行数据,其中主键值必须在0到50之间(50是默认值)
including : 指定在行长度超过pctthershold中所设置的大小时按那一列 把行分解成两段
overflow tablespace :指定在行长度超过pctthreshold中设置的大小时行数的的另一部分存储到的表空间。
Mapping table:致使在创建索引组织表的位图索引时所必需的一个关联映像表的创建。
以上是我根据一些资料对索引的一个简单阐述,大家可能有不同的见解,希望对大家有帮助,那些不妥的地方还希望大家提出来。
参考资料:ocp困惑racle9i性能调整
oracle statspack 高性能调整技术
[@more@]
analyze index t_id_ind validate structure
select (del_lf_rows_len/lf_rows_len)*100 from index_stats
>20%
b. 使用alter index t_id_ind rebuild 命令重建索引
c. 使用alter index t_id_ind coalesce命令重建索引。
alter indext_id_ind rebuild online.
但是,由于新旧索引在建立时同时存在,因此,使用这种技巧则需要有额外的磁盘空间可临时使用,当索引建完后把老索引删除,如果没有成功,也不会影响原来的索引。利用这种办法可以用来将一个索引以到新的表空间。
Alter index ------ rebuild tablespace -----。
这个命令的执行步骤如下:
首先,逐一读取现有索引,以获取索引的关键字。
其次,按新的结构填写临时数据段。
最后,一旦操作成功,删除原有索引树,降临时数据段重命名为新的索引。
需要注意的是alter index ---rebuild 命令中必须使用tablespace字句,以保证重建工作是在现有索引相同的表空间进行
alter index ----- coalesce 使用带有coalesce参数时重建期间不需要额外空间,它只是在重建索引时将处于同一个索引分支内的叶块拼合起来,这最大限度的减少了与查询过程中相关的潜在的加锁问题,但是,coalesce选项不能用来讲一个索引转移到其他表空间
❽ 数据库中一张表里面的索引数据大小超过了表本身的数据大小,这种情况是否正常,是否要对索引进行重建
我认为是很有可能产生这样情况的。当你的表创建的过多的索引时,索引数据大小会大于表数据大小。例如,表里有10个字段,为每一个字段都创建一个索引。肯定会产生索引数据会大于表数据
❾ sql server 删除记录 会自动重建索引么
sql server的索引是自动建立、自动更新的。所以是会自动重建索引的