String( string1 [, string2, ..., string99 ] ) 如:string(‘aaa’,’bbb’,12345); 结果:aaabbb12345
子字符串函数
Substring ( string-expr, integer-expr [, integer-expr ] ) 例如:
substring('123456789',8,-6); 结果:345678
Substring(‘123456789’,3,4) 结果:3456
替换函数
REPLACE ( original-string, search-string, replace-string ) 例如:
Replace(‘12345ABCD789’,’ABCD’,6) 结果: 123456789
11 故障排除(添加中)
11.1 insert thrashing detected 或者
thrashingdetected
执行以下一项或多项操作可为查询提供执行所需的资源: ? ? ? ? ?
通过增大 HASH_THRASHING_PERCENT 的值来放宽分页限制。
增加临时高速缓存(仅限 DBA)的大小。请切记,增加临时高速缓 存的大小会减少主高速缓存的大小。
对于此语句,尝试确定 Sybase IQ 错误估计一个或多个散列大小的原 因并缓解该错误估计所产生的后果。
Hash find
? 减少数据库选项 HASH_PINNABLE_CACHE_PERCENT 的值。
11.2 ASA Error -1009134: Insufficient buffers for sort.
这个错误的意思是需要增加排序的buffer空间; 检查一下内容:
1、set option public.query_temp_space_limit=0; //是否设置为0
2、大型查询语句中是否有order by的字段,如果有要建hg索引,否则很消耗内存的 3、修改iq启动的cfg文件,一般默认是params.cfg文件,将里面的iqmt和iqtc的数值加大。
4、检查iq高速缓存的分区数量是否恰当。用命令SET OPTION \改变高速缓存的分区数量。具体的分区数量有cpu个数决定(默认为8个cpu一个分区)
5、如果上面的都无效,有可能是由于服务器的内存不够,或者是由于数据库正在执行垃圾处理等清理工作(反映在一天只在某个特定时间出现这种情况)。这样是没办法从数据库层面调整了,可以尝试用增加内存等方式解决。
11.3 Multiplex出现other version 数值过大
这个是最常见的问题了。
11.4 删除数据库中损坏的表
由于某种原因,IQ数据库中的表出现损坏不能访问,并且可能使用drop table语句也不能把它删除。对于这样的表,当我们访问它时IQ会报如下错误:
ASA Error -1009039: main Bufman: Incorrect page header read; buffer={btype=14,nlb=16,blk=992,pbn=992,npb=16,uid=562,txn=1829,sp=0,flgs=0xc08}
page={btype=0,nlb=0,npb=0,ctr=0,cta=0,pbn=0,txn=0,sp=0,ver=0,pb=0,pus=0}. -- (s_buf.cxx 1140)
Msg: 21, Level: 14, State: 0 Line: 0 当发生这样的问题,我们打算删除损坏的表时该如何操作呢?下面介绍一下具体的方法和步骤(适用于IQ 12.6和IQ 12.7): (1) 重启服务器
start_asiq -n bad_db_server -x 'tcpip{port=xxx}' -gm 1 -gd dba bad_db.db 在这个命令行中,-gm 1仅仅允许一个用户做连接,-gd只允许DBA访问。当强制删除对象时,必须禁止其他用户连接。
说明:bad_db_server即出现损坏的IQ Server,其名称为.cfg文件中-n参数指定的引擎名
bad_db.db即出现损坏IQ数据库的catalog db名称 (2) 打开临时选项FORCE_DROP为ON:
set temporary option FORCE_DROP = 'ON'
(3) 删除所有不一致对象
使用DROP TABLE损坏的表。在重新启动服务器之前不要执行任何其他的DDL或者DML命令。
(4) 重新启动服务器
可以用-iqdroplks选项重新启动服务器,以恢复泄露的空间并把分配映射图
(allocation map)修改到正确状态。
start_asiq -n bad_db_server -x 'tcpip{port=xxx}' -iqdroplks bad_db bad_db.db 您需要指定两次数据库名称,前者是-iqdroplks选项使用的,后者指定您要启动的数据库。
(5) 运行sp_iqcheckdb
sp_iqcheckdb 'allocation database'。
这个步骤用计算出来的分配映射图重新设置数据库分配映射表。 如果上面的存储过程执行没有错误出现,它将显示“Freelist Updated”信息,表明已经完成泄露空(leaked space)间的恢复
(6) 发出一个checkpoint 即执行checkpoint语句
(7) 使用通用方式停止服务器
(8) 使用正常方式启动服务器,启动后即可进行正常操作。
11.5 使用强制模式恢复数据库
有时由于IQ Server异常Crash或者使用kill -9被终止之后,再次启动时有可能会报错不能启动。这时,我们可以使用IQ的强制恢复模式启动IQ数据库。在使用这种方法之前注意如下事项:
(1) 确认IQ数据库最近是否进行过备份,备份是否完好
(2) 在操作之前和重要步骤之后都要备份.db和.log文件,以防不测! 下面是这种方法的操作步骤:
(1) 用OS的cp命令备份.db 和 .log文件到其他的文件系统 (2) 使用如下方式启动IQ数据库
start_asiq -gm 1 -gd DBA @mp2.cfg -iqfrec mp2 mp2.db
(3) 使用stop_asiq停止IQ Server,然后备份.db和.log文件 (4) 使用如下方式再次启动IQ数据库
start_asiq -gm 1 -gd DBA @mp2.cfg -iqdroplks mp2 mp2.db (5) 执行sp_iqcheckdb 'allocation database'
如果执行完后显示\Updated\消息表示dbcc检查成功。如果发现错误,那么返回\和\
(6) 使用stop_asiq停止IQ,然后备份.db和.log (7) 以正常方式启动
start_asiq @mp2.cfg mp2.db
11.6 删除损坏的数据库空间
1. 说明
如果存放用户数据的dbspace发生损坏,那么IQ在启动时可以把这个损坏的dbspace标识为Offline状态,IQ Server仍然能够启动(如果IQ_SYSTEM_MAIN发生损坏,IQ 将不能启动)。在启动之后,其它完好的dbspaces仍然可以被用户访问。 如果损坏的dbspace不能修复、需要重建的话,那么需要先删除它。如果损坏的dbspace上有用户数据,那么需要把存放在这个dbspace中的所有对象删除之后才能删除它。 删除损坏dbspace中的表不能采用通常的方法,因为dbspace已损坏不能简单的执行drop table语句。下面将介绍删除的步骤(切记不是万不得已的话千万不要这样做!) 2. 删除步骤 (1) 重启服务器 例如:
start_asiq -gm 1 -gd dba @mp2.cfg mp2.db
在这个命令行中,-gm 1仅仅允许一个用户做连接,-gd只允许DBA访问。当强制删除对象时,必须禁止其他用户连接。 (2) 打开临时选项FORCE_DROP为ON:
set temporary option FORCE_DROP = 'ON'
(3) 强制删除表(假设损坏的dbspace是MP2_MAIN_CURR)
使用DROP TABLE强制删除损坏的表。在重新启动服务器之前不要执行任何其他的DDL或者DML命令!
查看MP2_MAIN_CURR的表可以使用:
sp_iqdbspaceinfo MP2_MAIN_CURR --表多的时候很慢 或者
select creator,tname from SYSCATALOG where dbspacename = 'MP2_MAIN_CURR' and tabletype='TABLE';
为了生成删除所有表的语句,可以使用如下语句:
select 'drop table ' || '\';' from SYSCATALOG where dbspacename = 'iq_main' and tabletype='TABLE';
(4) 重新启动服务器
例如: start_asiq -gm 1 -gd dba @mp2.cfg mp2.db (5) 运行sp_iqcheckdb
sp_iqcheckdb 'dropleaks dbspace MP2_MAIN_CURR' (6) 发出一个checkpoint 即执行checkpoint语句
(7) 使用正常方式停止服务器
(8) 使用正常方式启动服务器,启动后即可进行正常操作。
(9) 执行 select DBSpaceName, OkToDrop from sp_iqdbspace('MP2_MAIN_CURR') 如果OkToDrop显示为Y,则可以执行如下命令删除dbspace drop dbspace MP2_MAIN_CURR
checkpoint
(10) 重新创建CAS_MAIN_CURR
11.7 删除重复记录
下面的查询可以得到消除重复记录后的结果集
select * from test1 where rowid(test1) not in (select rowid(a) from test1 a, test1 b where rowid(a)>rowid(b) and a.id = b.id and a.name = b.name and a.age = b.age )
下面的语句可以删除表中重复的记录
delete from test1 where rowid(test1) in (select rowid(a) from test1 a, test1 b where rowid(a)>rowid(b) and a.id = b.id and a.name = b.name and a.age = b.age ); commit;
11.8 一个实现IQ结果集分页SQL查询的调优
SQL调优问题:用户的一个应用为了实现IQ数据结果集的分页,写了一个查询,用来对一个有4千多万记录的表中返回一百六十多万记录的结果集进行分页(每页100条记录)。取一页数据大约20秒左右,用户觉得太慢了。
1. 模拟问题
(1) 机器环境
用于模拟问题的机器配置如下:
Linux 4core/8G的虚拟机,CPU主频2.5GHZ IQ 版本 15.2 ESD#1
IQ CFG配置: -iqmc=1024 -iqtc=1024 (2) 数据库
采用的是TPCHDB,尺寸10GB。使用表lineitem。 lineitem表总记录数: 59986052
(3) 问题查询
drop view if exists LINEITEM_VIEW; create view LINEITEM_VIEW as select rowid(lineitem) as idd , *
from lineitem where 1=1 and l_linestatus = 'F';
SELECT * FROM ( SELECT RANK() OVER (ORDER BY idd ) rowid, * from LINEITEM_VIEW ) AS TMP WHERE TMP.rowid>0 AND TMP.rowid<=100;