sql查询性能
SIMPLE:简单SELECT(不使用UNION或子查询等)
PRIMARY:最外面的SELECT
UNION:UNION中的第二个或后面的SELECT语句
DEPENDENTUNION:UNION中的第二个或后面的SELECT语句,取决于外面的查询
UNIONRESULT:UNION的结果。
SUBQUERY:子查询中的第一个SELECT
DEPENDENTSUBQUERY:子查询中的第一个SELECT,取决于外面的查询
DERIVED:导出表的SELECT(FROM子句的子查询)
B. 如何进行SQL性能优化
这里分享下mysql优化的几种方法。
1、首先在打开的软件中,需要分别为每一个表创建 InnoDB FILE的文件。
C. 【查询优化】怎样用SQL语句查看查询的性能指标
(有关TSQL语句查询所产生的磁盘活动量) --显示有关由Transact-SQL 语句生成的磁盘活动量的信息 SET STATISTICS IOON--关闭有关由Transact-SQL 语句生成的磁盘活动量的信息 SET STATISTICS IOOFF 显示的信息如下: (SQL语句为:select * fromnote500)其中: 扫描计数:在查询中涉及到的表被访问的次数; 逻辑读取:从数据缓冲中读取的数据页数; 物理读取:从物理磁盘中往缓冲读取的数据页数; 预读:根据执行计划从物理磁盘中往缓冲读取的数据页数; 其中对于首次查询一般情况下会有一下关系:逻辑读取=物理读取+预读(其中的具体联系,由于已经在之前的博客文章中提到,就不再详细说明(文章名为 【查询优化】MSSQL查询执行流程)) 同理,后面的lob逻辑读取、物理读取、预读概念理解差不多,只是是对相应表进行更新或插入操作时体现。 对于扫描计数,以上图片的查询没有连接查询,因此意义不大。不过,如果连接查询来说,特别是循环查询那种,比如说自连接,如果循环次数越多,则扫描次数也就越多,则会使得查询的效率越低。这是扫描计数是一个比较重要的性能体现参数。 对于逻辑读取,由于SQLSERVER中对数据进行任何操作都要把数据读入到缓冲当中,如果逻辑读取的页数越多,则查询的性能越低。为此,逻辑读取一般都是查询性能体现的一个重要参数。 二、SET STATISTICSTIME(SQL Server解析和编译时间) 上面显示的信息表明,执行这次查询使用了多少CPU运行时间和运行查询使用了多少时间。CPU运行时间是对运行查询所需要的CPU资源的一种相对稳定的测量方法,与CPU的忙闲程度没有关系。但是,每次运行查询时这一数字也会有所不同,只是变化的范围没有总时间变化大。总时间是对查询执行所需要的时间(不计算阻塞或读数据的时间),由于服务器上的负载是在不断变化的,因此这一数据的变化范围有时会相当地大。 总的来说,量化地来看一个查询语句的性能可以在几个参数进行比较: 1、CPU时间。比较查询所要占用的CPU资源时间; 2、I/O。可以比较查询的循环扫描次数和逻辑读取的数据量;
D. SQL查询语句性能优化建议
1对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0
3.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num=10 or num=20
可以这样查询:
select id from t where num=10
union all
select id from t where num=20
5.in 和 not in 也要慎用,否则会导致全表扫描,如:
select id from t where num in(1,2,3)
对于连续的数值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
6.下面的查询也将导致全表扫描:
select id from t where name like '«c%'
若要提高效率,可以考虑全文检索。
7.如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:
select id可以改为强制查询使用索引:
select id from t with(index(索引名)) where num=@num
8.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where num/2=100
应改为:
select id from t where num=100*2
9.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where substring(name,1,3)='abc'--name以abc开头的id
select id from t where datediff(day,createdate,'2005-11-30')=0--‘2005-11-30’生成的id
应改为:
select id from t where name like 'abc%'
select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'
10.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
11.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致
12.不要写一些没有意义的查询,如需要生成一个空表结构:
select col1,col2 into #t from t where 1=0
这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这样:
create table #t(...)
13.很多时候用 exists 代替 in 是一个好的选择:
select num from a where num in(selectnum from b)
用下面的语句替换:
select num from a where exists(select 1 from b where num=a.num)
14.并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。
15.索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。
16.应尽可能的避免更新 clustered 索引数据列,因为 clustered 索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。若应用系统需要频繁更新 clustered 索引数据列,那么需要考虑是否应将该索引建为 clustered 索引。
17.尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
18.尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
19.任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。
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.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。
E. 百万数据下几种SQL性能测试
由于在参与的实际项目中发现当mysql表的数据量达到百万级时,普通SQL查询效率呈直线下降,而且如果where中的查询条件较多时,其查询速度简直无法容忍。曾经测试对一个包含400多万条记录(有索引)的表执行一条条件查询,其查询时间竟然高达40几秒,相信这么高的查询延时,任何用户都会抓狂。因此如何提高sql语句查询效率,显得十分重要。以下是网上流传比较广泛的30种SQL查询语句优化方法:
1、应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
2、对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
3、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0
F. SQL常见优化Sql查询性能的方法有哪些
SQL常见优化Sql查询性能的方法有哪些
可以通过如下方法来优化查询 1、把数据、日志、索引放到不同的I/O设备上,增加读取速度,以前可以将Tempdb应放在RAID0上,SQL2000不在支持。数据量(尺寸)越大,提高I/O越重要. 2、纵向、横向分割表,减少表的尺寸(sp_spaceuse) 3、升级硬件 4、根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。注意填充因子要适当(最好是使用默认值0)。索引应该尽量小,使用字节数小的列建索引好(参照索引的创建),不要对有限的几个值的字段建单一索引如性别字段
G. 如何使用loadrunner测试SQL查询语句的性能
第一步测试准备 第二步配置ODBC数据源 第三步录制SQL语句在Sql Server查询分析器中的运行过程 第四步优化录制脚本设置事务 第五步改变查询数量级查看SQL语句的性能 第六步在controller中运行脚本 下面开始具体的介绍 测试准备阶段我们首先要确认测试数据库服务器我们可以在本地安装SQLSERVER数据库服务端及客户端也可以确定一台装好的SQL SERVER服务器 接下来准备测试数据对数据库测试时我们要考虑的不是SQL语句是否能够正确执行而是在某数量级的情况下SQL语句的执行效率及数据库服务的运行情况所以我们分别准备不同数量级的测试数据即根据实际的业务情况预估数据库中的记录数在本次讲解中我们不考虑业务逻辑也不考虑数据表之间的关系我们只建立一张表并向此表中加入不同数量级的数据如分别加入条条条条数据查看某SQL语句的执行效率 在查询分析器中运行如下脚本 创建测试数据库 create database loadrunner_test; use loadrunner_test 创建测试数据表 create table test_table (username varchar()sex intage intaddress varchar()post int) 通过一段程序插入不同数量级的记录具体的语法在这里就不多说了 declare @i int set @i=while @i< //循环次可以根据测试数据情况改变插入条数 begin BEGIN TRAN T insert into test_table (usernamesexageaddresspost) values (户瑞海+cast(@i as varchar)@i@i+北京市和平里+cast(@i as varchar)+号); IF @@ERROR <> begin rollback; select @@error end else begin commit; set @i = @i+ end end 好了执行完上述语句后建立的数据表中已经有条记录了下面进行第二步的操作配置ODBC数据源为了能让loadrunner能够通过ODBC协议连接到我们建立的SQL SERVER数据路我们需要在本机上建立ODBC数据源建立方法如下 控制面板—性能和维护—管理工具—数据源(ODBC)添加在列表中选择SQL SERVER点击完成根据向导输入数据源名称链接的服务器下一步输入链接数据库的用户名和密码更改链接的数据库完成ODBC的配置如果配置正确的话在最后一步点击测试数据源会弹出测试成功的提示 配置好ODBC数据源后就要录制SQL语句在查询分析器中的执行过程了 打开loadrunner选择ODBC协议 在start recording中的application type 选择win applicationprogram to record中录入SQL SERVER查询分析器的路径\安装目录\isqlwexe 开始录制首先通过查询分析器登录SQL SERVER在打开的查询分析器窗口中输入要测试的SQL语句如select * from test_table; 在查询分析器中执行该语句执行完成后结束录制 好了现在就可以看到loadrunner生成的脚本了(由于脚本过长在这里就不粘贴了有需要的朋友可以加我QQ我把脚本发给你们)通过这些语句我们可以看出登录数据库的过程执行SQL语句的过程 接下来我们来优化脚本我们分别为数据库登录部分和执行SQL语句的部分加一个事物在增加一个double的变量获取事务执行时间简单内容如下 Action() { double trans_time; //定义一个double型变量用来保存事务执行时间 lr_start_transaction(sqserver_login); //设置登录事务的开始 lrd_init(&InitInfo DBTypeVersion); //初始化链接(下面的都是loadrunner生成的脚本了大家可以通过帮助查到每个函数的意思) lrd_open_context(&CtxLRD_DBTYPE_ODBC ); lrd_db_option(Ctx OT_ODBC_OV_ODBC ); lrd_alloc_connection(&Con LRD_DBTYPE_ODBC Ctx /*Unused*/ ); ……………… trans_time=lr_get_transaction_ration( sqserver_login ); //获得登录数据库的时间 lr_output_message(sqserver_login事务耗时 %f 秒 trans_time); //输出该时间 lr_end_transaction(sqserver_login LR_AUTO); //结束登录事务 lr_start_transaction(start_select);//开始查询事务 lrd_cancel( Csr /*Unused*/ ); lrd_stmt(Csr select * from test_table;\r\n /*None*/ );//此句为执行的SQL lrd_bind_cols(Csr BCInfo_D ); lrd_fetch(Csr PrintRow ); …………… trans_time=lr_get_transaction_ration( start_select ); //获得该SQL的执行时间 lr_output_message(start_select事务耗时 %f 秒 trans_time); //输出该时间 lr_end_transaction(start_select LR_AUTO); //结束查询事务 优化后在执行上述脚本后就可以得到登录到数据库的时间及运行select * from test_table这条语句的时间了当然我们也可以根据实际情况对该条语句进行参数化可以测试多条语句的执行时间也可以将该语句改为调用存储过程的语句来测试存储过程的运行时间 接下来把该脚本在controller中运行设置虚拟用户数设置集合点这些操作我就不说了但是值得注意的是没有Mercury 授权的SQL SERVER用户license在运行该脚本时回报错提示You do not have a license for this Vuser type Please contact Mercury Interactive to renew your license我们公司穷啊买不起loadrunner所以我也无法继续试验希望有license朋友们监控一下运行结果! 最起码在VUGen中运行该脚本我们可以得到任意一个SQL语句及存储过程的执行时间如果我们测试的B/S结构的程序我们也可以通过HTML协议录制的脚本在CONTROLLER中监控SQL SERVER服务器的性能情况这样两方面结合起来就可以对数据库性能做一个完整的监控了
H. sql语句性能如何优化
如何加快查询速度?
1、升级硬件
2、根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。
3、扩大服务器的内存
4、增加服务器CPU个数
5、对于大的数据库不要设置数据库自动增长,它会降低服务器的性能
6、在查询Select语句中用Where字句限制返回的行数,避免表扫描,如果返回不必要的数据,浪费了服务器的I/O资源,加重了网络的负担降低性能。如果表很大,在表扫描的期间将表锁住,禁止其他的联接访问表,后果严重。
7、查询时不要返回不需要的行、列
8、用select
top
100
/
10
Percent
来限制用户返回的行数或者SET
ROWCOUNT来限制操作的行
9、在IN后面值的列表中,将出现最频繁的值放在最前面,出现得最少的放在最后面,减少判断的次数
10、一般在GROUP
BY
个HAVING字句之前就能剔除多余的行,所以尽量不要用它们来做剔除行的工作。他们的执行顺序应该如下最优:
select的Where字句选择所有合适的行,Group
By用来分组个统计行,Having字句用来剔除多余的分组。这样Group
By
个Having的开销小,查询快.对于大的数据行进行分组和Having十分消耗资源。如果Group
BY的目的不包括计算,只是分组,那么用Distinct更快
11、一次更新多条记录比分多次更新每次一条快,就是说批处理好
I. 优化SQL 查询:如何写出高性能SQL语句
1、深入理解数据库的工作原理和数据存储的方式,不同的数据库的工作原理是不同的,mysql oracle db2等等都是不同的,更不要说一些nosql数据库和newsql数据库了。
2、理解sql语句检索数据的方式。
3、理解索引,知道怎样的字段建立怎样的索引,索引能做什么,不能做什么,合理的建立字段。
4、合理的拆分和合并表,数据放在一张表里面查询肯定比放在多张表里面级联查询要快。
5、会查看执行任务,任何数据库都有查看执行任务的方法,包括nosql数据库和newsql数据库已经一些大数据数据库;同时还要会分析执行任务,分析主要是所以的使用效率和字段数据的检索方式。
6、sql语句只是性能优化的简单方面,性能优化是从整体应用架构开始体现的,优化sql并不能够解决根本问题,当数据量达到一定级别以后,数据就不能使用关系型数据库,而要使用大数据数据库,这样sql就无用了。
7、不要刻意专注sql本身,sql只是一种查询语言,它本身与性能无关,性能优化的本质在于对存储方式和查询检索过程的深入理解。
8、任何系统功能业务的准确性至上,首先保证功能的正确性再考虑性能优化,如果功能就是数据量大,业务复杂,必须要用到低性能sql的检索方式,那么你只能妥协,否则就要弃用sql和关系型数据库另寻它路。
J. 如何监视和查看sql server的性能
监视和查看sql server的性能步骤:
1.打开sql server studio management,打开"工具"-"sql server profiler";
2.点击连接;
3.点击运行;
4.可以看到捕捉到的一些访问数据库的事件,其中有读写,点用cpu,持续时间等信息可以参考;
4.点击某个事件,可以查看具体执行了sql脚本等,进一步分析相关逻辑。