1. 一个sql有时执行速度很快有时很慢,请问处理思路
原因有很多的。
主键约束。
当数据量达到百万以上的时候,你用主键去搜索某一条数据时速度是极快的。但当你不用主键去搜索的时候速度就降了几十倍甚至上百倍,这个是主键的好处。
索引。
当你的表字段设置有索引的时候,搜索速度比不创建索引要快几倍至几十倍。
sql语句不够优化。
在查询某数据的时候,能不用*就尽量不用,想要哪个字段就查哪个,多余的不要,这样就能达到数据传输精简化,让查询速度也能快上许多。
多表联合查询。
在大数据量的时候这个多表查询尽量不用,毕竟是很耗内存的,宁愿用其他语言循环执行简单的 select 字段 from 表名 where 条件 这样的简单sql语句,这样也能加快速度。
其他方面还有很多的,比如服务器的原因呀,数据库表结构类型呀。。。我就不多说了。
2. SQL 语句执行感觉很慢,怎么回事
到这个数量级的全部更新,肯定会很慢。
第一。你的记录不一定在同一个partition,
第二。不明白为什么那么多人建议你建索引,你建的索引越多,你的更新速度越慢,因为你更新记录的同时,还有更新索引。
第三。你必须知道更新速度慢的瓶颈在哪里。是读写太多,还是内存不够,还是CUP不够快,然后对症下药。
下面介绍两个简单的办法,也许有效:
第一:
把这个100W行的表纵向劈成两个,用外键关系连接,一个装小的,经常改变的数据比如ID,外键,状态值,时间等,另一个装大的,不经常改变的数据,比如很长的字符串,xml,text 等。
这样更新时操作小的这个表,可以大大节约内存和CPU 开销,降低磁盘操作。
坏处就是查询时会慢些。
第二:
把这100W行横向切成很多个表,比如每个月的记录装在一个表里,这样每个表的记录数可能只有几万,查询,更新都会快很多。
坏处是查询,更新都不如原来好写。
3. SQL SERVER数据库响应很慢一般都有哪些原因
数据库最主要的就是数据库设计冗余,还是sql语句之类的,还有就是用存储过程比一般的sql语句快等到;其次就是编程代码的问题,例如if
else
if
else
if
else这个判断的,如果用switch的话就会快很多
4. sql数据查询反映很慢
这个问题我也遇见过,慢的话也正常,因为数据比较多
解决办法啊,首先从表考虑,可以针对这个表建索引,
然后的话说优化查询语句,可以的话添加 with (nolock);即select * from A with (nolock) 这样
然后就是where条件了,尽量不要使用like,in这些。尽量添加where条件。
这样应该可以了,还不行的话,上网查查怎么优化DB。
5. 数据库MSSQL运行慢是什么原因
(1) 可以考虑一下索引的问题
对在你的SQL语句中WHERE子句里涉及的列, 设置为索引列, 将极大提高你的访问性能. 特别是频繁访问的表,更应该注意这个问题.
(2) 考虑存储过程的使用
对经常访问或连续操作的SQL语句,可以考虑放在存储过程中处理, 由于存储过程是预编译的, 一般可以提高速度
(3) 考虑"事务"的问题
事务中的SQL语句,在提交前会锁定相关的表,使其无法访问,直到提交为止
(4) 考虑你的连接方式, 是否用到了连接池, 一般连接池的合理使用会提高你的速度及程序的可用性.
6. 请教SQL表查询慢的原因
查询慢是和表结构,语句,系统等相关的 建索引等方法都可以改善表结构, 另外如果返回数据量很大,当然会慢,所以你尽量查询相对有用的数据 再就是查询语句了 比如用in查询没有jion查询快,还有 between 改成 > <会快 再还有,用子查询也会慢很多, 如果是一些很复杂的查询,可以改用存储过程会好点,有时用临时表会慢但,从海量数据中查询取数进行子查询又不如用临时表快,不同的问题用不同的解决方法,看你要哪种了,单看你的问题无法直接判断。 不过,优化查询句是关键的了。
7. 急死了!sql数据库访问很慢
e5504是不是不如e5450数据库方面快不了多少的!
看你内存和其他硬件都不错,CPU也不会差到哪里去的。
在访问小数量的数据时,根本感觉不到MS sql server的快呢
8. SQL语句执行很慢,怎么回事
1. 执行计划中明明有使用到索引,为什么执行还是这么慢?
2. 执行计划中显示扫描行数为 644,为什么 slow log 中显示 100 多万行?
a. 我们先看执行计划,选择的索引 “INDX_BIOM_ELOCK_TASK3(TASK_ID)”。结合 sql 来看,因为有 "ORDER BY TASK_ID DESC" 子句,排序通常很慢,如果使用了文件排序性能会更差,优化器选择这个索引避免了排序。
那为什么不选 possible_keys:INDX_BIOM_ELOCK_TASK 呢?原因也很简单,TASK_DATE 字段区分度太低了,走这个索引需要扫描的行数很大,而且还要进行额外的排序,优化器综合判断代价更大,所以就不选这个索引了。不过如果我们强制选择这个索引(用 force index 语法),会看到 SQL 执行速度更快少于 10s,那是因为优化器基于代价的原则并不等价于执行速度的快慢;
b. 再看执行计划中的 type:index,"index" 代表 “全索引扫描”,其实和全表扫描差不多,只是扫描的时候是按照索引次序进行而不是行,主要优点就是避免了排序,但是开销仍然非常大。
Extra:Using where 也意味着扫描完索引后还需要回表进行筛选。一般来说,得保证 type 至少达到 range 级别,最好能达到 ref。
在第 2 点中提到的“慢日志记录Rows_examined: 1161559,看起来是全表扫描”,这里更正为“全索引扫描”,扫描行数确实等于表的行数;
c. 关于执行计划中:“rows:644”,其实这个只是估算值,并不准确,我们分析慢 SQL 时判断准确的扫描行数应该以 slow log 中的 Rows_examined 为准。
4. 优化建议:添加组合索引 IDX_REL_DEVID_TASK_ID(REL_DEVID,TASK_ID)
优化过程:
TASK_DATE 字段存在索引,但是选择度很低,优化器不会走这个索引,建议后续可以删除这个索引:
select count(*),count(distinct TASK_DATE) from T_BIOMA_ELOCK_TASK;+------------+---------------------------+| count(*) | count(distinct TASK_DATE) |+------------+---------------------------+| 1161559 | 223 |+------------+---------------------------+
在这个 sql 中 REL_DEVID 字段从命名上看选择度较高,通过下面 sql 来检验确实如此:
select count(*),count(distinct REL_DEVID) from T_BIOMA_ELOCK_TASK;+----------+---------------------------+| count(*) | count(distinct REL_DEVID) |+----------+---------------------------+| 1161559 | 62235 |+----------+---------------------------+
由于有排序,所以得把 task_id 也加入到新建的索引中,REL_DEVID,task_id 组合选择度 100%:
select count(*),count(distinct REL_DEVID,task_id) from T_BIOMA_ELOCK_TASK;+----------+-----------------------------------+| count(*) | count(distinct REL_DEVID,task_id) |+----------+-----------------------------------+| 1161559 | 1161559 |+----------+-----------------------------------+
在测试环境添加 REL_DEVID,TASK_ID 组合索引,测试 sql 性能:alter table T_BIOMA_ELOCK_TASK add index idx_REL_DEVID_TASK_ID(REL_DEVID,TASK_ID);
添加索引后执行计划:
这里还要注意一点“隐式转换”:REL_DEVID 字段数据类型为 varchar,需要在 sql 中加引号:AND T.REL_DEVID = 000000025xxx >> AND T.REL_DEVID = '000000025xxx'
执行时间从 10s+ 降到 毫秒级别:
1 row in set (0.00 sec)
结论
一个典型的 order by 查询的优化,添加更合适的索引可以避免性能问题:执行计划使用索引并不意味着就能执行快。
9. 为什么我的SQL数据库变的很慢
如果开始的时候不是这样,那应该是数据量过大,你可以考虑备份部分数据,然后再删掉数据库中的数据;还有可能就是你电脑软件装多了,使电脑变慢了;当然,也很有可能是中毒了,杀杀毒试试
10. SQL优化,哪个大神能帮我优化一下SQL 执行需要30分钟以上太慢了,只有10000多数据
表面上看不出啥问题来。需要你自己测试一下。
1:序列获取值应该没啥问题。
2:insert 语句 应该在秒级别,测试一下 性能。
3:update语句重点测试一下,语句和数据量有点关系,和建立的索引 有点关系。
注释一些语句块,分别测试,别人没法测试
以目前的数据量
正常应该在几秒。