08r2系统服务器开索引,SQLSERVER2008R2正确使用索引

T1表 10000000万条数据,(插入时间36分钟,count(*)查询19秒,空间占用670M左右)sql

1.真正充分的利用索引

好比like '张%' 就是符合SARG(符合扫描参数)标准

而like '%张' 就不符合该标准数据库

通配符%在字符串首字符的使用会致使索引没法使用,虽然实际应用中很难避免这样用,但仍是应该对这种现象有所了解,至少知道此种用法性能是很低下的。函数

**********************************************sqlserver

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<1000000

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条数据,开销计划是同样的。server

*********************************************

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的缺点是只能在存储过程当中使用

原文:http://hi.baidu.com/mayw1985/item/2092f0427fcdf5e6dc0f6cab

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331521.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法六之直接插入排序

一、直接插入排序基本思想 直接插入排序(straight insertion sort)的做法是&#xff1a;每次从无序表中取出第一个元素&#xff0c;把它插入到有序表的合适位置&#xff0c;使有序表仍然有序。第一趟比较前两个数&#xff0c;然后把第二个数按大小插入到有序表中&#xff1b; 第…

网络——连接到server

【0】README 0.1&#xff09; 本文描述部分转自 core java volume 2 &#xff0c; 旨在理解 网络——连接到server 的基础知识 &#xff1b; 0.2&#xff09; for source code, please visit https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/…

文件服务器监控用户修改信息,文件服务器监控日志软件

文件服务器监控日志软件 内容精选换一换有以下几种现象&#xff1a;将制作好的SD卡插入开发者板并上电后&#xff0c;开发者板LED1与LED2灯状态信息异常。将制作好的SD卡插入开发者板&#xff0c;并通过USB方式连接Ubuntu服务器&#xff0c;上电、开发者板启动完成后&#xff0…

java –cp ./:_成为Java流大师–第3部分:终端操作

java –cp ./:比尔盖茨曾经说过&#xff1a;“我选择一个懒惰的人去做一件困难的事情&#xff0c;因为一个懒惰的人会找到一个简单的方法来做。” 关于流&#xff0c;没有什么比这更真实了。 在本文中&#xff0c;您将学习Stream如何通过在调用终端操作之前不对源元素执行任何计…

Oracle入门(四)之查询基本信息

一、查询基本信息 &#xff08;1&#xff09; 查询实例服务SQL> show parameter instance name&#xff08;2&#xff09;查询数据库名字SQL> show parameter db_name;&#xff08;3&#xff09;查询数据库名字SQL>select name from v$database;&#xff08;4&#xf…

网络——实现服务器

【0】README 0.1&#xff09; 本文描述部分转自 core java volume 2 &#xff0c; 旨在理解 网络——实现服务器 的基础知识 &#xff1b; 0.2&#xff09; for source code, please visit https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/ch…

image 闪烁 c# ajax updatepanel,Why doesn't asp:UpdatePanel refresh an Image?

问题I have the following UpdatePanel that gets an image from an ashx handler all of which works fine when the page is refreshed. However, when the timer fires, the label is refreshed with current time, but never the image.ImageUrl"~/getImage.ashx?cam…

kafka处理流式数据_通过Apache Kafka集成流式传输大数据

kafka处理流式数据从实时过滤和处理大量数据&#xff0c;到将日志数据和度量数据记录到不同来源的集中处理程序中&#xff0c;Apache Kafka越来越多地集成到各种系统和解决方案中。 使用CData Sync &#xff0c;可以轻松地将此类解决方案应用于任何CRM&#xff0c;ERP或Analyti…

Oracle入门(十一)之SQL

一、SQL组成 SQL的组成 核心SQL主要有四个部分&#xff1a; 1、数据定义语言即SQL DDL(Data Definition Language )&#xff0c;用于定义 SQL模式、基本表、视图、索引等结构。 CREATE、ALTER、DROP、REVOKE、GRANT2、数据操纵语言 即SQL DML(Data Manipulation Language)。 数…

