提供7*24专业Sybase数据库远程及现场技术支持,Sybase ASE及Sybase SQL Anywhere数据库修复服务,
请联系手机:(微信),QQ:289965371!
We supply technical support for Sybase ASE and Sybase SQL Anywhere, also have many years of experience in recovering data from damanged Sybase devices.
Please contact us:
Phone:
Wechat: 13811580958
QQ: 289965371

ASE中数据结果集分页功能的三种实现方法

接上篇的关于MySQL中的分页方法,本篇简单讨论在Sybase ASE中实现数据结果分页的方式。

本篇介绍三种方法。

第一种:利用游标

程序开发人员比较喜欢使用游标,因为游标的“循环”遍历方式类似编程语言中的for,while,loop语句的实现方法,写起来比较容易。使用游标一般步骤是:为指定的SQL语句定义一个游标,打开并移动游标,当移动到指定行号的记录行之后,再按照需要提取的行数来取数据。从表面上看解决了提取指 定范围数据的问题;但是在实际应用上,有可能会出现严重的性能问题。建立游标需要耗用一定的系统资源之外;当表内的数据量有上千万甚至到亿级别并且需要取大量的数据结果时,用游标每移动一 次就取这行数据,然后再移动游标,这个过程将是缓慢的。在使用游标的过程中,系统会给相应的表加上共享锁,导致锁竞争而严重影响数据库的性能。

在此不再介绍游标的实现方式,此法比较简单。一个使用游标分页的例子:sp_splitpage_by_cursor.sql

第二种:利用临时表和标志列

在Sybase ASE12.5.3及以后的版本中,我们可以用top关键字来限定只返回结果集的前N行数据。在ASE12.5.3之前的版本中只能用set rowcount N 的方法来“曲线救国”了。

对于取结果集的第N行至第N+M行数据的要求,我们考虑利用top来实现的话,比较容易想到的是:执行两次top,再加一次倒序排序。

步骤如下:

          (1) select top N+M * from table_name where_clause order by ID ASC     --把此结果集派生为表:table_name1

                  (2)   select top M * from table_name1 order by ID  DESC                          --把此结果集派生为表:table_name2

                  (3)   select * from table_name2 order by ID  ASC

上面的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

使用此方法实现ASE分页的一个存储过程为:

-- 此存储过程适用于所有版本的ASE中
use sybsystemprocs
go
if exists(select 1 from sybsystemprocs.dbo.sysobjects where type='P' and name='sp_page')
  drop procedure sp_page
go

create procedure sp_page @qry varchar(16384),@ipage int,@num int
as
begin
 
  declare @rcount int
  declare @execsql varchar(16384)
 
  select @rcount=@ipage*@num
  set @execsql = 'set rowcount '|| convert(varchar,@rcount)
  set @execsql = @execsql || stuff(@qry,charindex('SELECT ',upper(@qry)),6,' SELECT sybid=identity(12),')
  set @execsql = stuff(@execsql,charindex(' FROM ',upper(@execsql)),6,' INTO #temptable FROM ')
  set @execsql = @execsql || ' SELECT * FROM #temptable  WHERE sybid >' || convert(varchar,(@ipage-1)*@num)
  set @execsql = @execsql || ' AND sybid<=' || convert(varchar,@ipage*@num) + ' set rowcount 0'
  execute(@execsql)
 
end
go

exec sp_procxmode 'sp_page',anymode
go
grant execute on sp_page to public
go

用一个例子演示一下:

