请问如何创建索引来加快查询速度
表中包括 型号 批号 级别 这三个字段,表中记录如下,
0530 A 良
0530 A 次
0648 B 良
0648 B 次
0530 C 良
0648 A 次
本人想得到的是如何结果
0530 A 良
0530 A 次
0530 C 良
0648 A 次
0648 B 良
0648 B 次
请问能否创建索引来加快查询速度,以及怎样创建?
------解决方案-------------------- select *
from
(
select '良 ' as A
union all
select '次 ' as A
) t
order by a
/*
次
良
*/
因为次、良升序排序是次在前,而良在后。
如果这三个字段是逻辑关键字,可以创建聚集索引:
型号 升序
批号 升序
级别 降序
------解决方案--------------------if object_id( 'tbTest ') is not null
drop table tbTest
GO
----创建测试数据
create table tbTest(型号 varchar(10),批号 varchar(10), 级别 varchar(10))
insert tbTest
select '0530 ', 'A ', '良 ' union all
select '0530 ', 'A ', '次 ' union all
select '0648 ', 'B ', '良 ' union all
select '0648 ', 'B ', '次 ' union all
select '0530 ', 'C ', '良 ' union all
select '0648 ', 'A ', '次 '
----为型号列创建聚集索引
create CLUSTERED index idx_tbTest_型号 on tbTest(型号)
GO
----查询
select * from tbTest order by 型号,批号
----清除测试环境
drop table tbTest
/*结果
型号 批号 级别
---------- ---------- ----------
0530 A 良
0530 A 次
0530 C 良
0648 A 次
0648 B 良
0648 B 次
*/
------解决方案----------------------楼上这种处理方式有问题,如果追加顺序不同,可能查询结果就不对了。
--如:
if object_id( 'tbTest ') is not null
drop table tbTest
GO
----创建测试数据
create table tbTest(型号 varchar(10),批号 varchar(10), 级别 varchar(10))
insert tbTest
select '0530 ', 'A ', '良 ' union all
select '0530 ', 'A ', '次 ' union all
select '0648 ', 'B ', '次 ' union all
select '0648 ', 'B ', '良 ' union all
select '0530 ', 'C ', '良 ' union all
select '0648 ', 'A ', '次 '
----为型号列创建聚集索引
create CLUSTERED index idx_tbTest_型号 on tbTest(型号)
GO
----查询
select * from tbTest order by 型号,批号
----清除测试环境
drop table tbTest
/*结果
型号 批号 级别
---------- ---------- ----------
0530 A 良
0530 A 次
0530 C 良
0648 A 次
0648 B 良
0648 B 次
*/
------解决方案--------------------建立一个普通索引, 包含这三个列就好了, 注意列的升降序要和需求的结果一致
这建议建立为聚集的, 原因很简单:
聚集的会影响所有的普通索引(普通索引指向数据的指针)和数据存储顺序, 用三个列来做, 开销比较大
而建立一个普通索引的话, 因为普通索引已经包含了楼主查询所需要的所有数据, 所以形成了覆盖索引, 查询覆盖索引不会扫描原始表中的数据, 直接从索引就得到数据结果了
所以楼主的这个需求用普通索引是最合适的