常见 Java 字节码 指令 助记符

转自&#xff1a; 常见java字节码 有时候为了能理解JVM对程序所做的优化等&#xff0c;需要查看程序的字节码&#xff0c;因此知道了解一些常见的指令集很重要&#xff01; 指令码 助记符 说明 0x00 nop 什么都不做 0x01 aconst_null 将null推送至栈顶 0x02…

等价关系和等价类_确定Java等价性的新时代?

等价关系和等价类几个月前&#xff0c;我读了一篇题为“确定Java等价性的新时代&#xff1f;”的博客文章。 这在某种程度上与我当时在我那令人沮丧的副项目Java :: Geci中开发的内容非常吻合 。 我建议您暂停阅读&#xff0c;阅读原始文章&#xff0c;然后再返回此处&#xff…

数据结构(一)之链表

一、链表链表是一种物理存储单元上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 链表由一系列结点&#xff08;链表中每一个元素称为结点&#xff09;组成&#xff0c;结点可以在运行时动态生成。每个结点包括两个部分&#xff…

高级数据结构实现——自顶向下伸展树

【0】README 1&#xff09; 本文部分内容转自 数据结构与算法分析&#xff0c;旨在理解 高级数据结构实现——自顶向下伸展树 的基础知识&#xff1b; 2&#xff09; 源代码部分思想借鉴了数据结构与算法分析&#xff0c;有一点干货原创代码&#xff0c;for original source …

测试框架 如何测试私有方法_高效的企业测试–测试框架(5/6)

测试框架 如何测试私有方法本系列文章的这一部分将介绍测试框架以及我在何时以及是否应用它们方面的想法和经验。 关于测试框架的想法 我对大多数测试框架不太满意的原因是&#xff0c;按照我的观点&#xff0c;它们大多增加了语法上的便利性和便利性&#xff0c;但是本质上并…

数据结构(二)之链表反转

一、链表反转 1、反转非递归算法 2、反转递归算法 链表结点&#xff1a; package cn.edu.scau.mk;/**** author MK* param <T>*/ public class Node<T> {private T data;private Node<T> next null;public Node(T data) {this.data data;}public T getD…

web安全测试视频课程专题_有关有效企业测试的视频课程

web安全测试视频课程专题我已经制作了一些有关有效企业测试的视频。 在实际项目中&#xff0c;我仍然认为该主题非常重要。 这是我在测试Enterprise Java项目中的经验以及一些示例。 1.介绍和有效的Maven使用 在此视频中&#xff0c;我将介绍测试过程&#xff0c;并演示如何使…

网络——获取Web数

【0】README 0.1&#xff09; 本文描述转自 core java volume 2&#xff0c; 旨在理解 “网络——获取Web数” 的基础知识&#xff1b; 0.2&#xff09; for source code , please visit https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chap…

数据结构(三)之单链表反向查找

一、反向查找单链表 1、简单查找 先遍历获取单链表单长度n&#xff0c;然后通过计算得到倒数第k个元素的下标为n-k&#xff0c;然后查找下标为n-k的元素。 2、优化查找 先找到下标为k的元素为记录点p1&#xff0c;然后设置新的记录点p2的下标从0开始&#xff0c;同时遍历两个…

java使用:: 表达式_Java 13:切换表达式的增强功能

java使用:: 表达式您可能还记得我以前的文章&#xff0c;在Java 12中&#xff0c;传统的switch语句得到了增强&#xff0c;因此可以用作表达式。 在Java 13中&#xff0c;对该功能进行了进一步的更改 。 break语句不能再返回值。 相反&#xff0c;您必须使用新的yield语句&…

网络——Base64Encode(转:自定义Base64编码器——Base64Encode)

【0】README 0.1&#xff09; 本文source code 转自 core java volume 2 &#xff0c; 旨在了解 如何定义一个 编码器&#xff0c; 如Base64Encode &#xff1b; 0.2&#xff09;注意&#xff1a; 区别自定义的 Base64Encode 和 java.util.Base64 编码器 0.3&#xff09;fo…