总结SQL执行进展优化方法

在本文中,小编将与大家重点探讨SQL执行进展优化的方法。

聚集索引扫描

SELECT * FROM C_SY_Ownedstorm

聚集索引扫描比表扫描快

聚集索引扫描:发生于聚集表,也相当于全表扫描操作,但在针对聚集列的条件等操作时,效率会较好。

表扫描

SELECT *  FROM #temp

表扫描:发生于堆表,并且没有可用的索引时,会发生表扫描,表示整个表扫描一次。

测试SQL

CREATE TABLE t1(c1 INT, c2 VARCHAR (8000)); 

 GO 

 DECLARE @a INT; 

 SELECT @a = 1; 

 WHILE (@a <= 5000) 

 BEGIN       

   INSERT INTO t1 VALUES (@a, replicate('a', 5000)) 

   SELECT @a = @a + 1 

 END 

 GO
SELECT count(1) FROM t1 

group by c1

哈希匹配:

哈希匹配的作用就是把它右侧的两个表中行数比较少的那个经过哈希算法形成一个哈希表,然后再有另一个数据行数比较大的表来之前形成的哈希表中匹配查找数据,大体上就是这个么流程。但是哈希匹配操作的出现一定要提高我们的警惕,当哈希匹配右侧的两个表中的数据有一个比另一个明显的少的时候,哈希匹配的效率会比较高,反之就会影响效率。出现哈希匹配大概有这么几个情况:

有缺失或者不正确的索引

缺少where字句

在where子句中有对列的类型转换或者数据操作,这样就不能使用索引了

虽说哈希匹配在某些情况下效率会比较高,但是这并不意味着没有更好的来提高这个查询的效率,比如添加适当的索引或者通过where语句来减少数据量等方法。换句话说,当出现哈希匹配这个操作的时候,我们要引起注意,看看是否还有别的方法来提高查询效率,如果没有的话,或许哈希匹配就是最好的选择了。

聚集索引查找:

CREATE UNIQUE CLUSTERED INDEX _Id 

ON t1(c1) 

select * from t1 

where c1=3

排序:

排序是消耗性能的,sql server中排序是在数据找出来以后在进行排序的。

select * from t1
 order by desc 

循环嵌套

对于使用简单内连接的小数据量表,嵌套循环是最佳策略。最适合两个表的记录数差别非常大,并且在连接的列上都有索引的情况。嵌套循环连接所需的I/O和比较都是最少的。

嵌套循环在外表(往往是小数据量的表)中每次循环一个记录,然后在内表中查找所匹配的记录并输出。有很多关于嵌套循环策略的名字。例如,对整个表或索引进行查询,称为Naive(无知的)嵌套循环连接。使用正常索引或临时索引时,被称为索引嵌套循环连接或临时索引嵌套循环连接。

合并连接

合并连接也是在读的同时对两个存储输入的一行进行比较。在每个步骤中,比较每个输入的下一行。如果两行是相同,输出一个连接后的行并继续。如果行是不同的,舍弃两个输入行中较少的那个并继续。因为输入是存储,连接舍弃的任何行必须比两个输入中任何剩下的行要小,因此可以永不连接。合并连接不需要对两个输入中的每一行扫描。只要到了两个输入中的某一个的末尾,合并连接就会停止扫描。

嵌套循环连接总的消耗和在输入表中行的乘积成比例,不同于嵌套循环连接,合并连接的表最多读一次,总的消耗和输入行数的总数成正比例,因此何必连接对于大量的输入是较好的选择。

以上就是小编对SQL执行进展优化方法进行的总结,希望大家能有所收获。

(0)

