http://blog.chinaunix.net/u3/103331/showart_2050758.html
总结 2
1、Parcel
Client to Server(Request Parcel(1)、Data Parcel(0 or N)、Response Parcel)
1、Parcel
Client to Server(Request Parcel(1)、Data Parcel(0 or N)、Response Parcel)
Parcel步骤:REQUEST PARCEL -> SYNTAXER -> RESOLVER -> SECURITY -> OPTIMIZER -> GENERATOR -> GNCApply -> AMP STEPS
使用Data Parcel的好处,是可以让PE缓存执行计划,重复执行,提高效率。
使用意见:对于那种重复执行的动作,比如重复插入一堆的数据的时候,最好将数据弄成文件的形式,采用Using 的方式在BTEQ中提交,能提高很多效率。
如何查看执行的sql是否被cache呢?
Answer:通过DBQLogTbl表,里面的字段CacheFlag可以查看该语句在执行的时候是否有被cache(PE的解析Cache是采用LRU算法,4个小时最长生命周期,既4个小时候会把该sql语句给unmarked)
使用Data Parcel的好处,是可以让PE缓存执行计划,重复执行,提高效率。
使用意见:对于那种重复执行的动作,比如重复插入一堆的数据的时候,最好将数据弄成文件的形式,采用Using 的方式在BTEQ中提交,能提高很多效率。
如何查看执行的sql是否被cache呢?
Answer:通过DBQLogTbl表,里面的字段CacheFlag可以查看该语句在执行的时候是否有被cache(PE的解析Cache是采用LRU算法,4个小时最长生命周期,既4个小时候会把该sql语句给unmarked)
Parcel的RESOLVER过程,会使用系统字典表来检查sql语句是否正确,那么是否会锁系统表呢?
Answer:Parcel的RESOLVER也是使用缓存来存系统字典表信息,不会锁系统表。Data Dictionary Cache
Answer:Parcel的RESOLVER也是使用缓存来存系统字典表信息,不会锁系统表。Data Dictionary Cache
2、Join Strategies
Teradata的设计思想是:Share Nothing,也就是说各个AMP之间是独立,每个AMP都不知道其他AMP到底存储有什么样的数据,所以对于Join、比较等,都需要在本AMP进行了,也就有了所有的Redistribution和Duplicate to all amp。
Teradata的设计思想是:Share Nothing,也就是说各个AMP之间是独立,每个AMP都不知道其他AMP到底存储有什么样的数据,所以对于Join、比较等,都需要在本AMP进行了,也就有了所有的Redistribution和Duplicate to all amp。
Product Join:Duplicate smaller table to all amp,(not sort)
Merge Join:Duplicate smaller table or redistribute table which don't join with pi. Sort on join column row hash.
merge join 由于Sort column row hash,所以可以减少比较的次数(不用像Product Join那样每个都需要比较)。
Join如果非正常的慢可能有以下几个情况:
which is redistributed by hash code to all AMPs : Skew表被Redistribute了
which is duplicated on all AMPs : 大表被Duplicate了。
这就涉及到一个统计信息的问题。如果收集的统计信息没有及时的更新,比如说建完一个表,收集了统计信息,然后统计信息里面这个表是小表(因为是空表)。而当这个表数据量变大时,没有更新统计信息,则优化器还是认为他是小表,可能就会duplicate这张表,那就是个大工作量了。
Where条件中,关于OR操作的优化,可以采用UNION的方式,放到2个SQL语句中执行,而不做product join。
SELECT Department_Name, Last_Name, First_Name
FROM Employee INNER JOIN Department
ON Employee.Department_Number = Department.Department_Number
OR Employee.Employee_Number = Department.Manager_Employee_Number;
变为
SELECT Department_Name, Last_Name, First_Name
FROM Employee INNER JOIN Department
ON Employee.Department_Number = Department.Department_Number
UNION UNION
SELECT Department_Name, Last_Name, First_Name
FROM Employee INNER JOIN Department
ON Employee.Employee_Number = Department.Manager_Employee_Number;
Merge Join:Duplicate smaller table or redistribute table which don't join with pi. Sort on join column row hash.
merge join 由于Sort column row hash,所以可以减少比较的次数(不用像Product Join那样每个都需要比较)。
Join如果非正常的慢可能有以下几个情况:
which is redistributed by hash code to all AMPs : Skew表被Redistribute了
which is duplicated on all AMPs : 大表被Duplicate了。
这就涉及到一个统计信息的问题。如果收集的统计信息没有及时的更新,比如说建完一个表,收集了统计信息,然后统计信息里面这个表是小表(因为是空表)。而当这个表数据量变大时,没有更新统计信息,则优化器还是认为他是小表,可能就会duplicate这张表,那就是个大工作量了。
Where条件中,关于OR操作的优化,可以采用UNION的方式,放到2个SQL语句中执行,而不做product join。
SELECT Department_Name, Last_Name, First_Name
FROM Employee INNER JOIN Department
ON Employee.Department_Number = Department.Department_Number
OR Employee.Employee_Number = Department.Manager_Employee_Number;
变为
SELECT Department_Name, Last_Name, First_Name
FROM Employee INNER JOIN Department
ON Employee.Department_Number = Department.Department_Number
UNION UNION
SELECT Department_Name, Last_Name, First_Name
FROM Employee INNER JOIN Department
ON Employee.Employee_Number = Department.Manager_Employee_Number;
Nested Join(最简单的join):join的一个表而且有确定的where条件(UPI或者USI) ,只能选择出一条记录
3、PPI
PPI的好处:特殊查询能力的增强,比如说按日期查询(设置按日期的PPI),避免全表扫描
PPI可能出现的问题:多了2个字节的空间浪费(partition号),对PI的查询可能会比没有定义PPI的慢(先确定了partition在访问里面的row hash)。
如果partition 不是PI的一部分的话,PI不能定义为UPI,而为了保证唯一性,可以定义USI在字段上。
思考?为什么partition不是PI的一部分的话,PI不能定义为UPI
Answer:UPI能确保唯一性,而如果partition不是PI的一部分的话,如果使用PI来Access的话,会扫描每个partition在定位,已经失去了作为UPI的意义了。
DBC.IndexConstraints中ConstraintsType标志位Q的表示PPI。
PPI的好处:特殊查询能力的增强,比如说按日期查询(设置按日期的PPI),避免全表扫描
PPI可能出现的问题:多了2个字节的空间浪费(partition号),对PI的查询可能会比没有定义PPI的慢(先确定了partition在访问里面的row hash)。
如果partition 不是PI的一部分的话,PI不能定义为UPI,而为了保证唯一性,可以定义USI在字段上。
思考?为什么partition不是PI的一部分的话,PI不能定义为UPI
Answer:UPI能确保唯一性,而如果partition不是PI的一部分的话,如果使用PI来Access的话,会扫描每个partition在定位,已经失去了作为UPI的意义了。
DBC.IndexConstraints中ConstraintsType标志位Q的表示PPI。
PPI的适用情形:
1、大表
2、partition字段经常被Access
3、partition的数量是有限制的(65535)
1、大表
2、partition字段经常被Access
3、partition的数量是有限制的(65535)
4、Aggregation
ARSA算法:
Aggregate - Local on the AMPs
Redistribute - The Local Aggregations
Sort - The Redistribution Aggregations
Aggregate - Globally for the final aggregation
ARSA算法:
Aggregate - Local on the AMPs
Redistribute - The Local Aggregations
Sort - The Redistribution Aggregations
Aggregate - Globally for the final aggregation
Group by VS Distinct
1、适用情况:
Group by 先在本AMP上分组,然后在在Globally上分组
Distinct 是先把数据分布到All AMP上在去重。
所以,在重复值比较多的情况下,Group by 能提高点性能,其他情况下,Distinct比较快点。(不是绝对的)
2、关于Eliminate
group by 没有进行eliminate操作,distinct有进行这样的操作。
(in、not in、unique、distinct操作会去重)
1、适用情况:
Group by 先在本AMP上分组,然后在在Globally上分组
Distinct 是先把数据分布到All AMP上在去重。
所以,在重复值比较多的情况下,Group by 能提高点性能,其他情况下,Distinct比较快点。(不是绝对的)
2、关于Eliminate
group by 没有进行eliminate操作,distinct有进行这样的操作。
(in、not in、unique、distinct操作会去重)
5、Date
TD中,日期以数字来存储。如2009-09-09在数据库中被转换为20090909,在数据库中存储过数字10090909(20090909-19000000)
如果时间小于19000000则在数据库中存储为负值。
SELECT EXTRACT(YEAR FROM DATE '2004-03-31') ||
EXTRACT(MONTH FROM DATE '2004-03-31')
result: 2004 3
整数转换为11位字符在||
TD中,日期以数字来存储。如2009-09-09在数据库中被转换为20090909,在数据库中存储过数字10090909(20090909-19000000)
如果时间小于19000000则在数据库中存储为负值。
SELECT EXTRACT(YEAR FROM DATE '2004-03-31') ||
EXTRACT(MONTH FROM DATE '2004-03-31')
result: 2004 3
整数转换为11位字符在||
No comments:
Post a Comment