以下的SQL语句以Northwind为例

1、不要再where子句中"="的左侧使用函数和表达式,因为系统无法应用函数或表达式中的索引

SELECT * FROM Customers WHERE Cast(CustomerID AS VARCHAR(20))='1' --Clustered Index Scan 全表扫描
SELECT * FROM Customers WHERE CustomerID ='1' --Clustered Index Seek 索引扫描

2、只返回必要的行或列
2.1 减少I/O次数
2.2 减少加载到内存的数据量

3、关于组合索引(待定)
组合索引中的顺序很重要,当查询语句中的列只能与组合索引中的第1列相匹配时,才能在查询中应用此索引

4、Distinct语句的使用原则
尽量少用,因为数据库引擎需要花费大量的时间对所有字段进行比较,过滤掉重复的记录,因此影响了查询的效率
字段较少时,可适当采用;较多时,不宜采用

5、Union语句
Union必须满足以下要求:
1、所有select语句的列数必须相同
2、所有select语句中对应列的数据类型必须兼容

执行包含Union的查询语句的过程如下:
1、依次执行所有select语句
2、将所有select语句的结果集合并为一个结果集
3、对结果集进行排序,并过滤掉重复的记录(由于需要第3步的操作,导致联合查询效率很低)
可使用union all,不用排序和过滤重复记录,效率高

6、使用存储过程
数据库引擎可以在创建存储过程时对其进行分析和优化,并可在首次执行该过程后使用该过程的内存中版本。
相对来说,每次运行sql语句时,都要从客户端重复发送,并且在sqlserver每次执行这些语句时,对其进行编译和优化。

7、如果需要多次对一个数据量非常大的表中一部分数据进行查询操作,可以将这部分数据放在临时表中,然后对临时表进行操作。

8、模糊匹配符%和索引的关系
假定有一个表Good,主键为聚集索引,类型为nvarchar(50)
SELECT * FROM Goods AS g WHERE g.GoodsName LIKE '%商品1' --Clustered Index Scan 全表扫描
SELECT * FROM Goods AS g WHERE g.GoodsName LIKE '商%品1' --Clustered Index Seek 索引扫描
SELECT * FROM Goods AS g WHERE g.GoodsName LIKE '商品1%' --Clustered Index Seek 索引扫描
结论:通配符%放在中间和后面会走索引,放在前面不会

9、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
SELECT * FROM Employees AS e WHERE e.EmployeeID =1 --走聚集索引
SELECT * FROM Employees AS e WHERE e.EmployeeID IS NULL --Constanct Scan

10、尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连 接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。

11、在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ,在结束时设置 SET NOCOUNT OFF 。无需在执行存储过程和触发器的每个语句后向客户端发送 DONE_IN_PROC 消息。

12、不用SELECT *查询

1、SELECT * 会产生额外的IO,消耗额外的带宽资源。当数据库有大量这类SQL,就会产生量变到质变。慢慢影响整个数据库的性能。

2、SELECT *会返回大量的数据,并占用内存空间,影响操作速度

3、SELECT *可能还会导致不走索引(同样的sql语句,一个select *,一个select具体字段)

  1. DROP TABLE TEST;
  2. SELECT * INTO TEST FROM sys.objects
  3.  
  4. SELECT CREATE_DATE, TYPE FROM TEST
  5. WHERE CREATE_DATE >='2013-07-09 00:00'
  6. AND CREATE_DATE <='2014-04-30 00:00'
  7. AND TYPE='S'
  8.  
  9. SELECT * FROM TEST
  10. WHERE CREATE_DATE >='2013-07-09 00:00'
  11. AND CREATE_DATE <='2014-04-30 00:00'
  12. AND TYPE='S'

