SQL语句及数据库优化

1,统一SQL语句的写法

对于以下两句SQL语句,程序员认为是相同的,数据库查询优化器认为是不同的。 所以封装成复用方法,用标准模板来控制。

select*from dual

select*From dual

其实就是大小写不同,查询分析器就认为是两句不同的SQL语句,必须进行两次解析。生成2个执行计划

2,不要把SQL语句写得太复杂

我经常看到,从数据库中捕捉到的一条SQL语句打印出来有2张A4纸这么长。一般来说这么复杂的语句通常都是有问题的。我拿着这2页长的SQL语句去请教原作者,结果他说时间太长,他一时也看不懂了。可想而知,连原作者都有可能看糊涂的SQL语句,数据库也一样会看糊涂。

比如 Select语句的结果作为子集

简化SQL语句的重要方法就是采用临时表暂存中间结果,但是,临时表的好处远远不止这些,将临时结果暂存在临时表,后面的查询就在tempdb中了,这可以避免程序中多次扫描主表 也大大减少了程序执行中“共享锁”阻塞“更新锁”,减少了阻塞,提高了并发性能。

3,必须采用绑定变量

select*from orderheader where changetime >‘2010-10-20 00:00:01‘ 
select*from orderheader where changetime >‘2010-09-22 00:00:01‘

以上两句语句,查询优化器认为是不同的SQL语句,需要解析两次。如果采用绑定变量

select*from orderheader where changetime >@chgtime

4,使用like进行模糊查询时应注意

有的时候会需要进行一些模糊查询比如

select*from contact where username like ‘%yue%’

关键词%yue%,由于yue前面用到了“%”,因此该查询必然走全表扫描,除非必要,否则不要在关键词前加%,

5,联表查询

(1)    连接字段尽量选择聚集索引所在的字段

(2)    仔细考虑where条件,尽量减小A、B表的结果集

获取下载地址  springmvc+mybatis+spring 整合 bootstrap html5

6,索引,

看sql 的性能,主要看执行计划,还有cpu成本,io成本等。这里就以一个简单的表为例。

首先,创建一个简单的表,一般会先建个主键,系统自动以主键建聚集索引。

判断是否需要优化sql的一个简单规则是:看执行计划中的操作是seek(搜索)还是scan(扫描)

是scan的话就要索引。

使用场景:

当一个系统查询比较频繁,而新建,修改等操作比较少时,可以创建覆盖索引,将查询字段和where子句里的字段全部包含在内,这样查询的速度会比以前快很多,同时也带来弊端,就是新建或修改等操作时,比没有索引或没有建立覆盖索引时的要慢。读写数据库分离也能解决问题

经常对Creator_Id字段查询,就做个索引。

对表Article的Creator_Id字段建索引

CREATE INDEX Ix_article_creatorid ON Article(Creator_Id)

set statistics io 和 set statistics,这是性能调优时查看相关cpu占用时间,IO资源数据的两个比较重要的命令

记得Order by 语句加索引

7,读写分离

当主数据库进行写操作时,数据要同步到从的数据库,这样才能有效保证数据库完整性

主从分离,对数据库层面就是数据同步或者是数据复制;从应用层讲就是请求的分离:增删改请求主库,查询请求从库

8,尽量不用select * from …..

,而要写字段名 select field1,field2,…这条没什么好说的,主要是按需查询,不要返回不必要的列和行。

9 任何对列的操作都将导致表扫描,

它包括数据库函数、计算表达式等,查询时要尽可能将操作移至等号右边

10 In 、or子句常会使索引失效

显而易见的,IN,OR扩大的查询范围。

11通常情况下,连接比子查询效率要高

必然的,需要子查询时,也是用临时表暂存中间结果

时间: 2024-10-25 10:20:32

SQL语句及数据库优化的相关文章

3,SQL语句及数据库优化

 1,统一SQL语句的写法 对于以下两句SQL语句,程序员认为是相同的,数据库查询优化器认为是不同的. 所以封装成复用方法,用标准模板来控制. select*from dual select*From dual 其实就是大小写不同,查询分析器就认为是两句不同的SQL语句,必须进行两次解析.生成2个执行计划 2,不要把SQL语句写得太复杂 我经常看到,从数据库中捕捉到的一条SQL语句打印出来有2张A4纸这么长.一般来说这么复杂的语句通常都是有问题的.我拿着这2页长的SQL语句去请教原作者,结果他说

