- 浏览: 562855 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (350)
- Sybase (30)
- SQL SERVER2005 (14)
- 数据库 (27)
- SSH框架 (27)
- WebService (21)
- 下载-软件收藏 (15)
- 随笔-日常使用 (9)
- Flex 相关 (13)
- Linux (11)
- Web (64)
- XML相关 (9)
- Socket相关 (1)
- Elipse (3)
- 统计报表 (11)
- 线程相关 (3)
- Java相关 (37)
- JAVASCRIPT (19)
- JAVA反射 (3)
- JSP标签 (3)
- 随笔-其他 (2)
- 随笔-设计模式 (3)
- 随笔-架构师相关 (1)
- 下载-源码 (7)
- 下载-帮助文档 (1)
- 下载-插件 (6)
- 技术-.NET (2)
- 技术-Excel VBA (8)
- 应用-地图相关 (2)
- 应用-GSM短信猫 (5)
- 应用-单点登录 (3)
- Android相关 (3)
最新评论
-
sucheng2016:
发现jconn4.jar 里面有getBlob(String) ...
Sybase15驱动包的问题com.sybase.jdbc3.jdbc.SybDriver -
sucheng2016:
java.lang.UnsupportedOperationE ...
Sybase15驱动包的问题com.sybase.jdbc3.jdbc.SybDriver -
ok123zxx:
没下文了吗
通过 Tomcat Advanced I/O 获得高性能的 Ajax tocmat6+CometProcessor -
q1345111:
大家这个问题 尚未完成方法 com.sybase.jdbc3. ...
Sybase15驱动包的问题com.sybase.jdbc3.jdbc.SybDriver -
bdk82924:
heshujing217187 写道问题同1楼一样,求解!换j ...
Sybase15驱动包的问题com.sybase.jdbc3.jdbc.SybDriver
转:http://blog.csdn.net/andkylee/article/details/5638033
本篇介绍三种方法。
第一种:利用游标
程序开发人员比较喜欢使用游标,因为游标的“循环”遍历方式类似编程语言中的for,while,loop语句的实现方法,写起来比较容易。使用游标一般步骤是:为指定的SQL语句定义一个游标,打开并移动游标,当移动到指定行号的记录行之后,再按照需要提取的行数来取数据。从表面上看解决了提取指定范围数据的问题;但是在实际应用 上,有可能会出现严重的性能问题。建立游标需要耗用一定的系统资源之外;当表内的数据量有上千万甚至到亿级别并且需要取大量的数据结果时,用游标每移动一次就取这行数据,然后再移动游标,这个过程将是缓慢的。在使用游标的过程中,系统会给相应的表加上共享锁,导致锁竞争而严重影响数据库的性能。
在此不再介绍游标的实现方式,此法比较简单。
第二种:利用临时表和标志列
在Sybase ASE12.5.3及以后的版本中,我们可以用top关键字来限定只返回结果集的前N行数据。在ASE12.5.3之前的版本中只能用set rowcount N 的方法来“曲线救国”了。
对于取结果集的第N行至第N+M行数据的要求,我们考虑利用top来实现的话,比较容易想到的是:执行两次top,再加l两次倒序排序。
步骤如下:
(1) select top N+M * from table_name where_clause order by ID 把此结果集派生为表:table_name1
(2) select top M * from table_name1 order by ID DESC 把此结果集派生为表:table_name2
(3) select * from table_name2 order by ID DESC
上面的3条语句好像能够实现返回第N行至第N+M行数据的要求。但是,在Sybase ASE中仅仅利用派生表而不利用临时表是不能实现这个要求的。
仅仅是ASE中的“派生出派生表(derived table)的SQL语句中不能含有order by 子句”这个限制就足以使上面的方法行不通。还有一个限制是,上面的3个步骤中都利用ID列进行排序。如果表中没有可用的排序列时,那么上述方法也不能用了。不过幸运的是,一般要求对其结果集进行分页的表都是有可以用作排序的列的(数字型或者日期型)。
继续寻找一个能用的方法,下面着重介绍目前通用的ASE的分页思路。此思路的关键是产生identity自增列和临时表。
在ASE中大家要是找到了不用临时表就可以实现分页的方法请麻烦告诉我一声。 我尝试了很多次,都不是很理想。
概括起来主要语句有两条:
(1) select syb=identity(10),* into #temp_table from table_name where_clause order_by_clause
(2) select * from #temp_table where_clause and syb >= N and syb <= N+M
用一个例子演示一下:
(1) 建立测试表:testA
- create table testA(id int not null,name varchar(30) null)
- go
(2) 插入测试数据
- insert into testA
- select 1,'liuzhenfu'
- go
- insert into testA
- select 2,'andkylee'
- go
(3) 循环插入大量的重复数据,
- insert into testA
- select id+(select max(id) from testA),name from testA
- go 15
向表testA循环插入已有的数据,15次之后,表testA内的数据达到2^16 = 65536 行。
(4) 利用临时表 + 自增标志列来提取第100行至第200行的数据。
语句如下:
select syb=identity(10) ,* into #tempA from testA
select * from #tempA where syb>=100 and syb<=200
drop table #tempA
返回的结果为:
- 1> select syb=identity(10),* into #tempA from testA
- 2> select * from #tempA where syb>=100 and syb<=200
- 3> go
- (65536 rows affected)
- syb id name
- ------------- ----------- ---------------------------
- 100 100 andkylee
- 101 101 liuzhenfu
- 102 102 andkylee
- 103 103 liuzhenfu
- 104 104 andkylee
- 105 105 liuzhenfu
- 106 106 andkylee
- 107 107 liuzhenfu
- 108 108 andkylee
- 109 109 liuzhenfu
- 110 110 andkylee
- 111 111 liuzhenfu
- 112 112 andkylee
- 113 113 liuzhenfu
- 114 114 andkylee
- 115 115 liuzhenfu
- 116 116 andkylee
- 117 117 liuzhenfu
- 118 118 andkylee
- 119 119 liuzhenfu
- 120 120 andkylee
- 121 121 liuzhenfu
- 122 122 andkylee
- 123 123 liuzhenfu
- 124 124 andkylee
- 125 125 liuzhenfu
- 126 126 andkylee
- 127 127 liuzhenfu
- 128 128 andkylee
- 129 129 liuzhenfu
- 130 130 andkylee
- 131 131 liuzhenfu
- 132 132 andkylee
- 133 133 liuzhenfu
- 134 134 andkylee
- 135 135 liuzhenfu
- 136 136 andkylee
- 137 137 liuzhenfu
- 138 138 andkylee
- 139 139 liuzhenfu
- 140 140 andkylee
- 141 141 liuzhenfu
- 142 142 andkylee
- 143 143 liuzhenfu
- 144 144 andkylee
- 145 145 liuzhenfu
- 146 146 andkylee
- 147 147 liuzhenfu
- 148 148 andkylee
- 149 149 liuzhenfu
- 150 150 andkylee
- 151 151 liuzhenfu
- 152 152 andkylee
- 153 153 liuzhenfu
- 154 154 andkylee
- 155 155 liuzhenfu
- 156 156 andkylee
- 157 157 liuzhenfu
- 158 158 andkylee
- 159 159 liuzhenfu
- 160 160 andkylee
- 161 161 liuzhenfu
- 162 162 andkylee
- 163 163 liuzhenfu
- 164 164 andkylee
- 165 165 liuzhenfu
- 166 166 andkylee
- 167 167 liuzhenfu
- 168 168 andkylee
- 169 169 liuzhenfu
- 170 170 andkylee
- 171 171 liuzhenfu
- 172 172 andkylee
- 173 173 liuzhenfu
- 174 174 andkylee
- 175 175 liuzhenfu
- 176 176 andkylee
- 177 177 liuzhenfu
- 178 178 andkylee
- 179 179 liuzhenfu
- 180 180 andkylee
- 181 181 liuzhenfu
- 182 182 andkylee
- 183 183 liuzhenfu
- 184 184 andkylee
- 185 185 liuzhenfu
- 186 186 andkylee
- 187 187 liuzhenfu
- 188 188 andkylee
- 189 189 liuzhenfu
- 190 190 andkylee
- 191 191 liuzhenfu
- 192 192 andkylee
- 193 193 liuzhenfu
- 194 194 andkylee
- 195 195 liuzhenfu
- 196 196 andkylee
- 197 197 liuzhenfu
- 198 198 andkylee
- 199 199 liuzhenfu
- 200 200 andkylee
- (101 rows affected)
需要将select * from #tempA中的星号*替换为需要返回的列名。
继续。。。。
当要求返回满足name='andkylee'的所有行中的第100行至第200行的数据时, 利用
select syb=identity(10),* into #tempA from testA where name='andkylee'
select * from #tempA where syb>=100 and syb<=200
drop table #tempA
第三种:利用rowcount
此种方法有点不足:必须利用可用作排序的列 对结果集进行排序。
还是上面的测试表testA,如果从第9000行开始选择10行数据,那么语句如下:
declare @id1 int
set rowcount 9000
select @id1 = id from testA order by id
set rowcount 10
select *from testA where id >= @id1 order by id
set rowcount 0
go
此种方法中核心语句是select @id1=id from testA order by id , 在对表testA执行查询的过程中,每读取一行都会把id列的值赋给@id1这个变量,一直持续到最后一行,@id1这个变量反复被下一行的id值刷新,结果只得到最后一样的id值。如果在此select语句之前加上rowcount的限定,那么就可用使得@id1这个变量获得第rowcount行的id值,那么我们也就获得了返回范围结果集的起点了。
后面的 set rowcount 10
select * from testA where id >= @id1 order by id
这两句实际上可以用一句select top 10 * from testA where id >= @id1 order by id 来替代。
这样,两种不同的实现形式为:
declare @id1 int
set rowcount 9000
select @id1 = id from testA order by id
set rowcount 0
select top 10 *from testA where id >= @id1 order by id
go
分别看看执行结果吧。
- 1> declare @id1 int
- 2> set rowcount 9000
- 3> select @id1 = id from testA order by id
- 4> set rowcount 10
- 5> select *from testA where id >= @id1 order by id
- 6> set rowcount 0
- 7> go
- (9000 rows affected)
- id name
- ----------- ------------------------------
- 9000 andkylee
- 9001 liuzhenfu
- 9002 andkylee
- 9003 liuzhenfu
- 9004 andkylee
- 9005 liuzhenfu
- 9006 andkylee
- 9007 liuzhenfu
- 9008 andkylee
- 9009 liuzhenfu
- (10 rows affected)
- 1>
第二种方式的结果:
- 1> declare @id1 int
- 2> set rowcount 9000
- 3> select @id1 = id from testA order by id
- 4> set rowcount 0
- 5> select top 10 *from testA where id >= @id1 order by id
- 6> go
- (9000 rows affected)
- id name
- ----------- ------------------------------
- 9000 andkylee
- 9001 liuzhenfu
- 9002 andkylee
- 9003 liuzhenfu
- 9004 andkylee
- 9005 liuzhenfu
- 9006 andkylee
- 9007 liuzhenfu
- 9008 andkylee
- 9009 liuzhenfu
- (10 rows affected)
- 1>
当然,两种结果一模一样。
最后我们测试表testA中的ID列顺序值打乱, 来看看以上语句的执行情况。执行:
- update testA set id = id + cast( rand() * 65536 as int )
ID列值打乱之后,前100行的数据为:
- 1> select top 100 * from testA
- 2> go
- id name
- ----------- ------------------------------
- 51366 liuzhenfu
- 33573 andkylee
- 19447 liuzhenfu
- 19408 andkylee
- 57839 liuzhenfu
- 18817 andkylee
- ......................
- 19075 liuzhenfu
- 17081 andkylee
- 26444 liuzhenfu
- 6620 andkylee
- 52344 liuzhenfu
- 49348 andkylee
- (100 rows affected)
我们要求返回满足name='andkylee'的从第9000行开始的10行数据。
declare @id1 int
set rowcount 9000
select @id1 = id from testA where name='andkylee' order by id
set rowcount 10
select *from testA where name='andkylee' and id >= @id1 order by id
set rowcount 0
go
结果为:
- 1> declare @id1 int
- 2> set rowcount 9000
- 3> select @id1 = id from testA where name='andkylee' order by id
- 4> set rowcount 10
- 5> select *from testA where name='andkylee' and id >= @id1 order by id
- 6> set rowcount 0
- 7> go
- (9000 rows affected)
- id name
- ----------- ------------------------------
- 48639 andkylee
- 48639 andkylee
- 48641 andkylee
- 48641 andkylee
- 48642 andkylee
- 48643 andkylee
- 48644 andkylee
- 48644 andkylee
- 48650 andkylee
- 48650 andkylee
- (10 rows affected)
如果不对ID列进行排序, 有下面的sql语句:
declare @id1 int
set rowcount 9000
select @id1 = id from testA where name='andkylee'
set rowcount 10
select *from testA where name='andkylee' and id >= @id1
set rowcount 0
go
相应的结果集为:
- 1> declare @id1 int
- 2> set rowcount 9000
- 3> select @id1 = id from testA where name='andkylee'
- 4> set rowcount 10
- 5> select *from testA where name='andkylee' and id >= @id1
- 6> set rowcount 0
- 7> go
- (9000 rows affected)
- id name
- ----------- ------------------------------
- 74076 andkylee
- 74514 andkylee
- 74053 andkylee
- 74385 andkylee
- 74339 andkylee
- 74792 andkylee
- 74794 andkylee
- 74984 andkylee
- 75052 andkylee
- 74138 andkylee
- (10 rows affected)
- 1>
可以发现这个两句的结果是不同的。
我想既然都要求返回指定范围的结果集, 肯定是有排序的依据了, 否则怎么知道该返回哪个范围呢?
还有,我给出的第三种方法,在进行表扫描的时候,即使不指定排序,也是能够得到正确结果的。因为表扫描时很可能会按照表内数据在物理页面上的物理位置来返回结果。
发表评论
-
Mysql 的语法
2015-05-17 20:54 5301、启动 停止 bin/mysql.server star ... -
DbUtils的使用
2013-01-28 19:56 1248DbUtils的使用 今天在看一段源码的时候,看到了可以使用 ... -
NoSQL非关系型数据库
2013-01-22 15:39 934转:http://baike.baidu.com/view/2 ... -
mysql 导入导出函数、存储过程
2012-06-22 16:20 2939mysql常用导出数据命令: 1.mysql导出整个数 ... -
JDBC分页工具类
2012-02-01 15:37 1178转自:http://xdwangiflytek.iteye.c ... -
几种数据库的SQL判断表是否存在
2012-02-01 15:35 946Oracle: declarevar_exis ... -
Oracle中实现分页的方法 .
2011-12-12 09:27 1350转:http://blog.csdn.net/andkylee ... -
Oracle的定时任务创建
2011-09-09 13:02 941drop sequence s_CarInfoID ... -
数据库下载地址 更新中....
2011-08-02 13:49 822ORACLE 下载(官网) http://www.oracl ... -
Java 调用 Oracle 存储过程返回结果集
2011-07-07 20:01 1450转自:http://wxy0327.itpub.net/ ... -
HugeTable 连接
2011-07-05 13:20 1057JAVA连接HugeTable的代码如下 ... -
Hsqldb安装与使用
2011-07-04 19:45 1089转自:http://fengyongfa2006.blog.1 ... -
SQL语句修改字段类型报错
2011-05-06 10:03 1989Sybase 12.5数据库执行 alter ta ... -
转SQL Server 存储过程的经典分页
2010-06-22 19:18 1322转自:http://www.iteye.com/topic/2 ... -
MySql数据库
2010-06-05 14:33 9481、安装 正在使用5.1版本 ,下载地址 ... ... -
Linux下启动Sybase ASE和IQ
2010-02-01 10:01 4676启动和关闭Sybase ASE sybase@*** ... -
Oracle Win自动备份数据BAT文件
2009-12-21 22:24 1455@echo off REM ################ ... -
Oracle常用及非常用函数
2009-09-22 16:47 802转自: http://wangyu.iteye.com/blo ... -
JDBC使用addBatch一次插入 万条数据
2009-09-22 16:26 2245public class Conn { pub ... -
Linux下启动Oralce
2009-09-22 14:45 899su - oracle sqlplus /nolog ...
相关推荐
通过ASE插件,Unity开发者可以更轻松地实现复杂的图形效果,比如屏幕空间反射、体积光照、次表面散射等高级技术,而不需要深入研究底层的图形学原理。同时,ASE的易用性和灵活性也使得它成为Unity项目中提升图形质量...
Unity插件ASE,全称Amplify Shader Editor,是一个强大的Unity专用水晶 shader 编辑器,版本号1.8.9.035。它为Unity开发人员提供了一个...通过熟练掌握ASE,你可以在游戏中实现独特的视觉效果,提升整体的用户体验。
5. **数据分析和可视化**:ASE提供了分析和可视化工具,如轨迹分析、能量分布计算、结构优化后的几何形状展示等,便于用户理解和解释模拟结果。 6. **可扩展性**:由于ASE是基于Python的,用户可以利用Python的强大...
- **简介**: ASE 15.0 提供了全面的数据加密功能,可以在数据库级别或列级别实现加密保护,确保敏感信息的安全。 - **应用场景**: 银行、金融等行业中,存储客户个人信息等高敏感度数据时,加密技术是必不可少的...
1. **实用程序指南**:这部分内容详细介绍了ASE15中的各种管理和维护工具,如SQL Server Management Studio (SSMS) 的对应功能,可能包括数据库备份、恢复、性能监控、查询优化等实用工具的使用方法。通过这本指南,...
在3DsMax中,ASE(ASCII Scene Export)文件是一种用于交换3D模型数据的文本格式。这种文件格式是由Autodesk开发的,目的是为了让用户能在不同的3D软件之间方便地导入和导出场景数据,比如3DsMax、Maya、Softimage等...
Sybase ASE 15.7 开发文档:Web 服务用户指南 第 1 部分 简介 第 1 章 了解 Adaptive Server Enterprise Web 服务 .......... 3 概述 .......... 3 Adaptive Server Enterprise Web 服务 .......... 4 ASE Web 服务...
Sybase ASE 15.7 开发文档:系统管理指南(卷一)共两卷 第 1 章系统管理概述 .......... 1 Adaptive Server 管理任务 .......... 1 系统管理任务所需的角色 .......... 2 使用 isql 执行系统管理任务 .......... 4 ...
6. **数据处理与可视化**:MATLAB强大的数据分析和可视化功能可以帮助我们理解ASE与不同参数之间的关系,通过绘制图表来直观展示结果。 在"ASE.zip"压缩包中,包含了可能的MATLAB源代码或脚本,用于模拟和计算ASE。...
在ASE中,TDE通常通过使用证书或密钥对来实现,确保只有拥有正确密钥的用户才能解密并访问数据。 2. **ASE的表和列加密**:ASE还支持对表中的特定列进行加密,以满足更细粒度的安全需求。这种加密方式允许敏感数据...
Unity ASE插件,全称Amplify Shader Editor,是一款强大的...通过下载并导入"Amplify Shader Editor 1.8.9.035.unitypackage"文件,你将能够将这些功能集成到你的Unity项目中,从而实现更为精细和生动的游戏视觉体验。
ASE中的JAVA.pdf HA_故障切换.pdf Historical Server.pdf Job Scheduler.pdf Monitor Client.pdf Monitor Server.pdf T-SQL用户指南.pdf WEB服务.pdf XML服务.pdf 全文本搜索引擎.pdf 分布式事务管理.pdf 参考手册-...
ASE(Advanced Security Engine)是一种强大的数据加密算法,广泛应用于各种软件和系统中,尤其是需要跨平台数据安全交互的场景。本篇文章将详细讲解如何在Java和.NET平台上利用ASE加密机制实现双语加解密,并介绍...
jConnect for JDBC支持高级功能,如事务管理、结果集处理、批量更新等,极大地简化了数据库操作的复杂度。 ##### 3. Java集成工具 ASE 15.0还提供了一系列工具,帮助Java开发者更高效地与数据库交互。这些工具包括...
- ASEReplicator 能够将主数据库的数据变化自动同步到一个或多个副本数据库中,从而实现数据分布和高可用性。 2. **与ReplicationServer的口令兼容性**: - ASE 15.5 ESD#1 改进了与ReplicationServer的口令兼容...
- 字符集转换失败通常由于不兼容的字符集设置导致,解决方法包括检查和调整服务器、客户端的字符集配置,或在传输数据时进行正确的转换。 掌握这些概念和技术对于在Sybase ASE环境下进行软件开发至关重要,特别是...
Sybase Adaptive Server Enterprise(ASE)是一款强大的关系型数据库管理系统,其中字符集的配置和管理对于数据的正确存储和处理至关重要。本文将深入探讨字符集、排序顺序以及字符集转换这三个核心概念。 1. **...
限制结果集的大小 .......... 13 设置 tempdb 空间使用限制 .......... 14 限制空闲时间 .......... 14 创建资源限制 .......... 14 资源限制示例 .......... 15 获得关于现有限制的信息 .......... 16 列出所有现有...