By 老猫 | 3月 4, 2011 - 5:02 下午 - Posted in Teradata

    
       第一个原则:在 where 子句中应该把最具限制性的条件放在最前面.
       – 在下面的两条 select 语句中:

select * from table 1 where col1 <= 10000 and col1 >=0;
select * from table 1 where col1 >=0 and col1 <= 10000;

       -如果数据表中的数据 col1 都>=0 ,则第一条语句要比第二条select 语句效率高的多,因为第二条语句的第一个条件耗费了大量的系统资源.

       第二个原则: where 子句中字段顺序应和索引中字段顺序一致.

       
       最近几篇关于 Teradata 的日志,来源于互联网,在阅读的过程中,感觉有些说法和我的认识存在一些差距,我会标红表示疑问,哪位有不同的见解,欢迎留下脚印:

  • 注意 union 和 union all 的区别, union all 效率更高
  • 在没有必要时不要使用 distinct 和 order by , 它同 union 一样会使查询变慢
  • between 在某些时候比 in 速度更快, between 能更快的根据索引找到范围
  • 用 or  的子句可以分解成多个查询,并且通过 union 连接多个查询.他们的速度中同是否使用索引有关.  (这样可以提高效率吗?)
  • 在 in 后面值的列表中,将出现最频繁的值放在最前面,出现的最少的放在最后面,判断次数. (这个会有影响吗?)
  • 合理的使用外连接,外连接比内连接效率更高(这个有实际应用有关系,外连接,数据量正确性?)

       

  • 字段提取要按照”需多少,提多少”的原则,查询时不要返回不需要的行,列,避免使用 “select * ” 进行全表查询
  • where  条件中任何对列的操作都将导致表扫描,它包括数据库函数,计算表达式等等,查询时尽量将操作移至等号右边.
  • 尽量避免 Like , in , or, not 等引起全表扫描的操作符.
  • 避免相关子查询,如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行
  • 避免或简化排序
  • 变量名称尽量一致
By 老猫 | - 4:34 下午 - Posted in Teradata

       
       建立合理的索引,索引的设计要建立在对各种查询的分析和预测上,遵循以下原则:
       – 有大量重复值,且经常有范围查询,例如:(between , > , < , >= , <= ) 和order by ,group by 发生的列,可考虑建立群集索引.
       – 经常同时存取多列,且每列都含有重复值可考虑建立组合索引.
       – 组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列.

       有索引的尽量用索引,用到索引的条件写在前面.

By 老猫 | - 4:27 下午 - Posted in Teradata

       
       在内连接中加入条件,无论是加到 join 子句,还是加到 where 子句,其效果完全一样.

       外连接情况就不同了:

  • 当把条件加入到 join 子句时,数据库会返回外连接表的全部行,然后使用指定的条件返回第二个表的行.
  • 当把条件放到 where 子句时,数据库先进行连接操作,然后使用 where 子句对连接后的新表进行数据筛选. (此处有待验证,印象中,teradata 会先进行 where 条件的限定,再做连接)
By 老猫 | - 4:14 下午 - Posted in Teradata

CROSS JOIN : 不使用任何匹配或者选取条件,而是直接交一个数据源中的每个行与另一个数据源中的每个行都一一匹配,结果集是笛卡尔乘积.大多数交叉连接都是由于错误操作而造成的,但是它在造测试数据时非常有用.

select * from
table1 as t1 cross join table2 as t2

等同于

select * from
table1 as t1, table2 as t2
By 老猫 | - 2:40 下午 - Posted in Teradata

       
       根据各种 SQL 语句的功能不同,可以将其分成以下三大类:
       (1) 数据定义语言 (DDL) :用来在系统中创建或修改各种对象的结构,也可以用来删除系统中已有的对象,其命令集中主要包括:
       – CREATE : 创建一个新的数据库,用户,数据库对象或索引
       – 删除一个已存在的数据库,用户,数据库对象或索引
       – 修改一个表结构和保护定义,启动或禁止触发器

       (2) 数据操作语言 (DML) :用来存取对象中的信息. 因此, DML 是 SQL 中使用最频繁的语言.其命令集中主要包括:
       – SELECT : 执行关系查询
       – INSERT : 在表中增加新行
       – UPDATE : 修改表中已存在行的值
       – DELETE : 删除表中已存在的行

       (3) 数据控制语言 (DCL) : 用来控制用户存储数据库的权限或者方式,其命令集中主要包括:
       – GRANT : 赋给用户权限
       – REVOKE : 去除用户权限
       – GIVE : 转让用户所有权