问答题
有学生表(学号,姓名,年龄,性别,系名,专业名,班号),设一个系可有多个专业,每个专业可有多个班,各班班号不重复,一个学生只在一个班学习。现经常需要按“系名”和“班号”进行查询,为提高查询效率,需要为“系名”和“班号”两个列建立一个非聚集索引。建立此索引有下列两种方法。
·方法1:索引列顺序为(系名,班号)
·方法2:索引列顺序为(班号,系名)
问答题
这两种方法哪个更合理?请简要说明原因。
【正确答案】方法1更加合理。原因是:一个系有多个班,列顺序为(系名,班号)时,按照系名和班号来查询效率相对较高,此时查询条件和复合索引中的列顺序一致,同时便于按照系名来进行分组统计。
【答案解析】[解析] 包含多个列的索引称为复合索引,在创建复合索引时,最好保持索引中列顺序与WHERE条件语句中的列顺序一致,并且第一列是使用最频繁的列,这样效率最高。由于一个系包含多个专业,一个专业又包含多个班,经常需要按“系名”和“班号”进行组合查询,与索引列顺序为(班号,系名)相比,(系名,班号)更合理。在SELECT查询语句中,WHERE条件一般先按系名进行查询,再按班号进行查询。在索引文件中,首先按照系名来对记录进行排序,再按照班号进行排序,在按照系名和班号进行查询时,可以快速定位到指定的系范围,提高了查询效率,而且便于按系名来进行分组统计;而按照(班号,系名)的索引列顺序,先按照班号进行排序。再按照系名进行排序,会导致同一个系的班号并不在连续的范围中,查询效率相对较低。一般情况下,当涉及多个列的复合索引时,可以将包含范围较大的属性列放在前面,范围较小的属性列放在后面。
问答题
针对你认为合理的方法,写出创建该索引的SQL语句。
【正确答案】CREATE INDEX index_d_c ON 学生表(系号,班号)
或
CREATE NONCLUSTERED INDEX index_d_c ON 学生表(系号,班号)
【答案解析】