Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1634464
  • 博文数量: 201
  • 博客积分: 2812
  • 博客等级: 少校
  • 技术积分: 3029
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-18 18:28
个人简介

从事数据库工作多年,目前看好分布式NeSQL/HTAP数据库在企业客户市场的发展。未来的主要方向是——致力于 NewSQL/HTAP 数据库的推广普及。

文章存档

2016年(1)

2015年(8)

2014年(23)

2013年(50)

2012年(32)

2011年(87)

分类: Sybase

2012-02-12 08:45:53

   最近有些时间整理了一些有关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环境变量指定的文件系统目录下使用大量空间作为“虚拟交换空间”缓存数据,导致性能下降并会占用大量文件系统空间。

阅读(5864) | 评论(5) | 转发(1) |
给主人留下些什么吧!~~

lion_sybiq_1272015-06-17 13:16:40

zhongxuchen:建议可以整理一个iq window下安装的教程,作为开发者比较关注数据库的使用,而不是数据库的安装,所以希望在window上临时搭建一个环境进行相关功能的验证。

你好,IQ 在windows上安装是图形化界面。按提示一步一步做较容易安装。创建数据库什么的基本上是使用sql命令,执行sql命令可以使用dbisql

回复 | 举报

lion_sybiq_1272015-06-17 13:15:31

zhongxuchen:咨询一下iq 好像不支持merge into 这种语法呀

你好,IQ目前还不支持merge inot语法。只能自己写SQL实现了。

回复 | 举报

zhongxuchen2015-04-26 12:32:34

建议可以整理一个iq window下安装的教程,作为开发者比较关注数据库的使用,而不是数据库的安装,所以希望在window上临时搭建一个环境进行相关功能的验证。

zhongxuchen2015-04-26 12:31:20

咨询一下iq 好像不支持merge into 这种语法呀

坏坏小丸子2012-02-15 11:06:54

不要在IQ本地表和IQ中的代理表之间进行join,这样性能会很差?
为社么会这样那、、??