二、SQL Server 分页

一、SQL Server 分页

 --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、首先创建了一张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 @[email protected]
end

--3查询数据集
select * from TestAdmin

  

c#中linq分页查询

最近需要对客户的系统进行升级,在对一张记录只有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获取数据库、表、表里字段、类型、注释

--获取所有非系统数据库
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:

--获取当前用户所有的表
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:注释

  

原文地址:https://www.cnblogs.com/fger/p/10802792.html

时间: 2024-10-07 12:18:17

二、SQL Server 分页的相关文章

SQL server分页的四种方法(算很全面了)

目录: 文章目录 方法一:三重循环 思路 代码实现 查询出的结果及时间 方法二:利用max(主键) 代码实现 查询出的结果及时间 方法三:利用row_number关键字 SQL实现 查询出的结果及时间 第四种方法:offset /fetch next(2012版本及以上才有) 代码实现 结果及运行时间 封装的存储过程 总结 ??这篇博客讲的是SQL server的分页方法,用的SQL server 2012版本.下面都用pageIndex表示页数,pageSize表示一页包含的记录.并且下面涉及

解决hibernate对Sql Server分页慢的问题

一.hibernate分页 hibernate对MsSql的伪分页 分页是web项目中比不可少的一个功能,数据量大的时候不能全部展示必然要用到分页技术.相信大家对hibernate中的分页都不陌生: Java代码   public Query setMaxResults(int maxResults); public Query setFirstResult(int firstResult); 只要调用了这两个方法并设置好参数,hibernate自动分页完全屏蔽了底层数据库分页技术,这也是众多开

SQL SERVER 分页方法

    最近项目中需要在SQL SERVER中进行分页,需要编写分页查询语句.之前也写过一些关于分页查询的语句,但是性能不敢恭维.于是在业务时间,在微软社区Bing了一篇老外写的关于SQL SERVER分页的文章.看过之后,感觉自己之前写的语句,太低端,太不科学了.  文章中讲了两种分页方法,其中一种只适用于SQL SERVER2012以上版本.   ROW_NUMBER()函数分页  先介绍一下ROW_NUMBER()函数,这个函数的主要作用,从它的命名中就可看出来.ROW,每列,NUMBER

SQL Server 分页语句

表中主键必须为标识列,[ID] int IDENTITY (1,1) 1.分页方案一:(利用Not In和SELECT TOP分页) SELECT TOP 页大小 * FROM TestTable WHERE (ID NOT IN (SELECT TOP (页大小*(页数-1)) id FROM 表 ORDER BY id)) ORDER BY ID 2.分页方案二:(利用ID大于多少和SELECT TOP分页) SELECT TOP 页大小 * FROM TestTable WHERE (ID

SQL Server分页方式、ISNULL与COALESCE性能比较(八)

前言 上一节我们讲解了数据类型以及字符串中几个需要注意的地方,这节我们继续讲讲字符串行数同时也讲其他内容和穿插的内容,简短的内容,深入的讲解. 分页方式 在SQL 2005或者SQL 2008中我们是利用ROW_NUMBER开窗函数来进行分页的,关于开窗函数,我们在SQL进阶中会详细讲讲.如下: USE TSQL2012 GO DECLARE @StartRow INT DECLARE @EndRow INT SET @StartRow = 31 SET @EndRow = 40 SELECT

SQL Server 分页查询存储过程

1.低效的分页 SELECT TOP m-n+1 * FROM publish WHERE (id NOT IN (SELECT TOP n-1 id FROM publish)) 但这个存储过程有一个致命的缺点,就是它含有NOT IN字样.虽然我可以把它改造为: SELECT TOP 页大小 * FROM Table1 WHERE not exists (select * from (select top (页大小*页数) * from table1 order by id) b where

SQL Server分页的存储过程写法以及性能比较

------创建数据库data_Test ----- create database data_Test GO use data_Test GO create table tb_TestTable --创建表 ( id int identity(1,1) primary key, userName nvarchar(20) not null, userPWD nvarchar(20) not null, userEmail nvarchar(40) null ) GO ------插入数据---

SQL SERVER 分页查询 和 Inser 添加并返回Id

--第一种分页 SELECT * FROM ( select ROW_NUMBER() over(order by id) as rows,* from [dbo].[M_User] --WHERE Id>1 ) AS T where rows BETWEEN 0 AND 2 --第二种分页 需SQL SERVER 2012以上支持 select * from [M_Role] order by Id offset 0 rows fetch next 10 rows only ; --执行Ins

MSSQL之二 Sql Server中管理库与表

作为数据库开发人员,你负责创建和管理数据库和表.当创建表的时候,维护数据的完整性对你是很重要的.为确保表中的数据是准确的,一致的和可靠的,SQL Server提供了各种你可以应用到表上以增强数据完整性的检查. SQL Server包含各种系统数据库.本章介绍不同类型的系统数据库并且解释如何管理用户定义的数据库和管理用户自定义表. 重点 ?      管理数据库 ?      管理表 ?      SQL Server 2008中的数据类型 预习功课 ?        创建数据库 ?