分类:
2012-02-15 10:50:06
原文地址:Sybase IQ数据库SQL开发的一些建议 作者:lion_sybiq_127
最近有些时间整理了一些有关IQ 数据库SQL开发的一些建议,这些建议有些来自于Sybase公司的资料,有些来自于实际用户支持的案例,与Sybase IQ数据库开发人员分享,希望大家能够开发出优秀的应用系统。
1. IQ中数据装载最快的方法是使用LOAD TABLE语句;不要使用bcp in往IQ数据库中导入数据(速度很慢)。
2. IQ数据导出最快、最灵活的方式是使用Server端Export方法(到处数据文件需要存放在IQ Server端);可以使用BCP OUT导出数据,但性能要比export方法差一些,但这种方法可以把到导出的数据文件存放在客户端)。
3. 代理表方面的建议
(1) 不要在IQ本地表和IQ中的代理表之间进行join,这样性能会很差。
(2) 可以先通过代理表把数据写入本地表,然后再join
(3) 如果网络带宽较好,可以使用代理表和INSERT LOCATION技术,不过最好不要用于传递大量 数 据。
4. DDL语句建议
(1) 创建索引
a.对于IQ来说,建议在数据加载之前就建立需要的索引(与ASE的BCP IN不同).
b.带有索引加载时,对性能影响很小。如果在装载数据之后再创建索引,所需的时间要加长。为了加快索引创建,可以采用“并行”方式建立索引
(2) 不要频繁、持续的创建删除数据库对象(表、视图等),这样会导致.db文件较快增长,从而影响数据库性能
5. 事物处理注意事项
(1) IQ采用链式模式, 注意commit之后才能看到最新数据。
(2) 有可能尽快commit以便释放事物占用的资源
(3) IQ采用的是表级锁,注意并发问题
6. SELECT语句
(1) select语句应该只选取需要的字段,尽量不要使用select *。这样可以减小不必要的I/O操
(2) 聚集/分组
a.GROUP BY 子句中有多个字段,如果可以的话,按唯一值的数目降序,从左到有右列出这些列,将提供较好的查询性能
b.在分组字段上创建LF或HG索引
c.在一些情况下在group keys上创建多字段HG索引能够提高速度
(3) Join字段上的索引
Join字段上应该建立hg或lf索引,以便为优化器提供优化统计信息;此外有可能采用pushdown join提高查询速度
(4) Join字段类型
a.Join字段应该是相同数据类型
b.无符号整型效率最好
(5) Join算法
a.大表和中表、中小表hash join较优
b.Hash pushdown join(join字段上有HG或LF索引),能够在join操作之前提前对大表记录进行过滤,能够提高性能
c.数据库选项Max_Hash_Rows控制采用hash算法的行数
d.大表和大表,sort merge join较好
e.Sort merge pushdown join,能够在join操作之前提前对大表记录进行过滤,能够提高性能
f.Join算法由优化器进行选择,也可以通过数据库选项进行控制:Join_Preference
(6) 创建新的字段(数据冗余的技术)以避免String Searches
如果用户的很多查询中在多个表达式中都使用相同字节的字符串,例如: SUBSTR(part_no, 1, 4),那么应该考虑为它创建新的字段。并且在字段上创建LF或HG索引。因为使用LF或HG索引比使用SUBSTR函数更快,SUBSTR函数通常需要在整个FP索引上进行扫描处理。
(7) 系统函数
a.在使用系统函数时要注意其是否有IQ的ASA引擎处理,这可以查一下IQ的参考手册有关函数的部分
b.如果函数是由ASA处理,特别是对于大数据量的情况,会导致性能问题。
例如:isnumeric函数。这个函数是由ASA引擎执行处理的。如果它作用在具有很多条记录的字段上,由于ASA在处理这个函数时需要使用内存,而IQ中控制ASA内存分配的参数(-c, -cl/ch),一般不会设置比较大,会造成ASA会在$ASTMP环境变量指定的文件系统目录下使用大量空间作为“虚拟交换空间”缓存数据,导致性能下降并会占用大量文件系统空间。