雪花

二、SQL Server 分页

一、SQL Server 分页

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

模拟测试

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

  

 

c#中linq分页查询

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

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

 

 

  

 

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

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

  

三、Oracle:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
--获取当前用户所有的表
SELECT *  FROM  user_tables
  
--获取所有列,列信息
SELECT * FROM user_tab_columns 
  
  
--2个视图中分别存储了当前用户的表信息
--user_tab_columns:表中列的详情,但是没有是否是主键的标识
--user_cons_columns:约束视图。
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
left join user_cons_columns ucc on utc.TABLE_NAME = ucc.TABLE_NAME 
where POSITION=1 AND ucc.TABLE_NAME ='你的表名'
ORDER by utc.COLUMN_ID
  
--user_col_comments:注释

  

 

posted @   十色  阅读(345)  评论(0编辑  收藏  举报
编辑推荐:
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
阅读排行:
· 手把手教你更优雅的享受 DeepSeek
· 腾讯元宝接入 DeepSeek R1 模型,支持深度思考 + 联网搜索,好用不卡机!
· AI工具推荐:领先的开源 AI 代码助手——Continue
· 探秘Transformer系列之(2)---总体架构
· V-Control:一个基于 .NET MAUI 的开箱即用的UI组件库
  1. 1 少年 梦然
  2. 2 尘埃 林小柯
  3. 3 飞鸟和禅 任然
  4. 4 Dancing With Your Ghost Sasha Sloan
  5. 5 烟火人间 添儿呗
  6. 6 摘仙 伊格赛听、叶里
少年 - 梦然
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.
点击右上角即可分享
微信分享提示