SYBASE-IQ知识整理-12.7

2018-11-10 21:15

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;


SYBASE-IQ知识整理-12.7.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:《金版学案》2016届高考英语北师大版一轮复习课时作业:语言朋友

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: