日期:2014-05-18  浏览次数:20545 次

请问如何创建索引来加快查询速度
表中包括     型号   批号   级别   这三个字段,表中记录如下,
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 次
*/

------解决方案--------------------
建立一个普通索引, 包含这三个列就好了, 注意列的升降序要和需求的结果一致


这建议建立为聚集的, 原因很简单:
聚集的会影响所有的普通索引(普通索引指向数据的指针)和数据存储顺序, 用三个列来做, 开销比较大
而建立一个普通索引的话, 因为普通索引已经包含了楼主查询所需要的所有数据, 所以形成了覆盖索引, 查询覆盖索引不会扫描原始表中的数据, 直接从索引就得到数据结果了

所以楼主的这个需求用普通索引是最合适的