网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > SQL技巧
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
本月文章推荐
.数据仓库实施过程所需要考虑的步.
.以前编写Like谓词被忽略的使用方.
.如何转移SQL SERVER数据库.
.小写转大写金额.
.用OPENXML函数将XML数据转为关联.
.轻松掌握密码有效性验证失败的处.
.数据库的数据挖掘概述(二).
.sql语句查询结果合并union all用.
.SQL安装问题总结 .
.sql server发送邮件.
.SQL Server 2005中三种插入XML数.
.把SQL结果中几行值串起来的sum_s.
.实现上千万条数据的分页显示.
.实例讲解SQL查询连续号码段的巧妙.
.深入理解CAST和CONVERT提供的具体.
.SQL Server静态页面导出技术2.
.将数据库直接备份到网络上其它计.
.SQL SERVER中一些常见性能问题的.
.未与信任SQL Server连接相关联的.
.使用SQL Server导入和索引 Micro.

建索引(尤其是主键)时请注意索引列顺序

发表日期:2008-7-4


在创建主键或其它索引时,SQL Server总是自动将字段的顺序设置为升序排列;升序是默认设置,是为了保持与 SQL Server 早期版本的兼容性。建索引时索引列的顺序应该按照常用查询中的排序方式排序。

我们做个试验创建一个表,其中主键上的聚集索引按照id倒叙排列,然后分别倒叙顺序select数据,比较select的时间:

+测试代码

if object_id('test_indexorder','U') is not null

begin

truncate table test_indexorder

drop table test_indexorder

end

go

create table test_indexorder

(

id int identity(1,1) not null,

name varchar(20) not null,

content varchar(50) not null,

co1 varchar(50),

co2 varchar(50),

co3 varchar(50),

co4 varchar(50),

co5 varchar(50),

constraint pk_testorder primary key clustered(

id desc

)

)

go

--insert 1000000 条数据

set nocount on;

declare @t datetime;

set @t = getdate();

DECLARE @cn int;

set @cn = 1000000;

while(@cn > 0)

begin

insert into test_indexorder(name,content,co1,co2,co3,co4,co5)

VALUES(

'name' + cast(@cn as varchar(10)),

cast(newid() as varchar(50)),

cast(newid() as varchar(50)),

cast(newid() as varchar(50)),

cast(newid() as varchar(50)),

cast(newid() as varchar(50)),

cast(newid() as varchar(50)));

set @cn = @cn -1;

end

print '插入时间(毫秒):';

print datediff(millisecond,@t,getdate());

set nocount off;

GO

checkpoint

dbcc freeproccache

dbcc dropcleanbuffers

GO

go

set nocount on;

declare @t datetime;

set @t = getdate();

with t_rn as (

select *,rn = ROW_NUMBER() OVER (ORDER BY id desc) FROM test_indexorder

)

SELECT id,name,content,co1,co2,co3,co4,co5 from t_rn WHERE rn between 19007 and 19057;

print '查询时间(毫秒)'

print datediff(millisecond,@t,getdate())

set @t = getdate();

with t_rn as (

select *,rn = ROW_NUMBER() OVER (ORDER BY id asc) FROM test_indexorder

)

SELECT id,name,content,co1,co2,co3,co4,co5 from t_rn WHERE rn between 17007 and 17057;

print '查询时间(毫秒)'

print datediff(millisecond,@t,getdate())

set nocount off;

以下是查询时间结果

查询时间(毫秒)

393

查询时间(毫秒)

606

按照和索引相同顺序从100万条数据中取50条时需要393毫秒,相反顺序时需要606毫秒。造成的性能影响还是挺大的。

结论:

在建索引时要考虑常用查询的排序方式,在建主键时要特别注意,因为sql server会自动按照升序来建,这时候如果您的查询多数用主键列倒叙排列,记得要修改一下默认的设置。

上一篇:从三个方面进行讲解如何适当优化"SQL" 人气:799
下一篇:配置SQL Server文件组对应不同的RAID系统 人气:793
浏览全部索引的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