(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>

可以发现这个两句的结果是不同的。

我想既然都要求返回指定范围的结果集, 肯定是有排序的依据了, 否则怎么知道该返回哪个范围呢?

还有,我给出的第三种方法,在进行表扫描的时候,即使不指定排序,也是能够得到正确结果的。因为表扫描时很可能会按照表内数据在物理页面上的物理位置来返回结果。

就先介绍到这里吧, 后续可能会根据情况进行补充。

文件下载:

使用第二种方法在ASE实现分页的存储过程: sp_page.sql 包含top和set rowcount两种。

根据显示的当前页号进行优化处理、更通用些的存储过程:splitpage.sql

————————————————————————————————-
—- 本文为andkylee个人原创,请在尊重作者劳动成果的前提下进行转载;
—- 转载务必注明原始出处 : http://www.dbainfo.net
—- 关键字:ASE 分页  top  identity  set rowcount  temp table  自增列 伪列 临时表
————————————————————————————————-

MySQL中数据结果集分页功能的实现方法

目前B/S架构的软件大行其道。通过浏览器如何向终端用户只展示指定页面内容而不是全部的?毕竟返回全部结果集,时间和空间开销都很大。

如此情况下,对SQL返回结果集进行分页是个很不错的解决方案。

本文主要介绍MySQL数据库中的分页实现方式。我以一个数据库管理员的角度进行说明,至于具体的实现还需要开发人员详细编写过程。

总的说来,在MySQL中实现分页功能是很简单的事情。MySQL数据库的开发人员替广大的使用者着想,提供了一个关键字limit来实现限定指定范围的功能。

下面简单介绍分页的思路。

在MySQL5.0.15-nt-max下进行测试。

1.新建一张临时表(MyISAM或者InnoDB类型的都可以),本测试表没有使用自增列。

CREATE TABLE `andkylee` (
  `id` int(11) NOT NULL,
  `name` varchar(30) default NULL,
  `sex` char(1) NOT NULL,
  `age` smallint(6) default NULL,
  `note` varchar(100) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

 

2.插入测试数据。 在这里尤其介绍一种插入大量测试数据的方法。

先插入2条数据:

insert into andkylee
values(1,'hanyuliu','F',25,'aaaaaaaaaa'),(2,'andkylee','F',33,'bbbbbbbbbb');

 

批量插入数据:

在没有自增列的情况下,用下面的语句来实现插入“重复”数据。

insert into andkylee
select id+(select max(id) from andkylee),name,sex,age,note from andkylee;

 

本语句能够复制表已有的所有记录,并且能够实现“主键列”自增。

可能有点缺陷的是:需要再select列表中逐个写出各个列名。但是,好像含有自增列的表为了实现插入重复数据,也必须把非自增列都写出来吧。 如果我说的不对,请告知。

循环插入重复数据,使得表数据行数以指数方式增长。 再把已有的数据插入到表内,行数变为以前的2倍。

insert into andkylee
select id+(select max(id) from andkylee),name,sex,age,note from andkylee;

 

mysql> select count(*) from andkylee;
+----------+
| count(*) |
+----------+
|        4 |
+----------+
1 row in set (0.05 sec)

重复上面的语句,执行10次之后,表内的数据行数为:2048

测试数据情况为:

mysql> select *from andkylee;
+------+----------+-----+------+------------+
| id   | name     | sex | age  | note       |
+------+----------+-----+------+------------+
|    1 | hanyuliu | F   |   25 | aaaaaaaaaa |
|    2 | andkylee | F   |   33 | bbbbbbbbbb |
|    3 | hanyuliu | F   |   25 | aaaaaaaaaa |
|    4 | andkylee | F   |   33 | bbbbbbbbbb |
.....
| 2043 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 2044 | andkylee | F   |   33 | bbbbbbbbbb |
| 2045 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 2046 | andkylee | F   |   33 | bbbbbbbbbb |
| 2047 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 2048 | andkylee | F   |   33 | bbbbbbbbbb |
+------+----------+-----+------+------------+
2048 rows in set (0.08 sec)
 

3.选择第100至300行数据

这里不得不介绍limit这个关键字了。

limit关键字的使用方式为:

                    (SQL statement)  limit row_position,row_count

其中:(SQL statement) 为完整的SQL语句,就是普通的sql语句,以前的语句该怎么写的还是怎么写。

limit 是个关键字,在MySQL中关键字是不区分大小写的,Limit,limit,LIMIT对于数据库引擎来说都是一样的。

后面是两个参数,row_position表示起始行,更确切的说应该是偏移行,自然row_position是从0开始的。也就是说第一行的偏移行数为0.

要是想返回从第二行开始的记录,就将row_position指定为1.

第二个参数:row_count表示返回的行数。 这个很简单,不赘述。

因此,要返回第100至300行数据,需要指定偏移行号为99,并且行数为201.

语句为:

select *from andkylee LimiT 99,201;

返回结果为:

mysql> select *from andkylee LimiT 99,201;
+-----+----------+-----+------+------------+
| id  | name     | sex | age  | note       |
+-----+----------+-----+------+------------+
| 100 | andkylee | F   |   33 | bbbbbbbbbb |
| 101 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 102 | andkylee | F   |   33 | bbbbbbbbbb |
| 103 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 104 | andkylee | F   |   33 | bbbbbbbbbb |
| 105 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 106 | andkylee | F   |   33 | bbbbbbbbbb |
| 107 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 108 | andkylee | F   |   33 | bbbbbbbbbb |
| 109 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 110 | andkylee | F   |   33 | bbbbbbbbbb |
| 111 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 112 | andkylee | F   |   33 | bbbbbbbbbb |
| 113 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 114 | andkylee | F   |   33 | bbbbbbbbbb |
| 115 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 116 | andkylee | F   |   33 | bbbbbbbbbb |
| 117 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 118 | andkylee | F   |   33 | bbbbbbbbbb |
| 119 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 120 | andkylee | F   |   33 | bbbbbbbbbb |
| 121 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 122 | andkylee | F   |   33 | bbbbbbbbbb |
| 123 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 124 | andkylee | F   |   33 | bbbbbbbbbb |
| 125 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 126 | andkylee | F   |   33 | bbbbbbbbbb |
| 127 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 128 | andkylee | F   |   33 | bbbbbbbbbb |
| 129 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 130 | andkylee | F   |   33 | bbbbbbbbbb |
| 131 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 132 | andkylee | F   |   33 | bbbbbbbbbb |
| 133 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 134 | andkylee | F   |   33 | bbbbbbbbbb |
| 135 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 136 | andkylee | F   |   33 | bbbbbbbbbb |
| 137 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 138 | andkylee | F   |   33 | bbbbbbbbbb |
| 139 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 140 | andkylee | F   |   33 | bbbbbbbbbb |
| 141 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 142 | andkylee | F   |   33 | bbbbbbbbbb |
| 143 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 144 | andkylee | F   |   33 | bbbbbbbbbb |
| 145 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 146 | andkylee | F   |   33 | bbbbbbbbbb |
| 147 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 148 | andkylee | F   |   33 | bbbbbbbbbb |
| 149 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 150 | andkylee | F   |   33 | bbbbbbbbbb |
| 151 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 152 | andkylee | F   |   33 | bbbbbbbbbb |
| 153 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 154 | andkylee | F   |   33 | bbbbbbbbbb |
| 155 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 156 | andkylee | F   |   33 | bbbbbbbbbb |
| 157 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 158 | andkylee | F   |   33 | bbbbbbbbbb |
| 159 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 160 | andkylee | F   |   33 | bbbbbbbbbb |
| 161 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 162 | andkylee | F   |   33 | bbbbbbbbbb |
| 163 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 164 | andkylee | F   |   33 | bbbbbbbbbb |
| 165 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 166 | andkylee | F   |   33 | bbbbbbbbbb |
| 167 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 168 | andkylee | F   |   33 | bbbbbbbbbb |
| 169 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 170 | andkylee | F   |   33 | bbbbbbbbbb |
| 171 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 172 | andkylee | F   |   33 | bbbbbbbbbb |
| 173 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 174 | andkylee | F   |   33 | bbbbbbbbbb |
| 175 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 176 | andkylee | F   |   33 | bbbbbbbbbb |
| 177 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 178 | andkylee | F   |   33 | bbbbbbbbbb |
| 179 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 180 | andkylee | F   |   33 | bbbbbbbbbb |
| 181 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 182 | andkylee | F   |   33 | bbbbbbbbbb |
| 183 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 184 | andkylee | F   |   33 | bbbbbbbbbb |
| 185 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 186 | andkylee | F   |   33 | bbbbbbbbbb |
| 187 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 188 | andkylee | F   |   33 | bbbbbbbbbb |
| 189 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 190 | andkylee | F   |   33 | bbbbbbbbbb |
| 191 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 192 | andkylee | F   |   33 | bbbbbbbbbb |
| 193 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 194 | andkylee | F   |   33 | bbbbbbbbbb |
| 195 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 196 | andkylee | F   |   33 | bbbbbbbbbb |
| 197 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 198 | andkylee | F   |   33 | bbbbbbbbbb |
| 199 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 200 | andkylee | F   |   33 | bbbbbbbbbb |
| 201 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 202 | andkylee | F   |   33 | bbbbbbbbbb |
| 203 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 204 | andkylee | F   |   33 | bbbbbbbbbb |
| 205 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 206 | andkylee | F   |   33 | bbbbbbbbbb |
| 207 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 208 | andkylee | F   |   33 | bbbbbbbbbb |
| 209 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 210 | andkylee | F   |   33 | bbbbbbbbbb |
| 211 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 212 | andkylee | F   |   33 | bbbbbbbbbb |
| 213 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 214 | andkylee | F   |   33 | bbbbbbbbbb |
| 215 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 216 | andkylee | F   |   33 | bbbbbbbbbb |
| 217 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 218 | andkylee | F   |   33 | bbbbbbbbbb |
| 219 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 220 | andkylee | F   |   33 | bbbbbbbbbb |
| 221 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 222 | andkylee | F   |   33 | bbbbbbbbbb |
| 223 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 224 | andkylee | F   |   33 | bbbbbbbbbb |
| 225 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 226 | andkylee | F   |   33 | bbbbbbbbbb |
| 227 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 228 | andkylee | F   |   33 | bbbbbbbbbb |
| 229 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 230 | andkylee | F   |   33 | bbbbbbbbbb |
| 231 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 232 | andkylee | F   |   33 | bbbbbbbbbb |
| 233 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 234 | andkylee | F   |   33 | bbbbbbbbbb |
| 235 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 236 | andkylee | F   |   33 | bbbbbbbbbb |
| 237 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 238 | andkylee | F   |   33 | bbbbbbbbbb |
| 239 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 240 | andkylee | F   |   33 | bbbbbbbbbb |
| 241 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 242 | andkylee | F   |   33 | bbbbbbbbbb |
| 243 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 244 | andkylee | F   |   33 | bbbbbbbbbb |
| 245 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 246 | andkylee | F   |   33 | bbbbbbbbbb |
| 247 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 248 | andkylee | F   |   33 | bbbbbbbbbb |
| 249 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 250 | andkylee | F   |   33 | bbbbbbbbbb |
| 251 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 252 | andkylee | F   |   33 | bbbbbbbbbb |
| 253 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 254 | andkylee | F   |   33 | bbbbbbbbbb |
| 255 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 256 | andkylee | F   |   33 | bbbbbbbbbb |
| 257 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 258 | andkylee | F   |   33 | bbbbbbbbbb |
| 259 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 260 | andkylee | F   |   33 | bbbbbbbbbb |
| 261 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 262 | andkylee | F   |   33 | bbbbbbbbbb |
| 263 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 264 | andkylee | F   |   33 | bbbbbbbbbb |
| 265 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 266 | andkylee | F   |   33 | bbbbbbbbbb |
| 267 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 268 | andkylee | F   |   33 | bbbbbbbbbb |
| 269 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 270 | andkylee | F   |   33 | bbbbbbbbbb |
| 271 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 272 | andkylee | F   |   33 | bbbbbbbbbb |
| 273 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 274 | andkylee | F   |   33 | bbbbbbbbbb |
| 275 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 276 | andkylee | F   |   33 | bbbbbbbbbb |
| 277 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 278 | andkylee | F   |   33 | bbbbbbbbbb |
| 279 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 280 | andkylee | F   |   33 | bbbbbbbbbb |
| 281 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 282 | andkylee | F   |   33 | bbbbbbbbbb |
| 283 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 284 | andkylee | F   |   33 | bbbbbbbbbb |
| 285 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 286 | andkylee | F   |   33 | bbbbbbbbbb |
| 287 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 288 | andkylee | F   |   33 | bbbbbbbbbb |
| 289 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 290 | andkylee | F   |   33 | bbbbbbbbbb |
| 291 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 292 | andkylee | F   |   33 | bbbbbbbbbb |
| 293 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 294 | andkylee | F   |   33 | bbbbbbbbbb |
| 295 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 296 | andkylee | F   |   33 | bbbbbbbbbb |
| 297 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 298 | andkylee | F   |   33 | bbbbbbbbbb |
| 299 | hanyuliu | F   |   25 | aaaaaaaaaa |
| 300 | andkylee | F   |   33 | bbbbbbbbbb |
+-----+----------+-----+------+------------+
201 rows in set (0.00 sec)
mysql>

 

再展示一个带where条件的语句的limit使用情况。

返回name为'andkylee'的所有记录的第100至300行数据。

select *from andkylee where name='andkylee' LimiT 99,201;

结果为:

mysql> select *from andkylee where name='andkylee' LimiT 99,201;
+-----+----------+-----+------+------------+
| id  | name     | sex | age  | note       |
+-----+----------+-----+------+------------+
| 200 | andkylee | F   |   33 | bbbbbbbbbb |
| 202 | andkylee | F   |   33 | bbbbbbbbbb |
| 204 | andkylee | F   |   33 | bbbbbbbbbb |
| 206 | andkylee | F   |   33 | bbbbbbbbbb |
| 208 | andkylee | F   |   33 | bbbbbbbbbb |
| 210 | andkylee | F   |   33 | bbbbbbbbbb |
| 212 | andkylee | F   |   33 | bbbbbbbbbb |
| 214 | andkylee | F   |   33 | bbbbbbbbbb |
| 216 | andkylee | F   |   33 | bbbbbbbbbb |
| 218 | andkylee | F   |   33 | bbbbbbbbbb |
| 220 | andkylee | F   |   33 | bbbbbbbbbb |
| 222 | andkylee | F   |   33 | bbbbbbbbbb |
| 224 | andkylee | F   |   33 | bbbbbbbbbb |
| 226 | andkylee | F   |   33 | bbbbbbbbbb |
| 228 | andkylee | F   |   33 | bbbbbbbbbb |
| 230 | andkylee | F   |   33 | bbbbbbbbbb |
| 232 | andkylee | F   |   33 | bbbbbbbbbb |
| 234 | andkylee | F   |   33 | bbbbbbbbbb |
| 236 | andkylee | F   |   33 | bbbbbbbbbb |
| 238 | andkylee | F   |   33 | bbbbbbbbbb |
| 240 | andkylee | F   |   33 | bbbbbbbbbb |
| 242 | andkylee | F   |   33 | bbbbbbbbbb |
| 244 | andkylee | F   |   33 | bbbbbbbbbb |
| 246 | andkylee | F   |   33 | bbbbbbbbbb |
| 248 | andkylee | F   |   33 | bbbbbbbbbb |
| 250 | andkylee | F   |   33 | bbbbbbbbbb |
| 252 | andkylee | F   |   33 | bbbbbbbbbb |
| 254 | andkylee | F   |   33 | bbbbbbbbbb |
| 256 | andkylee | F   |   33 | bbbbbbbbbb |
| 258 | andkylee | F   |   33 | bbbbbbbbbb |
| 260 | andkylee | F   |   33 | bbbbbbbbbb |
| 262 | andkylee | F   |   33 | bbbbbbbbbb |
| 264 | andkylee | F   |   33 | bbbbbbbbbb |
| 266 | andkylee | F   |   33 | bbbbbbbbbb |
| 268 | andkylee | F   |   33 | bbbbbbbbbb |
| 270 | andkylee | F   |   33 | bbbbbbbbbb |
| 272 | andkylee | F   |   33 | bbbbbbbbbb |
| 274 | andkylee | F   |   33 | bbbbbbbbbb |
| 276 | andkylee | F   |   33 | bbbbbbbbbb |
| 278 | andkylee | F   |   33 | bbbbbbbbbb |
| 280 | andkylee | F   |   33 | bbbbbbbbbb |
| 282 | andkylee | F   |   33 | bbbbbbbbbb |
| 284 | andkylee | F   |   33 | bbbbbbbbbb |
| 286 | andkylee | F   |   33 | bbbbbbbbbb |
| 288 | andkylee | F   |   33 | bbbbbbbbbb |
| 290 | andkylee | F   |   33 | bbbbbbbbbb |
| 292 | andkylee | F   |   33 | bbbbbbbbbb |
| 294 | andkylee | F   |   33 | bbbbbbbbbb |
| 296 | andkylee | F   |   33 | bbbbbbbbbb |
| 298 | andkylee | F   |   33 | bbbbbbbbbb |
| 300 | andkylee | F   |   33 | bbbbbbbbbb |
| 302 | andkylee | F   |   33 | bbbbbbbbbb |
| 304 | andkylee | F   |   33 | bbbbbbbbbb |
| 306 | andkylee | F   |   33 | bbbbbbbbbb |
| 308 | andkylee | F   |   33 | bbbbbbbbbb |
| 310 | andkylee | F   |   33 | bbbbbbbbbb |
| 312 | andkylee | F   |   33 | bbbbbbbbbb |
| 314 | andkylee | F   |   33 | bbbbbbbbbb |
| 316 | andkylee | F   |   33 | bbbbbbbbbb |
| 318 | andkylee | F   |   33 | bbbbbbbbbb |
| 320 | andkylee | F   |   33 | bbbbbbbbbb |
| 322 | andkylee | F   |   33 | bbbbbbbbbb |
| 324 | andkylee | F   |   33 | bbbbbbbbbb |
| 326 | andkylee | F   |   33 | bbbbbbbbbb |
| 328 | andkylee | F   |   33 | bbbbbbbbbb |
| 330 | andkylee | F   |   33 | bbbbbbbbbb |
| 332 | andkylee | F   |   33 | bbbbbbbbbb |
| 334 | andkylee | F   |   33 | bbbbbbbbbb |
| 336 | andkylee | F   |   33 | bbbbbbbbbb |
| 338 | andkylee | F   |   33 | bbbbbbbbbb |
| 340 | andkylee | F   |   33 | bbbbbbbbbb |
| 342 | andkylee | F   |   33 | bbbbbbbbbb |
| 344 | andkylee | F   |   33 | bbbbbbbbbb |
| 346 | andkylee | F   |   33 | bbbbbbbbbb |
| 348 | andkylee | F   |   33 | bbbbbbbbbb |
| 350 | andkylee | F   |   33 | bbbbbbbbbb |
| 352 | andkylee | F   |   33 | bbbbbbbbbb |
| 354 | andkylee | F   |   33 | bbbbbbbbbb |
| 356 | andkylee | F   |   33 | bbbbbbbbbb |
| 358 | andkylee | F   |   33 | bbbbbbbbbb |
| 360 | andkylee | F   |   33 | bbbbbbbbbb |
| 362 | andkylee | F   |   33 | bbbbbbbbbb |
| 364 | andkylee | F   |   33 | bbbbbbbbbb |
| 366 | andkylee | F   |   33 | bbbbbbbbbb |
| 368 | andkylee | F   |   33 | bbbbbbbbbb |
| 370 | andkylee | F   |   33 | bbbbbbbbbb |
| 372 | andkylee | F   |   33 | bbbbbbbbbb |
| 374 | andkylee | F   |   33 | bbbbbbbbbb |
| 376 | andkylee | F   |   33 | bbbbbbbbbb |
| 378 | andkylee | F   |   33 | bbbbbbbbbb |
| 380 | andkylee | F   |   33 | bbbbbbbbbb |
| 382 | andkylee | F   |   33 | bbbbbbbbbb |
| 384 | andkylee | F   |   33 | bbbbbbbbbb |
| 386 | andkylee | F   |   33 | bbbbbbbbbb |
| 388 | andkylee | F   |   33 | bbbbbbbbbb |
| 390 | andkylee | F   |   33 | bbbbbbbbbb |
| 392 | andkylee | F   |   33 | bbbbbbbbbb |
| 394 | andkylee | F   |   33 | bbbbbbbbbb |
| 396 | andkylee | F   |   33 | bbbbbbbbbb |
| 398 | andkylee | F   |   33 | bbbbbbbbbb |
| 400 | andkylee | F   |   33 | bbbbbbbbbb |
| 402 | andkylee | F   |   33 | bbbbbbbbbb |
| 404 | andkylee | F   |   33 | bbbbbbbbbb |
| 406 | andkylee | F   |   33 | bbbbbbbbbb |
| 408 | andkylee | F   |   33 | bbbbbbbbbb |
| 410 | andkylee | F   |   33 | bbbbbbbbbb |
| 412 | andkylee | F   |   33 | bbbbbbbbbb |
| 414 | andkylee | F   |   33 | bbbbbbbbbb |
| 416 | andkylee | F   |   33 | bbbbbbbbbb |
| 418 | andkylee | F   |   33 | bbbbbbbbbb |
| 420 | andkylee | F   |   33 | bbbbbbbbbb |
| 422 | andkylee | F   |   33 | bbbbbbbbbb |
| 424 | andkylee | F   |   33 | bbbbbbbbbb |
| 426 | andkylee | F   |   33 | bbbbbbbbbb |
| 428 | andkylee | F   |   33 | bbbbbbbbbb |
| 430 | andkylee | F   |   33 | bbbbbbbbbb |
| 432 | andkylee | F   |   33 | bbbbbbbbbb |
| 434 | andkylee | F   |   33 | bbbbbbbbbb |
| 436 | andkylee | F   |   33 | bbbbbbbbbb |
| 438 | andkylee | F   |   33 | bbbbbbbbbb |
| 440 | andkylee | F   |   33 | bbbbbbbbbb |
| 442 | andkylee | F   |   33 | bbbbbbbbbb |
| 444 | andkylee | F   |   33 | bbbbbbbbbb |
| 446 | andkylee | F   |   33 | bbbbbbbbbb |
| 448 | andkylee | F   |   33 | bbbbbbbbbb |
| 450 | andkylee | F   |   33 | bbbbbbbbbb |
| 452 | andkylee | F   |   33 | bbbbbbbbbb |
| 454 | andkylee | F   |   33 | bbbbbbbbbb |
| 456 | andkylee | F   |   33 | bbbbbbbbbb |
| 458 | andkylee | F   |   33 | bbbbbbbbbb |
| 460 | andkylee | F   |   33 | bbbbbbbbbb |
| 462 | andkylee | F   |   33 | bbbbbbbbbb |
| 464 | andkylee | F   |   33 | bbbbbbbbbb |
| 466 | andkylee | F   |   33 | bbbbbbbbbb |
| 468 | andkylee | F   |   33 | bbbbbbbbbb |
| 470 | andkylee | F   |   33 | bbbbbbbbbb |
| 472 | andkylee | F   |   33 | bbbbbbbbbb |
| 474 | andkylee | F   |   33 | bbbbbbbbbb |
| 476 | andkylee | F   |   33 | bbbbbbbbbb |
| 478 | andkylee | F   |   33 | bbbbbbbbbb |
| 480 | andkylee | F   |   33 | bbbbbbbbbb |
| 482 | andkylee | F   |   33 | bbbbbbbbbb |
| 484 | andkylee | F   |   33 | bbbbbbbbbb |
| 486 | andkylee | F   |   33 | bbbbbbbbbb |
| 488 | andkylee | F   |   33 | bbbbbbbbbb |
| 490 | andkylee | F   |   33 | bbbbbbbbbb |
| 492 | andkylee | F   |   33 | bbbbbbbbbb |
| 494 | andkylee | F   |   33 | bbbbbbbbbb |
| 496 | andkylee | F   |   33 | bbbbbbbbbb |
| 498 | andkylee | F   |   33 | bbbbbbbbbb |
| 500 | andkylee | F   |   33 | bbbbbbbbbb |
| 502 | andkylee | F   |   33 | bbbbbbbbbb |
| 504 | andkylee | F   |   33 | bbbbbbbbbb |
| 506 | andkylee | F   |   33 | bbbbbbbbbb |
| 508 | andkylee | F   |   33 | bbbbbbbbbb |
| 510 | andkylee | F   |   33 | bbbbbbbbbb |
| 512 | andkylee | F   |   33 | bbbbbbbbbb |
| 514 | andkylee | F   |   33 | bbbbbbbbbb |
| 516 | andkylee | F   |   33 | bbbbbbbbbb |
| 518 | andkylee | F   |   33 | bbbbbbbbbb |
| 520 | andkylee | F   |   33 | bbbbbbbbbb |
| 522 | andkylee | F   |   33 | bbbbbbbbbb |
| 524 | andkylee | F   |   33 | bbbbbbbbbb |
| 526 | andkylee | F   |   33 | bbbbbbbbbb |
| 528 | andkylee | F   |   33 | bbbbbbbbbb |
| 530 | andkylee | F   |   33 | bbbbbbbbbb |
| 532 | andkylee | F   |   33 | bbbbbbbbbb |
| 534 | andkylee | F   |   33 | bbbbbbbbbb |
| 536 | andkylee | F   |   33 | bbbbbbbbbb |
| 538 | andkylee | F   |   33 | bbbbbbbbbb |
| 540 | andkylee | F   |   33 | bbbbbbbbbb |
| 542 | andkylee | F   |   33 | bbbbbbbbbb |
| 544 | andkylee | F   |   33 | bbbbbbbbbb |
| 546 | andkylee | F   |   33 | bbbbbbbbbb |
| 548 | andkylee | F   |   33 | bbbbbbbbbb |
| 550 | andkylee | F   |   33 | bbbbbbbbbb |
| 552 | andkylee | F   |   33 | bbbbbbbbbb |
| 554 | andkylee | F   |   33 | bbbbbbbbbb |
| 556 | andkylee | F   |   33 | bbbbbbbbbb |
| 558 | andkylee | F   |   33 | bbbbbbbbbb |
| 560 | andkylee | F   |   33 | bbbbbbbbbb |
| 562 | andkylee | F   |   33 | bbbbbbbbbb |
| 564 | andkylee | F   |   33 | bbbbbbbbbb |
| 566 | andkylee | F   |   33 | bbbbbbbbbb |
| 568 | andkylee | F   |   33 | bbbbbbbbbb |
| 570 | andkylee | F   |   33 | bbbbbbbbbb |
| 572 | andkylee | F   |   33 | bbbbbbbbbb |
| 574 | andkylee | F   |   33 | bbbbbbbbbb |
| 576 | andkylee | F   |   33 | bbbbbbbbbb |
| 578 | andkylee | F   |   33 | bbbbbbbbbb |
| 580 | andkylee | F   |   33 | bbbbbbbbbb |
| 582 | andkylee | F   |   33 | bbbbbbbbbb |
| 584 | andkylee | F   |   33 | bbbbbbbbbb |
| 586 | andkylee | F   |   33 | bbbbbbbbbb |
| 588 | andkylee | F   |   33 | bbbbbbbbbb |
| 590 | andkylee | F   |   33 | bbbbbbbbbb |
| 592 | andkylee | F   |   33 | bbbbbbbbbb |
| 594 | andkylee | F   |   33 | bbbbbbbbbb |
| 596 | andkylee | F   |   33 | bbbbbbbbbb |
| 598 | andkylee | F   |   33 | bbbbbbbbbb |
| 600 | andkylee | F   |   33 | bbbbbbbbbb |
+-----+----------+-----+------+------------+
201 rows in set (0.09 sec)
mysql>

 

4. 功能完善。

通过第3步骤中的两个结果集进行对比,我们可以发现,MySQL中的limit关键字类似于一个伪列的功能。比oracle中的rownum要强大,在oracle中要通过一次rownum再加一次虚拟列才能实现类似MySQL中的limit功能。因此limit功能存在优势的地方在于:不产生虚拟列。也就是说你不需要花费额外的功夫来处理列名列表了。最简单的就是直接用星号*,开发人员在编写存错过程的时候比较省事了。

最后,个人感觉:通过比较mssqlserver,oracle,sybase中的分页是实现方式,我感觉MySQL的limit是最简单最方便的。

————————————————————————————————-
—- 本文为andkylee个人原创,请在尊重作者劳动成果的前提下进行转载;
—- 转载务必注明原始出处 : http://www.dbainfo.net
—- 关键字:MySQL 分页  limit
————————————————————————————————-

主键与唯一索引的区别

今天在sqlcentral群里面有人讨论主键和索引的区别,特地搜索了一下。找到一篇,特作收藏。

http://www.cnblogs.com/chinhr/archive/2007/09/30/911792.html

其实指定列的索引就相当于对指定的列进行排序,为什么要排序呢?因为 排序有利于对该列的查询,可以大大增加查询效率。(那么可能有人认为应该对所有的列排序,这样就可以增加整个数据库的查询效率?这样的想法是错误的,原因 是建立索引也是要消耗系统资源的,给每个表里的每个列都建立索引那么将对系统造成极大的负担,那就更别提效率了!)---------简单的说建立一个列 的索引,就相当与建立一个列的排序。

    主键其实就是一个索引,但是这个索引跟一般的索引有所不同,不 同在于主键所在的列里的每一个的记录都是唯一的,也可以说不能在主键里出现相同的记录,在同一个表里只能有一个主键。(主键等于索引,索引不一定等于主 键)----------简单的说主键就是所在列不能出现相同记录的特殊索引,而且这个索引只能在表里出现一次。


    1.主键一定是唯一性索引,唯一性索引并不一定就是主键;
    2.一个表中可以有多个唯一性索引,但只能有一个主键;
    3.主键列不允许空值,而唯一性索引列允许空值。

得到SQLSERVER 2005 数据库的当前数据库中的数据文件所在磁盘的剩余空间

在csdn论坛上看到有人问,如何获取指定数据库所在磁盘的磁盘剩余空间。

http://topic.csdn.net/u/20100518/16/70cae8d3-a9de-4e45-9f49-fe8b00d8ba74.html?seed=1945596721&r=65529065#r_65529065

解决的思路是:通过sysfiles系统表找到数据库所属数据文件所在的物理路径,从数据文件的物理路径中提取所在磁盘盘符(第一个字母),最后用扩展存储过程xp_fixeddrives来获得磁盘驱动器的剩余空间(MB Bytes)。

SQL语句如下:

declare @drivename char(1)
select @drivename=left(filename,1) from sysfiles where fileid=  1
if not exists(select 1 from tempdb.dbo.sysobjects where name like '#FreeSpace%' and type='U')
  create table #FreeSpace(
    Drive char(1),
    MB_Free int
    )
else
      truncate table #FreeSpace
     
insert into #FreeSpace
exec xp_fixeddrives
select MB_Free from #FreeSpace where Drive = @drivename
go
 

我的测试环境是的结果如下:

1> declare @drivename char(1)
2> select @drivename=left(filename,1) from sysfiles where fileid=  1
3>
4> if not exists(select 1 from tempdb.dbo.sysobjects where name like '#FreeSpace
%' and type='U')
5>   create table #FreeSpace(
6>     Drive char(1),
7>     MB_Free int
8>     )
9> else
10>       truncate table #FreeSpace
11>
12> insert into #FreeSpace
13> exec xp_fixeddrives
14>
15> select MB_Free from #FreeSpace where Drive = @drivename
16> go

(3 行受影响)
MB_Free
-----------
      18905

(1 行受影响)
1>
2>
3> select filename from sysfiles
4> go
filename

--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------
D:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\master.mdf

D:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\mastlog.ldf

(2 行受影响)
1> xp_fixeddrives
2> go
drive MB 可用空间
----- -----------
C           26562
D           18905
E           22517

(3 行受影响)

上面的sql语句和csdn上帖子的发帖人要求的有点差距,

第一:指定数据库,这点很容易。直接select filename from <your_db_name>.dbo.sysfiles即可。

第二:某个数据库的数据文件可能跨越两个及以上不同的物理磁盘;所以@drivename变量有可能得到不唯一的值。可以考虑用游标来实现。

————————————————————————————————-
—- 本文为andkylee个人原创,请在尊重作者劳动成果的前提下进行转载;
—- 转载务必注明原始出处 : http://www.dbainfo.net
—- 关键字:sqlcmd sqlserver2005 sysfiles xp_fixeddrives 磁盘剩余空间
————————————————————————————————-

sybase 公司将被SAP收购,看重的是ASA这项移动数据库技术

来自:http://tech.sina.com.cn/it/2010-05-13/14374182429.shtml

--------------------------------------------------------------

导读:美国IT网站ComputerWorld今天撰文称,SAP收购Sybase的主要目的在于拓展移动商业应用领域,使得企业用户可以实现实时 决策。

  以下为文章全文:

  溢价收购

  周三宣布斥资58亿美元收购Sybase后,SAP将未来的大赌注压在了移动商业应用领域。

  SAP首席技术官维舍尔·斯卡(Vishal Sikka)在电话会议上说:“有了Sybase,我们将有机会大幅加速移动业务的发展。我们可以将SAP核心产品中的每个部分都分解开来,并面向移动领 域推出。当然,也包括SAP和Business Objects的分析产品。”

  SAP周三晚些时候表示,该公司计划以每股65美元的价格收购Sybase。较Sybase过去三个月的平均股价溢价44%。

  SAP预计,该交易有望于今年7月完成,此前还需要获得监管部门的审批以及足够多的Sybase股东支持。

  拓展移动领域

  从某些方面来看,Sybase仍然是最为知名的数据库企业,而SAP高管周三也讨论了有关Sybase IQ数据库的问题。该产品可以提升分析和数据仓储技术的性能。

  但是Sybase还有许多产品被广泛用于部署智能手机或其他移动设备的商业应用,这似乎才是SAP真正感兴趣的东西。

  “我们的许多用户,尤其是规模最大的用户,都试图实现企业的实时运营。但是当处于移动状态的员工手头没有数据进行实时决策时,就会变得非常困 难。”SAP联席CEO施杰翰(Jim Hagemann Snabe)说。

  SAP将利用Sybase的移动应用平台,让企业员工可以通过各大移动设备平台访问SAP的商业和分析应用。“这将把车间与办公室连接起 来。”SAP另外一名联席CEO孟鼎铭(Bill McDermott)说。

  斯卡表示,移动互联网“比桌面互联网大10倍”,而SAP认为“下一代企业员工将彻底连接并且完全处于移动状态”。他说,这一趋势在中国和印度 等新兴市场尤其明显。

  斯卡说:“我们认为,世界将向移动方向发展,并将布满连接。”他认为,这一交易将对SAP的三元战略起到支持作用,包括企业预置(On- Premise)、按需随选(On-Demand)和移动应用(On-Device)。

  不跟风甲骨文

  SAP此前很少进行大规模并购。Sybase的交易是该公司历史上规模第二大的一起并购。仅次于2007年斥资68亿美元对数据分析厂商 Business Objects的收购。除此之外,SAP更倾向于通过规模较小的交易来获取一些无法快速自主研发的技术。

  孟鼎铭表示,对Sybase的收购将拓展SAP现已确定的市场,并加速该公司的业务发展。

  而作为SAP的主要竞争对手,甲骨文则借助大量的收购来拓展技术触角和用户基础。甲骨文的业务范围已经遍及数据库、应用、中间件、服务器和存储 器等各个技术领域。

  SAP表示,该公司不会效仿这种方法。施杰翰说:“我们根本不认同这种全面开花的收购策略。我们认同用户的选择,并且专注于正确的领域。”

  Sybase发展计划

  施杰翰表示,Sybase今后将作为SAP的全资子公司运营,“使得该品牌能够兴旺繁荣”。但SAP不会将该公司的应用与Sybase联系起 来,也不会将其作为优先组合向用户推广。SAP的应用仍将对其他厂商的数据库一视同仁。

  这很可能是明智之举。Sybase的Adaptive Server Enterprise(以下简称“ASE”)数据库目前并不是SAP用户的热门选择。根据美国市场研究公司Gartner的数据,该产品在全球数据库市场 仅占3.1%的份额。

  事实上,ASE甚至无法支持所有的SAP应用,但这种情况现在可能会发生变化。SAP表示,该公司将利用内存(in-memory)技术来改进 ASE。该技术此前主要是被用于提升SAP的商业智能应用。

  Sybase CEO程守宗(John Chen)将会加盟SAP并负责数据库部门,SAP还计划为其提供一个董事会席位。程守宗表示,尽管市场份额较小,但ASE在金融机构和股票交易所中却非 常受欢迎,而且Sybase过去5年间的收入保持了9%的年均增速。

  咨询机构扬基集团(Yankee Group)认为这一交易对SAP而言至关重要。该公司称:“Sybase带来了一个移动平台,可以帮助SAP将应用转变成随时随地可以通过任何设备使用 的产品。这一点非常重要,可以帮助SAP保持竞争力。”

  受到收购消息的刺激,Sybase股价周三下午飙升35%,盘后交易中又再度上涨15%,达到64.50美元,而周二的收盘价仅为41.57美 元。SAP股价周三则略有下滑,报收于44.55美元。(鼎宏)

------------------------------------------------------------------------------------------------------

PS:sap收购sybase,看重的是asa的移动数据库解决方案。sybase作为子公司独立运行,估计之前作为sybase子公司运行的 ianywhere会被改组成单独的比较重要的部门。sybase要是把全资子公司ianywhere卖给sap,sap一定太高兴了。但 是,sybase不可能傻到这种地步。

不知道IMDB这个ASE数据库能够多大程度上满足sap的应用?感觉对ase的前途不是很好。

IQ作为三驾马车中的之一,应该不会像ase那样受到亏待。

对于我们这些dba,虽然sybase目前的形势还不是太明朗,但是,感觉未必是坏事。

————————————————————————————————-
—- 本文为andkylee个人原创,请在尊重作者劳动成果的前提下进行转载;
—- 转载务必注明原始出处 : http://www.dbainfo.net
—- 关键字:收购 sybase SAP ASE ASA IQ 商业软件 auquire
————————————————————————————————-

sybase公司将被SAP收购

据网易科技:2010-05-13 08:05:09

--------------------------------

5月13日消息,据国外媒体报道,德国软件巨擘SAP周三宣布,将以58亿美元的现金收购Sybase

SAP将以每股65美元的价格收购Sybase,交易总金额为58亿美元。自20世纪90年代中期以来,Sybase股价从未超过50 美元。

SAP是全球最大的商业管理软件厂商,而Sybase是全球领先的数据管理及企业集成解决方案供应商,该交易将有助于SAP与甲骨文抗衡。甲骨文不 久前以74亿美元收购Sun。

SAP表示,该交易将使SAP获得Sybase的核心技术,使一些商业应用在手机上运行。如果顺利,该交易预计于今年第三季度完成。

在交易宣布前,市场上已经有相关传闻,导致Sybase股价上扬35%至56.14美元。在盘后交易中,Sybase股价再度上扬15%至 64.30美元。

from AP,May 12, 2010 

---------------------

SOFTWARE SNAP-UP: German business software maker SAP AG is buying Sybase Inc . for $5.8 billion. Sybase makes database software and technology that connects business applications to mobile phones.

ATTACKING ORACLE: SAP is muscling in to more of Oracle Corp .'s database turf with the deal. Oracle has spent $40 billion since 2004 on acquisitions, mostly to buy its way into markets where SAP is strong.

BIG MOVE FOR NEW BOSSES: The acquisition is the first big move by SAP's new co-CEOs Bill McDermott and Jim Hagemann Snabe, who took over in February after the previous CEO resigned.

Copyright 2010 The Associated Press. All rights reserved. This material may not be published, broadcast, rewritten, or redistributed.

哎!sybase从09年下半年在国内刚开始起色,怎么又被卖了呢?本来还打算最近考个sybase认证的。看来得推迟或者取消了。

tar打包时报错:Reached end-of-file before expected的解决方法

在ibm-aix5.3下用tar打包一个文件夹时报错:tar: 0511-194 Reached end-of-file before expected.

用的命令是:tar -cvf /tmp/sybase12503.tar /sybase/sybase12x

解决方法:

执行ulimit -f 返回结果为:2097151,说明系统对用户所能用的文件大小限制为:2097151*512=1G

此时查看没有成功打包完成的/tmp/sybase12503.tar文件,发现其大小正好是:1073741312 (bytes).

可通过改 /etc/security/limits 文件中的fsize来设置为无限制:

default:
    fsize = -1

为使 /etc/security/limits 文件的更改生效,用户必须注销当前登录会话并重新登录。
 
重新登录后,执行ulimit -a 返回结果为:unlimited。此时更改已经生效,对用户所能用的文件大小不加限制。但是,
无论 ulimit 设置如何,AIX 上的标准文件系统都有2GB文件大小限制,如果需要建大于2GB的文件需要启用大文件 选项创建文件系统。
 
然后,再次执行:tar -cvf /tmp/sybase12503.tar /sybase/sybase12x
成功将/sybase/sybase12x打包成/tmp/sybase12503.tar。
-bash-3.2$ ls -al /tmp/sybase12503.tar
-rw-r--r--    1 root     system   1142118400 May 12 11:17 /tmp/sybase12503.tar
 
补充:在网上搜到用tar打包的文件超过2G的时候,也是报同样的错误。此时就是文件系统的原因了。应该不是jfs2或者big file enable的jfs文件系统。
-bash-3.2$ lsfs -q /tmp
Name            Nodename   Mount Pt               VFS   Size    Options    Auto Accounting
/dev/hd3        --         /tmp                   jfs2  20971520 --         yes  no
本机的/tmp文件系统为jfs2,应该可以支持2G以上的文件。
 
————————————————————————————————-
—- 本文为andkylee个人原创,请在尊重作者劳动成果的前提下进行转载;
—- 转载务必注明原始出处 : http://www.dbainfo.net
—- 关键字:tar aix ulimit jfs2 打包 压缩 解压
————————————————————————————————-

ASE12.x与15.x中的字符串替换功能的实现

在ASE12.x版本中Sybase没有提供类似replace的函数。在ASE15.x版本中添加了替换某个字符串中指定的字符为另一个字符的函数:str_replace
使用方法为:

1> select str_replace('aaaa|bbb|ccc|','|',';')
2> go

 -------------
 aaaa;bbb;ccc;

上面的例子为将字符串aaaa|bbb|ccc|中的|替换为;

但是,在ASE12.x中需要上面上面的功能,就稍微一点麻烦了。需要结合两个函数:charindex,stuff来循环替换。
两个函数的用法分别为:

 charindex - Returns an integer representing the starting position of an expression.
    charindex(expression1, expression2)
  
 stuff - Returns the string formed by deleting a specified number of characters from one string and replacing them with another string.
    stuff(char_expr1|uchar_expr1, start, length,char_expr2|uchar_expr2)

实现的算法为:

declare @my_var char(25)
select @my_var = 'abc|ert|rfrfrf|'
while charindex('|', @my_var) > 0
begin
select @my_var = stuff(@my_var, charindex('|', @my_var), 1, ';')
end
select @my_var

执行结果为:

      1> declare @my_var char(25)
      2> select @my_var = 'abc|ert|rfrfrf|'
      3> while charindex('|', @my_var) > 0
      4> begin
      5> select @my_var = stuff(@my_var, charindex('|', @my_var), 1, ';')
      6> end
      7> select @my_var
      8> go
       -------------------------
       abc;ert;rfrfrf;

————————————————————————————————-
—- 本文为andkylee个人原创,请在尊重作者劳动成果的前提下进行转载;
—- 转载务必注明原始出处 : http://www.dbainfo.net
—- 关键字:替换  字符串  replace str_replace stuff charindex
————————————————————————————————-