SQL 分页查询效率
用T-SQL做数据库分页查询也有好几年了,但对于各种查询方法的写法一至都没怎么去理会,最近参与了几个项目的开发,几个项目中分页查询的写法也不相同,这也让我产生了确认几种写法效率问题的兴趣。(注:我所说的几种写法都是需要返回总记录数的分页)
1、生成测试数据
select a.* into test from sys.columns a,sys.columns b
本机生成5564881行数据,相信也够多了吧。
主要说两种写法:
第一种: 分两个查询,先按查询条件查询出总记录数,再写一相同查询取出页数据;
第二种:将查询结果写入临时表,然后统计总记录数,再根据分页索引取出页数据;
第一种写法SQL:
select count(*) from test where [name] like 'ActivityID' and max_length>1
select * from(
select a.[object_id],row_number() over(order by object_id) as rowIndex from test a
where [name] = 'ActivityID' and max_length>1
)t
where rowIndex>100 and rowIndex<200
第二种写法SQL:
select a.[object_id],row_number() over(order by object_id) as rowIndex into #t from test a
where [name] = 'ActivityID' and max_length>1
select * from #t where rowIndex>100 and rowIndex<200
select count(*) from #t
drop table #t
测试结果:
当where 条件只有一个是,查询一性能优于查询二;但增加一条件后查询二性能优于查询一;
总结一下:
1、第一种写法优势在于I/O开销小于第二种写法,由其在满足条件返回数据越多的情况下性能越优;
2、第二种写法在查询条件复杂查询下性能优于第一种写法;
另外在使用Like 和=时一定要注意,=性能高于Like,在不使用通配符的情况下应使用=;(汗一个自己,以前习惯性的使用Like,这个习惯要好好的改一下了。)
相关文档:
inner join(等值连接) 只返回两个表中联结字段相等的行
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
INNER JOIN 语法:
INNER JOIN 连接两个数据表的用法:
SELECT * from 表1 INNER JOIN 表2 ON 表1.字段号=表2 ......
SQL字符串函数http://www.cnblogs.com/virusswb/archive/2008/09/10/1288576.html
select语句中只能使用sql函数对字段进行操作(链接sql server),
select 字段1 from 表1 where 字段1.IndexOf("云")=1;
这条语句不对的原因是indexof()函数不是sql函数,改成sql对应的函数就可以了。
left()是sql函数。
select 字 ......
在网络上发送数据都会发生一些严重的安全问题,网络最大的担忧在于有人可以捕获数据,sqlserver支持采用证书来加密
1.创建证书
create master key encryption by
password = 'administrator123'
--用密码admini--
create certificate c1
encryption by password = 'administrator123'
with subject = 'c1 certific ......
本文转自:http://industry.ccidnet.com/art/1106/20070514/1080519_1.html
本文是SQL Server SQL语句优化系列文章的第一篇。该系列文章描述了在Micosoft’s SQLServer2000关系数据库管理系统中优化SELECT语句的基本技巧,我们讨论的技巧可在Microsoft's SQL Enterprise Manager或 Microsoft SQL Query Anal ......
在这一步中,需要指定游标的属性和根据要求产生的结果集。有两种方法可以指定一个游标。
形式1(ANSI 92)
DECLARE cursor_name [INSENSITIVE] [SCROLL] CURSOR
FOR select_statement
[FOR {READ ONLY | UPDATE ][OF column_list]}]
形式2
DECLARE cursor_name CURSOR
[LOCAL | GLOBAL]
[FORWARD ......