SQLSERVER2008R2 索引建立的几点建议
T1表10000000万条数据,(插入时间36分钟,count(*)查询19秒,空间占用670M左右) 1.真正充分的利用索引 比如like'张%'就是符合SARG(符合扫描参数)标准 而like'%张'就不符合该标准 通配符%在字符串首字符的使用会导致索引无法使用,虽然实际应用中很难避免这
T1表 10000000万条数据,(插入时间36分钟,count(*)查询19秒,空间占用670M左右)
1.真正充分的利用索引
比如like '张%' 就是符合SARG(符合扫描参数)标准
而like '%张' 就不符合该标准
通配符%在字符串首字符的使用会导致索引无法使用,虽然实际应用中很难避免这样用,但还是应该对这种现象有所了解,至少知道此种用法性能是很低下的。
**********************************************
2.“非”操作符不满足SARG形式,使得索引无法使用
不满足SARG形式的语句最典型的情况就是包括非操作符的语句,如:NOT、!=、、!、NOT EXISTS、NOT IN、NOT LIKE等。
如果使用not 或者 ,最好转换成别的方法,比如例子如下:
T1表 10000000万条数据,构建如下:(插入时间36分钟,count(*)查询19秒,空间占用670M左右)
DECLARE @i INT
SET @i = 1
WHILE @i
BEGIN
INSERT INTO t1 VALUES ('zhang'+CONVERT(char(50), @i),'3.2',77);
SET @i + 1;
END
三种查询方式:
SELECT * FROM t1 WHERE id 300000
SELECT * FROM t1 WHERE id NOT IN (300000)
SELECT * FROM t1 WHERE id >299999 AND id
在执行计划中可以明显看出,使用最后一种方式而不是前面两种方式进行查询。
网上是这么说的,但自己做的试验100W条数据,开销计划是一样的。
*********************************************
3. 函数运算不满足SARG形式,使得索引无法使用
例:下列SQL条件语句中的列都建有恰当的索引,但执行速度却非常慢:
select * from record where substring(card_no,1,4)=′5378′(13秒)
select * from record where amount/30
select * from record where convert(char(10),date,112)=′19991201′(10秒)
分析:
where子句中对列的任何操作结果都是在SQL运行时逐列计算得到的,因此它不得不进行全表扫描,而没有使用该列上面的索引;如果这些结果在查询编译时就能得到,那么就可以被SQL优化器优化,使用索引,避免表搜索,因此将SQL重写成下面这样:
select * from record where card_no like ′5378%′( select * from record where amount select * from record where date= ′1999/12/01′ (
你会发现SQL明显快很多
待测试.......
**********************************************
4.尽量不要对建立了索引的字段,作任何的直接处理
select * from employs where first_name + last_name ='beill cliton';
无法使用索引,改为:
select * from employee where
first_name = substr('beill cliton',1,instr('beill cliton',' ')-1)
and
last_name = substr('beill cliton',instr('beill cliton',' ')+1)
则可以使用索引
***********************************************
5.不同类型的索引效能是不一样的,应尽可能先使用效能高的
比如:数字类型的索引查找效率高于字符串类型,定长字符串char,nchar的索引效率高于变长字符串varchar,nvarchar的索引。
应该将
where username='张三' and age>20
改进为
where age>20 and username='张三'
注意:此处,SQL的查询分析优化功能可以做到自动重排条件顺序,但还是建议预先手工排列好。
**************************************************
6.某些情况下IN 的作用与OR 相当 ,且都不能充分利用索引
例:表stuff有200000行,id_no上有非群集索引,请看下面这个SQL:
select count(*) from stuff where id_no in(′0′,′1′) (23秒)
我们期望它会根据每个or子句分别查找,再将结果相加,这样可以利用id_no上的索引;但实际上,它却采用了"OR策略",即先取出满足每个or子句的行,存入临时数据库的工作表中,再建立唯一索引以去掉重复行,最后从这个临时表中计算结果。因此,实际过程没有利用id_no 上索引,并且完成时间还要受tempdb数据库性能的影响。
实践证明,表的行数越多,工作表的性能就越差,当stuff有620000行时,执行时间会非常长!如果确定不同的条件不会产生大量重复值,还不如将or子句分开:
select count(*) from stuff where id_no=′0′
select count(*) from stuff where id_no=′1′
得到两个结果,再用union作一次加法合算。因为每句都使用了索引,执行时间会比较短,
select count(*) from stuff where id_no=′0′
union
select count(*) from stuff where id_no=′1′
从实践效果来看,使用union在通常情况下比用or的效率要高的多,而exist关键字和in关键字在用法上类似,性能上也类似,都会产生全表扫描,效率比较低下,根据未经验证的说法,exist可能比in要快些。
***************************************************
7.使用变通的方法提高查询效率
like关键字支持通配符匹配,但这种匹配特别耗时。例如:select * from customer where zipcode like “21_ _ _”,即使在zipcode字段上已建立了索引,在这种情况下也可能还是采用全表扫描方式。如果把语句改为:select * from customer where zipcode >“21000”,在执行查询时就会利用索引,大大提高速度。但这种变通是有限制的,不应引起业务意义上的损失,对于邮政编码而言,zipcode like “21_ _ _” 和 zipcode >“21000” 意义是完全一致的。
*********************************************************人各有志,但富贵在天,人生允许彷徨,但不允许蹉跎.
8.order by按聚集索引列排序效率最高
排序是较耗时的操作,应尽量简化或避免对大型表进行排序,如缩小排序的列的范围,只在有索引的列上排序等等。
我们来看:(gid是主键,fariqi是聚合索引列)
select top 10000 gid,fariqi,reader,title from tgongwen
用时:196 毫秒。 扫描计数 1,逻辑读 289 次,物理读 1 次,预读 1527 次。
select top 10000 gid,fariqi,reader,title from tgongwen order by gid asc
用时:4720毫秒。 扫描计数 1,逻辑读 41956 次,物理读 0 次,预读 1287 次。
select top 10000 gid,fariqi,reader,title from tgongwen order by gid desc
用时:4736毫秒。 扫描计数 1,逻辑读 55350 次,物理读 10 次,预读 775 次。
select top 10000 gid,fariqi,reader,title from tgongwen order by fariqi asc
用时:173毫秒。 扫描计数 1,逻辑读 290 次,物理读 0 次,预读 0 次。
select top 10000 gid,fariqi,reader,title from tgongwen order by fariqi desc
用时:156毫秒。 扫描计数 1,逻辑读 289 次,物理读 0 次,预读 0 次。
同时,按照某个字段进行排序的时候,无论是正序还是倒序,速度是基本相当的。
********************************************************
9.关于节省数据查询系统开销方面的措施
(1)使用TOP尽量减少取出的数据量
(2)字段提取要按照“需多少、提多少”的原则,避免“select *”
字段大小越大,数目越多,select所耗费的资源就越多,比如取int类型的字段就会比取char的快很多。我们每少提取一个字段,数据的提取速度就会有相应的提升。提升的幅度根据舍弃的字段的大小来判断
(3)count(*) 与 count(字段) 方法比较
用count(*)和用 count(主键)的速度是相当的,而count(*)却比其他任何除主键以外的字段汇总速度要快,而且字段越长,汇总速度就越慢。如果用 count(*), SQL SERVER会自动查找最小字段来汇总。当然,如果您直接写count(主键)将会来的更直接些
(4)有嵌套查询时,尽可能在内层过滤掉数据
如果一个列同时在主查询和where子句中出现,很可能当主查询中的列值改变之后,子查询必须重新查询一次。而且查询嵌套层次越多,效率越低,因此应当尽量避免子查询。如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行
(5)多表关联查询时,需注意表顺序,并尽可能早的过滤掉数据
在使用Join进行多表关联查询时候,应该使用系统开销最小的方案。连接条件要充份考虑带有索引的表、行数多的表,并注意优化表顺序;说的简单一点,就是尽可能早的将之后要做关联的数据量降下来。
一般情况下,sqlserver 会对表的连接作出自动优化。例如:
select name,no from A
join B on A. id=B.id
join C on C.id=A.id
where name='wang'
尽管A表在From中先列出,然后才是B,最后才是C。但sql server可能会首先使用c表。它的选择原则是相对于该查询限制为单行或少数几行,就可以减少在其他表中查找的总数据量。绝大多数情况下,sql server 会作出最优的选择,但如果你发觉某个复杂的联结查询速度比预计的要慢,就可以使用SET FORCEPLAN语句强制sql server按照表出现顺序使用表。如上例加上:SET FORCEPLAN ON…….SET FORCEPLAN OFF 表的执行顺序将会按照你所写的顺序执行。在查询分析器中查看2种执行效率,从而选择表的连接顺序。SET FORCEPLAN的缺点是只能在存储过程中使用

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

标题:深入探讨Linux中建立链接文件的重要性与示例在Linux操作系统中,链接文件是一种非常有用的概念,它可以帮助用户更好地组织和管理文件系统中的数据,提高文件的可访问性和灵活性。理解如何在Linux中建立链接文件,对于系统管理员和开发人员来说是至关重要的。本文将深入探讨Linux中建立链接文件的重要性,并通过具体的代码示例来演示其用法和作用。1.什么是

oracle索引类型有:1、B-Tree索引;2、位图索引;3、函数索引;4、哈希索引;5、反向键索引;6、局部索引;7、全局索引;8、域索引;9、位图连接索引;10、复合索引。详细介绍:1、B-Tree索引,是一种自平衡的、可以高效地支持并发操作的树形数据结构,在Oracle数据库中,B-Tree索引是最常用的一种索引类型;2、位图索引,是一种基于位图算法的索引类型等等。

MDF文件是一种常见的数据库文件格式,它是MicrosoftSQLServer数据库的主要文件之一。在数据库管理系统中,MDF文件用于保存数据库的主要数据,包括表、索引、存储过程等。建立MDF文件是创建数据库的关键步骤之一,下面将介绍一些常见的方法。使用SQLServerManagementStudio(SSMS)SQLServerManag

在主页选择加号按钮,接下来选择发起群聊,勾选要建群的联系人后完成即可。教程适用型号:iPhone13系统:IOS15.3版本:微信8.0.20解析1首先打开微信,在主页中点击右上角的加号按钮。2接下来在弹出的窗口中点击发起群聊选项。3最后在页面中勾选要建群的联系人后点击完成即可。补充:微信群聊是什么东西1微信聊天群就是腾讯企开发的一种多人聊天沟通交流的网络平台,我们可以借助互联网迅速传送语音信息、短视频、高清图片和文字内容。还可以借助微信与朋友开展形式上更为丰富多彩的类似短消息、手机彩信等形式的

解决方法有:1、检查索引值是否正确:首先确认你的索引值是否超出了数组的长度范围。数组的索引从0开始,所以最大索引值应该是数组长度减1;2、检查循环边界条件:如果是在循环中使用索引进行数组访问,要确保循环的边界条件正确;3、初始化数组:在使用数组之前,要确保数组已经被正确地初始化;4、使用异常处理:在程序中可以使用异常处理机制来捕获索引超出数组界限的错误,并进行相应的处理。

如何通过索引提升PHP与MySQL的数据分组和数据聚合的效率?引言:PHP和MySQL是目前应用最广泛的编程语言和数据库管理系统,常常被用于构建web应用程序和处理大量数据。在处理大量数据时,数据分组和数据聚合是常见的操作,但如果不合理地设计和使用索引,这些操作可能会变得非常低效。本文将介绍如何通过索引来提升PHP与MySQL的数据分组和数据聚合的效率,并提

PHP错误处理:最佳实践和建议在编写PHP代码时,错误处理是一项非常重要的任务。如果不正确地处理错误,就会导致应用程序中的漏洞和安全问题。同时,良好的错误处理还有助于提高代码的可维护性和可扩展性。本文将介绍一些PHP错误处理的最佳实践和建议,并提供一些代码示例。使用异常处理在PHP中,异常是一种用于处理运行时错误的机制。通过使用异常,可以将错误

距离Win11系统发布已经过去了一年的时间,许多人一直想知道2022年是否建议升级至Win11。实际上,如果我们目前使用的系统感觉良好并且没有遇到任何问题,那么升级并不是必须的。答:2022年不建议升级win11,因为现在win11相比win11并没有多少提升。如果我们喜欢Win11的全新界面和设置,不妨下载来试试看看。1、现在win11和win10的软件兼容性没啥区别,能在win11用的win10也能用。2、如果我们习惯了win10操作的话,win11可能还用着不习惯,很多功能找不到。3、例如
