SQL Server 分页+SQLServerOracle获取数据库、表、表里字段、类型、注释

本文介绍了SQLServer和Oracle数据库的分页查询方法,包括TOP/NOT IN、ROW_NUMBER() OVER()和OFFSET/FETCH NEXT的方式,并通过性能对比指出在不同情况下的优劣。此外,还展示了如何获取数据库、表和字段的详细信息。在C#中,通过LINQ进行分页查询时,使用AsParallel()可以显著提高查询效率。
摘要由CSDN通过智能技术生成
一、SQL Server 分页

   
   
  1. --top not in方式
  2. select top 条数 * from tablename
  3. where Id not in (select top 条数*页数 Id from tablename)
  4. --ROW_NUMBER() OVER()方式
  5. select * from (
  6.     select *, ROW_NUMBER() OVER( Order by Id ) AS RowNumber from tablename
  7.   ) as b
  8.   where RowNumber BETWEEN 当前页数-1*条数 and 页数*条数
  9. --offset fetch next方式
  10. --SQL2012以上的版本才支持
  11. select * from tablename
  12. order by Id offset 页数 row fetch next 条数 row only
  13. 分析:在数据量较大时
  14. top not in方式:查询靠前的数据速度较快
  15. ROW_NUMBER() OVER()方式:查询靠后的数据速度比上一种较快
  16. offset fetch next方式:速度稳定,优于前2种,但sql版本限制2012及以上才可使用
模拟测试

   
   
  1. - -1、首先创建了一张TestAdmin表,主键为ID字段 int类型且自增
  2. create table TestAdmin (
  3. Id int identity(1,1) primary Key,
  4. Name varchar(Max),
  5. Age int
  6. )
  7. --2、接着批量导入1000条模拟数据
  8. declare @count int
  9. --这里定义模拟数据条数
  10. set @count= 1000
  11. while(@count> 0)
  12. begin
  13. insert into TestAdmin (Name,Age) values ('zhuyuan'+convert(varchar,@count),@count)
  14. set @count=@count -1
  15. end
  16. - -3查询数据集
  17. select * from TestAdmin

  

 

c#中linq分页查询

   
   
  1. 最近需要对客户的系统进行升级,在对一张记录只有 7767条记录的表进行分次查询时,每次查询 500条, 16次查询居然使用了 2分钟时间。代码如下:
  2. public static List<T> GetList(int pageIndex, int pageSize, out int count)
  3. {
  4. using ( var db = new ClientDBDataContext(DBHelper.DBConString))
  5. {
  6. var query = db.DataBase_Table;
  7. count = query.Count();
  8. return query.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
  9. }
  10. }
  11. 调试结果显示,一次比一次查询的时间长,到第 14次查询时,耗时 20s之多,不忍直视,那还有记录达到百万条的又该如何???
  12. 查看DataBase_Table的LINQ扩展时,发现了AsParallel(),查看说明:启用查询的并行化。
  13. public static List<T> GetList(int pageIndex, int pageSize, out int count)
  14. {
  15. using ( var db = new ClientDBDataContext(DBHelper.DBConString))
  16. {
  17. var query = db.DataBase_Table.AsParallel();
  18. count = query.Count();
  19. return query.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
  20. }
  21. }
  22. 运行,整个 16次查询不到 1s。

  看来代码的优化在某些时候是非常重要的……

 

 

  

 
二、SQLServer、Oracle获取数据库、表、表里字段、类型、注释

   
   
  1. --获取所有非系统数据库
  2. select name from master.. sysdatabases where name not in('master', 'model', 'msdb', 'tempdb', 'northwind', 'pubs', 'ReportServer', 'ReportServerTempDB')
  3. --获取某个表的详细字段信息
  4. select c.name,t.name,c.prec,p.value from syscolumns c
  5. inner join systypes t on c.xtype= t.xtype
  6. inner join sysobjects o on c.id= o.id
  7. inner join sys.extended_properties p on c.id = p.major_id and c.colid = p.minor_id
  8. where o.xtype= 'u' and t.status= 0 and o.name= '表名'
  9. --获取所有表信息
  10. select * from sysobjects where XType= 'U'
  11. --字段信息,关联表id=syscolumns.id
  12. select * from syscolumns
  13. --注释信息,关联字段信息major_id=syscolumns.id
  14. select * from sys.extended_properties
  15. --主键自增信息,关联id =syscolumns.id
  16. select * from sysindexkeys
  17. select * from sysindexes
  18. --表详细信息(字段名,类型,长度,是否是主键,是否是标识,允许空,注释)
  19. select a.name N '字段名', b.name N '类型',
  20. COLUMNPROPERTY(a.id,a.name, 'PRECISION') as N '长度',
  21. ( case when (select count(*) from sysobjects
  22. where (name in (select name from sysindexes
  23. where (id = a.id) AND ( indid in (select indid from sysindexkeys
  24. where (id = a.id) AND ( colid in (select colid from syscolumns
  25. where (id = a.id) AND ( name = a.name))))))) AND ( xtype = 'PK'))>0 then 'PK' else '' end) N'主键',
  26. (case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')= 1 then 'identity' else '' end) N '标识',
  27. ( case when a.isnullable= 1 then 'true' else 'false' end) N '允许空',
  28. isnull(g.[ value], '') AS N '注释'
  29. from syscolumns a
  30. left join systypes b
  31. on a.xtype=b.xusertype
  32. inner join sysobjects d
  33. on a.id=d.id and d.xtype= 'U' and d.name<> 'dtproperties'
  34. left join syscomments e
  35. on a.cdefault=e.id
  36. left join sys.extended_properties g
  37. on a.id=g.major_id AND a.colid = g.minor_id
  38. where d.name= '表名'
  39. order by a.colorder

  

三、Oracle:

   
   
  1. --获取当前用户所有的表
  2. SELECT * FROM user_tables
  3. --获取所有列,列信息
  4. SELECT * FROM user_tab_columns
  5. - -2个视图中分别存储了当前用户的表信息
  6. --user_tab_columns:表中列的详情,但是没有是否是主键的标识
  7. --user_cons_columns:约束视图。
  8. SELECT utc.COLUMN_NAME as 列名,ucc.COLUMN_NAME AS 主键, utc.DATA_TYPE as 列类型,utc.DATA_LENGTH as 类型长度,utc.NULLABLE as 是否可为空 FROM user_tab_columns utc
  9. left join user_cons_columns ucc on utc.TABLE_NAME = ucc.TABLE_NAME
  10. where POSITION= 1 AND ucc.TABLE_NAME = '你的表名'
  11. ORDER by utc.COLUMN_ID
  12. --user_col_comments:注释

  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值