2-06使用SQL语句创建数据库3

向现有数据库中添加文件组和数据文件几种方式以及步骤: 第一种:在视图下添加文件组和数据文件. 添加文件组的步骤: 右击你想要添加文件组的数据库点属性,然后点文件组就可以添加. 添加数据文件的步骤: 下面可以点击添加文件,打上名字就可以了. 第二种:使用SQL语句向数据库中添加文件组和数据文件. USE E_Market --添加文件组 FG1 ALTER DATABASE E_Market ADD FILEGROUP FG1 GO --为新建的文件组FG1添加数据文件 ALTER DATABAS

使用SQL语句清空数据库所有表的数据

近来发现数据库过大,空间不足,因此打算将数据库的数据进行全面的清理,但表非常多,一张一张的清空,实在麻烦,因此就想利用SQL语句一次清空所有数据.找到了三种方法进行清空.使用的数据库为MS SQL SERVER.1.搜索出所有表名,构造为一条SQL语句 declare @trun_name varchar(8000)set @trun_name='' select @trun_name=@trun_name + 'truncate table ' + [name] + ' ' from syso

使用SQL语句建立数据库

使用SQL语句建立数据库 创建一个数据库有三个名称,第一个是Create后面的数据库名称,第二个是Name的逻辑名称,第三个是Filename的物理名称. A. 创建未指定文件的数据库 Create Database TestDB --TestDB 数据库名称--DBMS里用的是这个名 B. 创建指定数据和事务日志文件的数据库 Create Database TestDB --TestDB 数据库名称--DBMS里用的是这个名 On --On 代表数据文件组( --主要数据文件Name ='Te

SQL语句创建数据库以及一些查询练习

--创建 MyCompany数据库 use master execute sp_configure 'show advanced options',1 --开启权限 reconfigure execute sp_configure 'xp_cmdshell',1 reconfigure execute xp_cmdshell 'mkdir e:\作业数据库'--自动创建文件夹 execute sp_configure 'xp_cmdshell',0--关闭权限,先关 reconfigure ex

mysql用户管理, 常用sql语句,mysql数据库备份恢复

mysql用户管理 新创建一个指定IP的用户,可以访问mysql的某些库某些表. 所有库的所有表,如果想指定访问某个库某些表,只需要修改名称user1 指定用户名br/>@后面的ip是指定ip,%表示所有的ipindentified by 后面是用户的密码验证用用户user1登录也可以指定localhost,登录时不输入本机ip地址即可访问查看授权,用于授权给新用户,新权限: 常用sql 语句 查看库表的行数搜索:select count() from mysql.user;搜索:select

Oracle - SQL语句实现数据库快速检索

SQL语句实现数据库快速检索 有时候在数据库Debug过程中,需要快速查找某个关键字. 1:使用PLSQL Dev自带的查找数据库对象,进行对象查找 缺点:查找慢.耗时. 2:使用SQL语句对数据库对象进行查找 查找数据库一般对象 1 SELECT * FROM DBA_SOURCE T WHERE UPPER(T.TEXT) LIKE '%关键字%' 查找数据库脚本 1 SELECT * FROM DBA_JOBS T WHERE UPPER(T.WHAT) LIKE '%关键字%'; 原文地

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

第一步:应用程序把查询SQL语句发给服务器端执行 我们在数据层执行SQL语句时,应用程序会连接到相应的数据库服务器,把SQL语句发送给服务器处理. 第二步:服务器解析请求的SQL语句 SQL计划缓存,经常用查询分析器的朋友大概都知道这样一个事实,往往一个查询语句在第一次运行的时候需要执行特别长的时间,但是如果你马上或者在一定时间内运行同样的语句,会在很短的时间内返回查询结果.原因是: 服务器在接收到查询请求后,并不会马上去数据库查询,而是在数据库中的计划缓存中找是否有相对应的执行计划.如果存在,

几百行SQL语句如何进行优化?

1.对于当下的ORM 框架 EF 以及其他的一些的开源的框架例如Drapper ,以及Sqlite-Sugar 等等,对于查询的速度以及性能确实还不错,但是对于几百条的SQL语句 那么可能就不行了.当在写SQL语句需要注意的规则都无法提高速率的时候,个人认为还是需要传统的ADO.NET 参数化的SQL来进行解决问题. 2.花了2天时间写的SQL查询月结算历史的数据 1 select 2 sum(case when indentdate >= '2015-11-28 00:00:00' and 3