Sybase ASE 系列第一讲: 数据库基础知识

Sybase ASE 数据库基础知识

准备Sybase ASE 环境

因公司业务使用的数据库是Sybase,不得不快速学习该知识。安装一个Sybase数据库我个人感觉是比较复杂的,不过网上有一个
docker镜像[chernov/sybase:latest]可以直接安装使用

docker run -d -t -p 5000:5000 -e "SYBASE_USER=guest" -h dksybase --name sybase157 chernov/sybase:latest

镜像创建好实例后,会默认有一个sa用户,它的密码是:password
你需要使用下面的命令修改密码

sp_password 'password','your new password',sa
-- sp_password是一个存储过程,后面跟三个参数,第一个参数是原密码,第二个参数是新密码,第三个参数是用户名

Sybase ASE 必须知道的基础知识

1.显示当前版本

select @@version
go
sp_version
go

2.根据条件插入数据,且表不存在

create table #order like order
go
insert into #order select * from order where order_no = 1234564
go
-- 等价于下面这条SQL
select * into #order
from order where order_no = 1234564
go

3.删除对象前先进行判断

-- 下面这种方式 是最推荐的
if object_id('sp_test') is not null
   drop proc sp_test
go

或者
if exists ( select 1 from sysobjects where name = 'sp_test' )
drop proc sp_test
go

或者
if exists (select 1 from sysobjects s inner join sysusers u
 on s.uid = u.uid and s.name = 'sp_test' and s.type = 'P'
 and u.name = 'dbo'
)
begin
  setuser 'dbo'
  drop proc sp_test
end
go

4.授权给所有人

GRANT ALL ON sample_details
TO public
GO

5.获取前10条数据

sybase 不支持分页查询,只能取前多少条,一些报表都是直接load,或者使用存储过程来处理

select top 10 * from tbl_name
go

-- 或者下面这种写法, 每次做完必须 set rowcount 0, 否则影响其他查询 
set rowcount 10
select * from tbl_name
go
set rowcount 0

索引

查看索引

-- 查看索引
sp_helpindex 表名  
-- 查看表\索引:
sp_help 表名 

查看执行计划是否走索引
分析语句执行计划是否走索引

set nocount on
set showplan on
set noexec on
go

具体SQL 语句
go
set nocount off
set showplan off
set noexec off
go

数据库事务

数据库在并发情况下,可能会造成数据的更新丢失,脏读,不可重复读,幻读。sybase使用两阶段锁协议
保证事务的隔离性和一致性,两阶段协议指锁的获取阶段和释放阶段,获取阶段包括读取数据时对数据加共
享锁,更新数据时加排他锁,释放阶段指共享锁和排他锁的释放阶段。数据库的隔离级别影响着共享锁的释放时机。

  • 更新丢失: 一个事务对数据的更改被另外一个事务覆盖
  • 脏读: 一个事务读取到另外一个事务未提交的更改
  • 不可重复读:一个事务内查询两次的结果不一致
  • 幻读: 一个事务内查询到另一个事务未提交的插入

sybase中支持四种隔离级别:

  • 级别0:更新数据时加排他锁,读取数据不加锁。不会出现更新丢失,会出现脏读、不可重复读,幻读
  • 级别1:更新数据时加排他锁,读取数据加共享锁,读取完数据释放共享锁。不会出现更新丢失,脏读,会出现不可重复读,幻读
  • 级别2:更新数据时加排他锁,读取数据加共享锁,事务结束释放共享锁。不会出现更新丢失,脏读,不可重复读,会出现幻读
  • 级别3:更新数据时加排他锁和范围锁,读取数据加共享锁,事务结束释放共享锁。不会出现更新丢失,脏读,不可重复读,幻读
-- sybase 查询当前事务隔离级别:  
select @@isolation
  • 0 读未提交
  • 1 读已提交
  • 2 可重复读
  • 3 可串行化

Sybase 事务 与 Spring 事务

Sybase 中存储过程事务是自动提交到,Spring 调用存储过程,当前不应该有事务,尽量把一个大事务拆分成小事务

Sybase ASE 使用总结

  • 1、字母大小写比对不敏感,也就是在值比对判断时大小写字母都一样;
  • 2、等值,或<>判断,系统默认对等式两边比对值去右边空格再进行比较;
  • 3、GROUP BY 可以根据SELECT字段或表达式的别名来 汇总,在编写时也尽量避免SELECT 语句的别名与FROM表中的字段有重复,不然会出现莫名其妙的错误;
  • 4、FROM后的子查询 要定义别名才可使用;
  • 5、存储过程要返回IQ系统错误信息 SQLCODE || ERRORMSG(*) :(两者都为EXCEPTION后第一条SQL语句才有效果);
  • 6、IQ中若采用 FULL JOIN 连接则不能使用 WHERE 条件,否则FULL JOIN将失效,要筛选条件则用子查询先过滤记录后再FULL JOIN;
  • 7、建表时,字段默认为非空(为空需要显示定义 field_name [data_type] null );
  • 8、UPDATE语句,如果与目标表关联的表有多条,则不会报错,而是随机取一条更新(第一条);
  • 9、因Sybase为列存储模式,在执行上INSERT语句会比UPDATE语句慢,尤其表数据越多INSERT效率就越慢;所以在ETL时建议多用UPDATE而不是INSERT
  • 10、虽说Sybase为列存储模式,每个字段上都有默认索引,但对于经常的两表的关联键还是要建立索引否则会经常报QUERY_TEMP_SPACE_LIMIT不足的错误;
  • 11、存储过程中也可以显示的执行DDL语句,这点与Oracle不同;
  • 12、空字符串''在Sybase中也是个字符而不是null值,这点要注意;
  • 13、Sybase 在插入字符串数据时,字段超过表定义长度会自动截取
  • 14、调整SESSION的临时空间SET TEMPORARY OPTION QUERY_TEMP_SPACE_LIMIT = '150000'; 15000为大小,如写0则没限制大小

未完待续...

posted @ 2022-07-11 12:53  crazy-zz5536  阅读(192)  评论(1编辑  收藏  举报