在分类汇总之前,为什么数据库必须是按关键字进行过排序或已建立索引?
数据库具有优化查询器,其优化通过3个阶段完成:查询分析、索引选择、合并选择。
1。查询分析
在查询分析阶段,SQL 优化器查看每一个由正规查询树代表的子句,并判断它是否能被优化。 SQL Server一般会尽量优化那些限制扫描的子句。例如,搜索和/或合并子句。但是不是所有合法的SQL语法都可以分成可优化的子句,如含有SQL不等关系符“<>”的子句。因为“<>”是1个排斥性的操作符,而不是1个包括性的操作符,所在扫描整个表之前无法确定子句的选择范围会有多大。 当1个关系型查询中含有不可优化的子句时,执行计划用表扫描来访问查询的这个部分,对于查询树中可优化的SQL子句,则由...全部
数据库具有优化查询器,其优化通过3个阶段完成:查询分析、索引选择、合并选择。
1。查询分析
在查询分析阶段,SQL 优化器查看每一个由正规查询树代表的子句,并判断它是否能被优化。
SQL Server一般会尽量优化那些限制扫描的子句。例如,搜索和/或合并子句。但是不是所有合法的SQL语法都可以分成可优化的子句,如含有SQL不等关系符“<>”的子句。因为“<>”是1个排斥性的操作符,而不是1个包括性的操作符,所在扫描整个表之前无法确定子句的选择范围会有多大。
当1个关系型查询中含有不可优化的子句时,执行计划用表扫描来访问查询的这个部分,对于查询树中可优化的SQL子句,则由优化器执行索引选择。
2。索引选择
对于每个可优化的子句,优化器都查看数据库系统表,以确定是否有相关的索引能用于访问数据。
只有当索引中的列的1个前缀与查询子句中的列完全匹配时,这个索引才被认为是有用的。因为索引是根据列的顺序构造的,所以要求匹配是精确的匹配。对于分簇索引,原来的数据也是根据索引列顺序排序的。想用索引的次要列访问数据,就像想在电话本中查找所有姓为某个姓氏的条目一样,排序基本上没有什么用,因为你还是得查看每一行以确定它是否符合条件。
如果1个子句有可用的索引,那么优化器就会为它确定选择性。
所以在设计过程中,要根据查询设计准则仔细检查所有的查询,以查询的优化特点为基础设计索引。
分类汇总实际上就是个查询的过程,往其往是基于一个或几个关键字段进行的,所以建立索引才能利用查询优化器,达到快速运行的效果。收起