1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
SELECT ID FROM TABLE_NAME WHERE NUMBER IS NULL
可以在NUMBER上设置默认值,确保表中NUMBER列没有NULL值,然后这样查询:
SELECT ID FROM TABLE_NAME WHERE NUMBER = 0
3.应尽量避免在
WHERE子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
4.应尽量避免在
WHERE子句中使用
OR来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
SELECT ID FROM TABLE_NAME WHERE NUMBER = 10 OR NUMBER = 20
可以修改为:
SELECT ID FROM TABLE_NAME WHERE NUMBER = 10
UNION ALL
SELECT ID FROM TABLE_NAME WHERE NUMBER = 20
5.IN和NOT IN也要慎用,否则会导致全表扫描,如:
SELECT ID FROM TABLE_NAME WHERE NUMBER IN(1,2,3)
对于连续的数值,能用 BETWEEN 就不要用IN
SELECT ID FROM TABLE_NAME WHERE NUMBER BETWEEN 1 AND 3
6.下面的查询也将导致全表扫描:
SELECT ID FROM TABLE_NAME WHERE NAME LIKE '%ABC%'
若要提高效率,可以考虑全文检索
7.如果在WHERE子句中使用参数,也会导致全表扫描。
因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:
SELECT ID FROM TABLE_NAME WHERE NUMBER=@num
可以改为强制查询使用索引
SELECT ID FROM TABLE_NAME WITH(INDEX(INDEX_NAME)) WHERE NUMBER=@num
8.应尽量避免在
WHERE子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。
SELECT ID FROM TABLE_NAME WHERE NUMBER/2 = 100
应该为:
SELECT ID FROM TABLE_NAME WHERE NUMBER = 100 * 2
9.应尽量避免在WHERE子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:
SELECT ID FROM TABLE_NAME WHERE SUBSTRING(NAME,1,3) = 'ABC'
--NAME以ABC开头的ID
SELECT ID FROM TABLE_NAME WHERE DATEDIFF(DAY,CREATEDATE,'2005-11-39') = 0
-- '2005-11-30'生成的ID
SELECT ID FROM TABLE_NAME WHERE NAME LIKE 'ABC%'
SELECT ID FROM TABLE_NAME WHERE CREATEDATE >= '2005-11-30'
AND CREATEDATE < '2005-12-1'
10.不要在
WHERE子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
11.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
12.不要写一些没有意义的查询,如需要生成一个空表结构:
SELECT COL_1,COL_2 INTO #TABLE_NAME FROM TABLE_NAME WHERE 1 = 0
这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这样:
CREATE TABLE #TABLE_NAME(...)
13.很多时候用EXISTS代替IN是一个好的选择:
SELECT NUMBER FROM TABLE_NAME WHERE NUMBER IN (SELECT NUMBER FROM TABLE_NAME2)
SELECT NUMBER FROM TABLE_NAME WHERE EXISTS(SELECT 1 FROM TABLE_NAME2 WHERE NUMBER = TABLE_NAME.NUMBER)
14.并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引。
如一表中有字段SEX、MALE、FEMALE几乎各一半,那么即使在SEX上建了索引也对查询效率起不了作用。
15.索引并不是越多越好,索引固然可以提高相应的 SELECT的效率,但同时也降低了INSERT及UPDATE的效率,因为
INSERT或
UPDATE时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。
16.应尽可能的避免更新CLUSTERED索引数据列,因为
CLUSTERED索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。若应用系统需要频繁更新
CLUSTERED索引数据列,那么需要考虑是否应将该索引建为
CLUSTERED索引。
17.尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
18.尽可能的使用
VARCHAR/NVARCHAR代替
CHAR /NVARCHAR ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
19.任何地方都不要使用
SELECT * FROM
TABLE_NAME,用具体的字段列表代替“*”,不要返回用不到的任何字段。
20.尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限(只有主键索引)。
21.避免频繁创建和删除临时表,以减少系统表资源的消耗。
22.临时表并不是不可使用,适当地使用它们可以使某些例程更有效。
例如,当需要重复引用大型表或常用表中的某个数据集时。但是,对于一次性事件,最好使用导出表。
23.在新建临时表时,如果一次性插入数据量很大,那么可以使用SELECT INTO代替CREATE TABLE,避免造成大量 LOG ,以提高速度;如果数据量不大,为了缓和系统表的资源,应先CREATE TABLE,然后INSERT。
24.如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先
TRUNCATE TABLE,然后DROP TABLE,这样可以避免系统表的较长时间锁定。
25.尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。
26.使用基于游标的方法或临时表方法之前,应先寻找基于集的解决方案来解决问题,基于集的方法通常更有效。
27.与临时表一样,游标并不是不可使用。对小型数据集使用
FAST_FORWARD游标通常要优于其他逐行处理方法,尤其是在必须引用几个表才能获得所需的数据时。在结果集中包括“合计”的例程通常要比使用游标执行的速度快。如果开发时间允许,基于游标的方法和基于集的方法都可以尝试一下,看哪一种方法的效果更好。
28.在所有的存储过程和触发器的开始处设置
SET NOCOUNT ON。
在结束时设置 SET NOCOUNT OFF。
无需在执行存储过程和触发器的每个语句后向客户端发送 DONE_IN_PROC消息。
29.尽量避免大事务操作,提高系统并发能力。
30.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。
分享到:
相关推荐
c语言盒子接球游戏源码
YOLOv8-streamlit-app软件,使用yolov8做的物体识别语义分割姿态检测,使用streamlit做的显示界面。下载即可运行,可做毕业设计。
MATLAB与计算物理课程 (第十周)第三章线性方程组的迭代法 共70页.pptx
在线日语培训平台 SSM毕业设计 附带论文 启动教程:https://www.bilibili.com/video/BV1GK1iYyE2B
c语言学生信息系统
Java大学生体质检测管理系统源码 大学生体质管理平台源码 源码描述 作为对大学生健康的监测的信息系统,其主要的工作是对相关数据的收集预测和给予正确的评价。 因此,该系统的设计目标则主要包括以下几个方面: 1)可应用于对学生相关健康数据的收集、存储、传递、维护和加工; 2)通过系统可对学生的相关身体健康情况进行科学的分析,并给予学生老师给出比较客观的评价指标。 3)具有一定的延展性可根据体育教学的需要,添加其他功能模块的系统。
技术资料分享DHT11很好的技术资料.zip
JNI 简介与实现
# 基于PyTorch框架的医学图像分割系统 ## 项目简介 本项目是一个基于PyTorch框架的医学图像分割系统,旨在利用深度学习模型对医学图像进行精确分割。系统中包含了用于图像分割的UNet模型,以及用于处理医学图像数据集的脚本和工具。项目还包含了用于训练模型的脚本,以及用于评估模型性能的指标计算和可视化工具。 ## 主要特性和功能 1. UNet模型实现项目中使用了UNet架构,用于对医学图像进行分割。该模型可根据不同的backbone(如VGG或ResNet)进行初始化,并支持冻结和解冻backbone的参数,以适应不同的训练需求。 2. 医学图像数据集处理项目提供了处理医学图像数据集的脚本,包括从原始数据中提取标注信息、生成训练、验证和测试集,以及进行数据增强和预处理等操作。
SQLite数据库工具
3d打印机,Prusa3D
c语言五子棋源码
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
# 基于Spring Boot和MyBatis的宿舍管理系统 ## 项目简介 本项目是一个基于Spring Boot和MyBatis框架开发的宿舍管理系统,旨在为学生、宿管和后勤人员提供一个高效的管理平台。系统支持用户管理、房间管理、楼宇管理、维修申请等功能,并具备人性化的宿舍分配和可视化的账单管理。 ## 项目的主要特性和功能 1. 用户管理系统中的用户分为学生、宿管和后勤三类,每类用户拥有不同的操作权限。 2. 房间管理支持房间的创建、删除、更新和查询操作,以及房间容量的调整。 3. 楼宇管理支持楼宇的创建、删除、更新和查询操作,以及楼宇入住率和性别信息的统计。 4. 维修申请学生可以提交维修申请,宿管和后勤人员可以管理和处理这些申请。 5. 账单管理支持账单的创建、删除、更新和查询操作,以及Excel文件的上传和数据导入。 6. 宿舍分配系统提供人性化的宿舍分配功能,支持根据学生的意向进行分配。
下载解压后,得到一个tcping.exe ,将tcping.exe 放到C盘Windows路径下。
JNI编程指南
技术资料分享FAT32文件系统详解很好的技术资料.zip
个人日常总结,待整理 杂乱的笔记
Texiaodemo