如果 有一张表为 Table1
字段有:ID,Name,……
有数据
001,zzz
002,azz
003,vzz
004,fff
005,dddselect * from Table1 where name like '%z%';结果大家都知道,但这条语句内部过程是怎么样的?
是先 where name like '%z%'还是 先select * from Table1。
字段有:ID,Name,……
有数据
001,zzz
002,azz
003,vzz
004,fff
005,dddselect * from Table1 where name like '%z%';结果大家都知道,但这条语句内部过程是怎么样的?
是先 where name like '%z%'还是 先select * from Table1。
如果 name 列上没有建索引,自然是全表扫描,从数据页取出所有数据,逐条比对。如果 name 列上创建有索引,可能是全索引扫描,先从索引页取出数据逐个比对,然后将符合条件的数据根据索引中的指针信息从数据页中提取出来。
那有没有顺序问题?
Microsoft SQL Server 2000 Analysis Services 中两个功能最强大且相对最困难的概念是求解次序和传递次序,它们共同决定了当处理查询时对多维数据集进行解析的方式。本主题假定您已对多维数据集、自定义成员、计算成员以及自定义汇总有了基本的理解。传递次序
当多维数据集作为多维表达式 (MDX) 查询的结果进行计算时,它至少要经过一个阶段的计算,而且根据使用的各种与计算有关的功能,如自定义汇总公式、自定义汇总运算符以及计算单元,可能需要进行多个阶段的计算。每一阶段都称为一个计算传递,因为分析服务器进行了适用于该阶段的一次完整的计算传递。可用顺序位置(称为计算传递号)对计算传递进行引用。完全计算多维数据集的所有单元所需的计算传递的计数称为多维数据集的计算传递深度。多维数据集始终有一个计算传递,用来检索为多维数据集存储的数据。因为传递号的顺序位置由零开始,所以这一传递始终称为计算传递 0。所有计算成员和自定义成员也在传递 0 以及其后的每个计算传递上计算,计算时使用由每个计算成员的求解次序在此计算传递内建立的公式优先级。不允许对此计算传递执行其它操作;计算单元不能将计算传递 0 指派给其计算传递号。如果多维数据集包含自定义汇总公式或自定义汇总运算符,则执行第二个计算传递以处理计算这些功能所需的计算。这些功能从计算传递 1 开始计算,而且也在其后由计算单元定义确定的每个计算传递计算。对于自定义汇总公式或自定义汇总运算符,不能更改计算传递号,因为在每个计算传递上对其进行计算,而且公式优先级由求解次序处理。但是,计算单元可以将计算传递 1 指派给其计算传递号,稍后会在本主题中更详细地描述。无计算单元的多维数据集至多包含两个计算传递。但是,计算单元可指定在其上进行计算单元定义计算的最后一个计算传递号,以及计算单元定义与多少个传递一起使用,从而提供创建使用两个或多个计算传递的多维数据集的能力。 计算单元可使用多维数据集编辑器"高级"选项卡上的 Calculation Pass Number 属性或者使用 MDX 语句中的 CALCULATION_PASS_NUMBER 属性指定计算传递号。另外,通过指定将计算公式以递归方式应用到计算子多维数据集的计算传递的数量,可允许进行递归计算。可通过多维数据集编辑器"高级"选项卡上的 Calculation Pass Depth 属性或使用 MDX 语句中的 CALCULATION_PASS_DEPTH 属性访问此功能,它可允许在多维数据集中使用高度复杂的计算,如目标搜索等式。计算传递号为计算单元定义确定赋值开始以及计算结束所在的计算传递。计算传递深度决定要有多少计算传递才能完全计算计算单元定义。只有计算单元才会有大于 1 的计算传递号。使用计算单元定义的单元属性 CALCULATION_PASS_NUMBER 和 CALCULATION_PASS_DEPTH,完全计算计算单元所需的计算传递的包含范围数可用如下公式定义:CALCULATION_PASS_NUMBER 到 (CALCULATION_PASS_NUMBER - CALCULATION_PASS_DEPTH) + 1。换句话说,如果计算单元定义具有为 4 的 CALCULATION_PASS_NUMBER 和为 3 的 CALCULATION_PASS_DEPTH,则计算单元定义在计算传递 4、3 和 2 中取值,然后在计算传递 2、3 和 4 中计算。所有计算传递都保留在内存中,以方便对计算公式中以前的传递值进行引用。引用给定单元的以前传递值的能力使得在性能提高的情况下进行复杂的计算,如推测分析和目标搜索公式。完全计算多维数据集所有单元所需的计算传递数量可通过首先赋值全部自定义成员、自定义汇总、计算成员以及计算单元来确定。赋值从由 CALCULATION_PASS_NUMBER 属性确定的最高计算传递到最低计算传递进行,以精确确定计算传递间的公式优先级。然后当计算计算传递时将次序逆转,按从最低到最高的次序计算。实际上,每个计算传递都视为一个嵌套计算,最低计算传递嵌套最深。下表说明计算传递号和计算传递深度对示例多维数据集的影响。示例多维数据集包括四项计算: 计算成员,以深灰阴影表示,SOLVE_ORDER 为 1。
自定义汇总公式,以深蓝阴影表示,SOLVE_ORDER 为 2。
计算单元定义,以绿色阴影表示,CALCULATION_PASS_NUMBER 为 2,CALCULATION_PASS_DEPTH 为 1,SOLVE_ORDER 为 1。
计算单元定义,以红色阴影表示,CALCULATION_PASS_NUMBER 为 3,CALCULATION_PASS_DEPTH 为 2,SOLVE_ORDER 为 2。
2:SELECT....
3:WHERE....这是有官方流程图的,楼主可以去找找。
再 where
再 group
再 select (选择列,并赋予别名)
最后 order by (所以别名只在 order by 子句有效)
再 where
再 group
再 select (选择列,并赋予别名)
最后 order by (所以别名只在 order by 子句有效)那么多个 and 有顺序吗我想如果有的话,筛选的时候and 的顺序对性能也会有影响了。
Oracle是从右到左所以要把过滤条件最明显的放在最前面。
再 where
再 group
再 select (选择列,并赋予别名)
最后 order by (所以别名只在 order by 子句有效)
--------------这是错的,这个顺序是有官方资料的,是一个流程图,没看过的别乱说,误导其他人
先 from (如果多表,会做join)
再 where
再 group
再 select (选择列,并赋予别名)
最后 order by (所以别名只在 order by 子句有效)这个是逻辑顺序, 物理顺序并不是一定这样的, 在SQL SERVER里, WHERE里的FILTER往往要比JOIN ON里的条件先执行.