13、索引的列数对扫描的影响

  1. DROP TABLE TEST;
  2. SELECT * INTO TEST FROM sys.objects --初始化表数据
  3.  
  4. DROP INDEX IDX_TEST_N1 ON TEST
  5.  
  6. --只对默写字段建索引,全表扫描比索引扫描开销小,查询不走索引,走全表扫描(Table Scan
  7. CREATE INDEX IDX_TEST_N1 ON TEST(CREATE_DATE, TYPE)
  8.  
  9. --建所有列的索引时,下面的查询会走索引(Index Seek
  10. CREATE NONCLUSTERED INDEX IDX_TEST_N1
  11. ON [dbo].[TEST] ([type],[create_date])
  12. INCLUDE ([name],[object_id],[principal_id],[schema_id],[parent_object_id],[type_desc],[modify_date],[is_ms_shipped],[is_published],[is_schema_published])
  13. GO
  14.  
  15. SET SHOWPLAN_ALL ON
  16. GO
  17. SELECT * FROM TEST
  18. WHERE CREATE_DATE >='2013-04-09 00:00'
  19. AND CREATE_DATE <='2014-04-30 00:00'
  20. AND TYPE='S'
  21. GO
  22. SET SHOWPLAN_ALL OFF;
  23. GO

14、为什么不走索引(查询条件中LastName列为非聚集索引)

  1. --批执行计划(Ctrl+L),可以查看各条语句的【查询开销】
  2. --上条语句不走LastName索引,而是走聚集扫描,是因为走索引I/O开销较大,因为数据量较小;如果数据量增加到较多时,如1k以上,则可能走索引
  3. SELECT * FROM Employees AS e WHERE e.LastName='Davolio' --
  4.  
  5. SELECT * FROM Employees AS e WITH(INDEX=LastName) WHERE e.LastName='Davolio'
  6. --批执行计划(Ctrl+L

走不走索引的影响因素

--1、查询的数据大小
--2、数据的分布
--3、I/O开销

高效SQL语句(SQL Server)的更多相关文章

  1. MySQL5.6 怎样优化慢查询的SQL语句 -- SQL优化

    上篇:MySQL5.6 怎样优化慢查询的SQL语句 -- 慢日志介绍 在实际的日志分析中,通常慢日志的log数量不少,同一时候同样的查询被记录的条数也会非常多.这里就须要怎样从慢日志查询中找到最有问题 ...

  2. php 执行大量sql语句 MySQL server has gone away

    php 设置超时时间单位秒 set_time_limit(3600);   php 设置内存限制ini_set('memory_limit', '1024M');   mysql服务端接收到的包的大小 ...

  3. 智能SQL优化工具--SQL Optimizer for SQL Server(帮助提升数据库应用程序性能,最大程度地自动优化你的SQL语句 )

    SQL Optimizer for SQL Server 帮助提升数据库应用程序性能,最大程度地自动优化你的SQL语句 SQL Optimizer for SQL Server 让 SQL Serve ...

  4. SQL Server中查询CPU占用高的SQL语句

    SQL Server中查询CPU占用高的情况,会用到sys.sysprocesses ,dm_exec_sessions ,dm_exec_requests 一.查看当前的数据库用户连接有多少 USE ...

  5. 转载:SQL Server中查询CPU占用高的SQL语句

    SQL Server中查询CPU占用高的SQL语句 SQL Server 表变量的用法 究竟什么是敏捷测试--朱少民

  6. SQL语句在数据库中是如何执行的

    第一步:应用程序把查询SQL语句发给服务器端执行 我们在数据层执行SQL语句时,应用程序会连接到相应的数据库服务器,把SQL语句发送给服务器处理. 第二步:服务器解析请求的SQL语句 SQL计划缓存, ...

  7. 不同数据库,查询前n条数据的SQL语句

    不同的数据库,支持的SQL语法略有不同,以下是不同数据库查询前n条数据的SQl语句 SQL Server(MSSQL) SELECT TOP n * FROM table_name ORACLE SE ...

  8. 标准sql语句,学习

    标准SQL语句总结标准SQL语句总结,标准SQL语言基本上适用于下面所列出的数据库软件 -------------------------------------------------------- ...

  9. 精妙SQL语句 基础

    精妙SQL语句SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作,方便自己写SQL时方便一点,想贴上来,一起看看,同时希望大家能共同多多提意见,也给我留一些更好的佳句, ...

  10. 数据库入门-基本sql语句及数据类型

    一.基本sql语句 SQL语言主要用于存取数据.查询数据.更新数据和管理关系数据库系统,SQL语言由IBM开发.SQL语言分为3种类型: #.DDL语句 数据库定义语言: 数据库.表.视图.索引.存储 ...

随机推荐

  1. vs C#数据库导入EXCLE

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  2. Dev的DocumentManager添加窗体

    1.DocumentManager要设置自己的MdiParent属性 2.主窗体设置IsMidContainer为True 3.要生成的窗体设置MdiParent为主窗体 4.正常创建窗体,然后就可以 ...

  3. 重拾C,一天一点点_12

    连续两天没写了,今天继续! sizeof 对象 或 sizeof (类型名) 返回一个整型值,等于指定对象或类型占用的存储空间字节数.(返回值是无符号整型值,其类型为size_t,在头文件<st ...

  4. 2013-10-25笔记,css: mini-width, 标准居中,样式中*号使用,背景图像位置定位

    mini-width:设置元素的最小宽度.該屬性值會對元素的寬度設置一個最小限制.因此,元素可以比制定值寬,但不能比制定值窄.不允許指定負值. 完美的居中佈局: body{text-align: ce ...

  5. BufferedInputSream和BufferedOutputSream,,,

    package cd.itcast.bufferinputstream; import java.io.BufferedInputStream; import java.io.File; import ...

  6. ASCII码详解

    ASCII码详解 ASCII码表 ASCII码大致可以分作三部分組成.第一部分是:ASCII非打印控制字符: 第二部分是:ASCII打印字符: 第三部分是:扩展ASCII打印字符. 第一部分:ASCI ...

  7. (转)Linux下用mkisofs制作光盘镜像ISO文件

    我们都知道在windows下有winiso可以将光盘制作成光盘镜像ISO文件,在linux下一个命令就搞定了.那就是mkisofs.先看看mkisofs的help. rory@dev:~$ mkiso ...

  8. 安装使用rspec

    一,安装ruby. 二,运行命令,安装rspec的gem包: gem install rspec 会看到如下的结果: Fetching: rspec-core-2.14.7.gem (100%) Fe ...

  9. IE8中JSON.stringify方法对自动转换unicode字符的解决方案

    IE8内置了JSON对象,用以处理JSON数据.与标准方法的不同,IE8的JSON.stringify会把utf-8字符转码: var str = "我是程序员" var json ...

  10. 分布式缓存Memcached

       分布式缓存服务器,既然用到数据缓存很明显就是想高效性的获取数据,大容量的存储数据.为了可以缓存大量的数据以及可以高效获取数据,那么分布式缓存数据库就要解决数据可以水平线性扩展,这样可以扩大数据容 ...