相关推荐

  • 在大数据情况下MySQL的一种简单分页优化方法

    通常应用需要对表中的数据进行翻页,如果数据量很大,往往会带来性能上的问题: root@sns 07:16:25>select count(*) from reply_0004 where thread_id = 5616385 and deleted = 0; +----+ | count(*) | +----+ | 1236795 | +----+ 1 row in set (0.44 sec) root@sns 07:16:30>select id from reply_0004 wher

  • MySQL优化之对RAND()的优化方法

    众所周知,在MySQL中,如果直接 ORDER BY RAND() 的话,效率非常差,因为会多次执行.事实上,如果等值查询也是用 RAND() 的话也如此,我们先来看看下面这几个SQL的不同执行计划和执行耗时. 首先,看下建表DDL,这是一个没有显式自增主键的InnoDB表: 复制代码 代码如下: [yejr@imysql]> show create table t_innodb_random\G *************************** 1. row **************

  • SQL语句优化方法30例(推荐)

    1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化. 例如: SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT'; 2. /*+FIRST_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳响应时间,使资源消耗最小化. 例如: SELECT /*+FIRST_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BS

  • mysql limit分页优化方法分享

    同样是取10条数据 select * from yanxue8_visit limit 10000,10 和 select * from yanxue8_visit limit 0,10 就不是一个数量级别的. 网上也很多关于limit的五条优化准则,都是翻译自MySQL手册,虽然正确但不实用.今天发现一篇文章写了些关于limit优化的,很不错. 文中不是直接使用limit,而是首先获取到offset的id然后直接使用limit size来获取数据.根据他的数据,明显要好于直接使用limit.这

  • mysql -参数thread_cache_size优化方法 小结

    说明: 根据调查发现以上服务器线程缓存thread_cache_size没有进行设置,或者设置过小,这个值表示可以重新利用保存在缓存中线程的数量,当断开连接时如果缓存中还有空间,那么客户端的线程将被放到缓存中,如果线程重新被请求,那么请求将从缓存中读取,如果缓存中是空的或者是新的请求,那么这个线程将被重新创建,如果有很多新的线程,增加这个值可以改善系统性能.通过比较 Connections 和 Threads_created 状态的变量,可以看到这个变量的作用.(-->表示要调整的值) 根据物理

  • MYSQL表优化方法小结 讲的挺全面

    同时在线访问量继续增大 对于1G内存的服务器明显感觉到吃力严重时甚至每天都会死机 或者时不时的服务器卡一下 这个问题曾经困扰了我半个多月MySQL使用是很具伸缩性的算法,因此你通常能用很少的内存运行或给MySQL更多的被存以得到更好的性能. 安装好mysql后,配制文件应该在/usr/local/mysql/share/mysql目录中,配制文件有几个,有my- huge.cnf my-medium.cnf my-large.cnf my-small.cnf,不同的流量的网站和不同配制的服务器环

  • MySQL对limit查询语句的优化方法

    当我们的网站达到一定的规模时,网站的各种优化是必须要进行的.而网站的优化中,针对数据库各种优化是最重点的了.下面作者将要和大家分享一下MySQL数据库中的查询语句有关limit语句的优化. 大家都知道一般limit是用在分页的程序的分页上的,当你的应用数据量够小的时候,也许你感觉不到limit语句的任何问题,但当查询数据量达到一定程度的时候,limit的性能就会急剧下降.这个是通过大量实例得出来的结论. 下面通过具体的案例来说明,这里是对同一张表在不同的地方取10条数据: (1)offset比较

  • MySQL延迟关联性能优化方法

    [背景] 某业务数据库load 报警异常,cpu usr 达到30-40 ,居高不下.使用工具查看数据库正在执行的sql ,排在前面的大部分是: 复制代码 代码如下: SELECT id, cu_id, name, info, biz_type, gmt_create, gmt_modified,start_time, end_time, market_type, back_leaf_category,item_status,picuture_url FROM relation where bi

  • 总结SQL执行进展优化方法

    在本文中,小编将与大家重点探讨SQL执行进展优化的方法. 聚集索引扫描 SELECT * FROM C_SY_Ownedstorm 聚集索引扫描比表扫描快 聚集索引扫描:发生于聚集表,也相当于全表扫描操作,但在针对聚集列的条件等操作时,效率会较好. 表扫描 SELECT * FROM #temp 表扫描:发生于堆表,并且没有可用的索引时,会发生表扫描,表示整个表扫描一次. 测试SQL CREATE TABLE t1(c1 INT, c2 VARCHAR (8000)); GO DECLARE @

  • oracle 会话 死锁 执行sql 执行job的方法

    //根据用户分组会话 select t.USERNAME,count(*) from v$session t group by t.USERNAME //查找某一用户正在执行的sql_id值 select * from v$session t where t.USERNAME = 'BUDGET' and t.SQL_ID is not null //查找对应sql_id的对应sql语句 select m.SQL_TEXT from v$session t , v$sqlarea m where

  • SQL性能优化方法及性能测试

    目录 笛卡尔连接 分页limit的sql优化的几种方法 count 优化方案 笛卡尔连接 例1: 没有携带on的条件字句,此条slq查询的结构集等价于,a表包含的条数*b表包含的乘积: select * from table a cross join table b; 例2:拥有携带on字句的sql,等价于inner join: select * from table a cross join table b on a.id=b.id; 分页limit的sql优化的几种方法 规则;表包含的数据较

  • 使用MySQL的Explain执行计划的方法(SQL性能调优)

    目录 前言 1. explain的使用 2. explain字段详解 id列 select_type列 table列 partitions列 type列 system const eq_ref ref ref_or_null index_merge range index ALL possible_keys列 key列 key_len列 ref列 rows列 filtered列 Extra列 Using where Using index Using filesort Using tempora

  • MySql批量插入优化Sql执行效率实例详解

    MySql批量插入优化Sql执行效率实例详解 itemcontractprice数量1万左右,每条itemcontractprice 插入5条日志. updateInsertSql.AppendFormat("UPDATE itemcontractprice AS p INNER JOIN foreigncurrency AS f ON p.ForeignCurrencyId = f.ContractPriceId SET p.RemainPrice = f.RemainPrice * {0},

  • SQL Server并行操作优化避免并行操作被抑制而影响SQL的执行效率

    为什么我也要说SQL Server的并行: 这几天园子里写关于SQL Server并行的文章很多,不管怎么样,都让人对并行操作有了更深刻的认识. 我想说的是:尽管并行操作可能(并不是一定)存在这样或者那样的问题,但是我们不能否认并行,仍然要利用好并行. 但是,实际开发中,某些SQL语句的写法会导致用不到并行,从而影响到SQL的执行效率 所以,本文要表达的是:我们要利用好并行,不要让一些SQL的写法问题"抑制"了并行,让我们享受不了并行带来的快感 关于SQL Server的并行: 所谓的

  • SQL SERVER的优化建议与方法

    在实际的工作中,尤其是在生产环境里边,SQL语句的优化问题十分的重要,它对数据库的性能的提升也起着显著的作用.我们总是在抱怨机器的性能问题,总是在抱怨并发访问所带来的琐问题,但是如果我们对没一条SQL语句进行优化,尽管不能说可以解决全部问题,但是至少可以解决大部分问题. 1.Top排序问题. 我们经常要对表某个字段进行排序,然后取前N名.所以我们会写如下的SQL语句: select top 100 * from 表 order by Score desc 如果表非常大的话,那么这样的操作是非常消

  • SQL 语句优化方法30例

    1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化. 例如: SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT'; 2. /*+FIRST_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳响应时间,使资源消耗最小化. 例如: SELECT /*+FIRST_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BS

  • SQL查询语句优化的实用方法总结

    查询语句的优化是SQL效率优化的一个方式,可以通过优化sql语句来尽量使用已有的索引,避免全表扫描,从而提高查询效率.最近在对项目中的一些sql进行优化,总结整理了一些方法. 1.在表中建立索引,优先考虑where.group by使用到的字段. 2.尽量避免使用select *,返回无用的字段会降低查询效率.如下: SELECT * FROM t 优化方式:使用具体的字段代替*,只返回使用到的字段. 3.尽量避免使用in 和not in,会导致数据库引擎放弃索引进行全表扫描.如下: SELEC

随机推荐