当前位置:首页 » 数据仓库 » 多程序同时查询数据库速度过慢
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

多程序同时查询数据库速度过慢

发布时间: 2022-09-25 11:09:40

Ⅰ 服务器数据库查询慢

sql Server数据库查询速度慢的原因有很多,常见的有以下几种:

1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)

2、I/O吞吐量小,形成了瓶颈效应。

3、没有创建计算列导致查询不优化。

4、内存不足

5、网络速度慢

6、查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)

7、锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)

8、sp_lock,sp_who,活动的用户查看,原因是读写竞争资源。

9、返回了不必要的行和列

10、查询语句不好,没有优化

●可以通过以下方法来优化查询 :

1、把数据、日志、索引放到不同的I/O设备上,增加读取速度,以前可以将Tempdb应放在RAID0上,SQL2000不在支持。数据量(尺寸)越大,提高I/O越重要。

2、纵向、横向分割表,减少表的尺寸(sp_spaceuse)

3、升级硬件

4、根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。注意填充因子要适当(最好是使用默认值0)。索引应该尽量小,使用字节数小的列建索引好(参照索引的创建),不要对有限的几个值的字段建单一索引如性别字段。

5、提高网速。

6、扩大服务器的内存,Windows 2000和SQL server 2000能支持4-8G的内存。

配置虚拟内存:虚拟内存大小应基于计算机上并发运行的服务进行配置。运行 Microsoft SQL Server? 2000时,可考虑将虚拟内存大小设置为计算机中安装的物理内存的1.5倍。如果另外安装了全文检索功能,并打算运行Microsoft搜索服务以便执行全文索引和查询,可考虑:将虚拟内存大小配置为至少是计算机中安装的物理内存的3倍。将SQL Server max server memory服务器配置选项配置为物理内存的1.5倍(虚拟内存大小设置的一半)。

7、增加服务器CPU个数;但是必须 明白并行处理串行处理更需要资源例如内存。使用并行还是串行程是MsSQL自动评估选择的。单个任务分解成多个任务,就可以在处理器上运行。例如耽搁查询 的排序、连接、扫描和GROUP BY字句同时执行,SQL SERVER根据系统的负载情况决定最优的并行等级,复杂的需要消耗大量的CPU的查询最适合并行处理。但是更新操作UPDATE,INSERT, DELETE还不能并行处理。

8、如果是使用like进行查询的话,简单的使用index是不行的,但是全文索引,耗空间。 like ''a%'' 使用索引 like ''%a'' 不使用索引用 like ''%a%'' 查询时,查询耗时和字段值总长度成正比,所以不能用CHAR类型,而是VARCHAR。对于字段的值很长的建全文索引。

9、DB Server 和APPLication Server 分离;OLTP和OLAP分离

10、分布式分区视图可用于实现数据库服务器联合体。

联合体是一组分开管理的服务器,但它们相互协作分担系统的处理负荷。这种通过分区数据形成数据库服务器联合体的机制能够扩大一组服务器,以支持大型的多层 Web 站点的处理需要。有关更多信息,参见设计联合数据库服务器。(参照SQL帮助文件''分区视图'')

a、在实现分区视图之前,必须先水平分区表

b、 在创建成员表后,在每个成员服务器上定义一个分布式分区视图,并且每个视图具有相同的名称。这样,引用分布式分区视图名的查询可以在任何一个成员服务器上 运行。系统操作如同每个成员服务器上都有一个原始表的复本一样,但其实每个服务器上只有一个成员表和一个分布式分区视图。数据的位置对应用程序是透明的。

11、重建索引 DBCC REINDEX ,DBCC INDEXDEFRAG,收缩数据和日志 DBCC SHRINKDB,DBCC SHRINKFILE. 设置自动收缩日志.对于大的数据库不要设置数据库自动增长,它会降低服务器的性能。

在T-sql的写法上有很大的讲究,下面列出常见的要点:首先,DBMS处理查询计划的过程是这样的:

1、 查询语句的词法、语法检查

2、 将语句提交给DBMS的查询优化器

3、 优化器做代数优化和存取路径的优化

4、 由预编译模块生成查询规划

5、 然后在合适的时间提交给系统处理执行

6、 最后将执行结果返回给用户。

其次,看一下SQL SERVER的数据存放的结构:一个页面的大小为8K(8060)字节,8个页面为一个盘区,按照B树存放。
请参考

Ⅱ 数据库表查询下载速度慢

主要原因如下:
1、没有索引或者没有用到索引,这是查询慢最常见的问题,是程序设计的缺陷。2 、
O吞吐量小,形成了瓶颈效应。3、
没有创建计算列导致查询不优化。4 、
内存不足。5 、
网络速度慢。6 、
查询出的数据量过大,可以采用多次查询,其他的方法降低数据量。7、
锁或者死锁,这也是查询慢最常见的问题,是程序设计的缺陷。
表是包含数据库中所有数据的数据库对象。表定义为列的集合。与电子表格相似,数据在表中式按行和列的格式组织排列的。表中的每一列都设计为存储某种类型的信息(例如日期、名称、美元金额或数字)。

Ⅲ 数据库查询非常慢可能是什么原因,如何解决

数据库数据表的链接形式(是否链接表在另外的一个服务器上)、数据库打开的方式(是否独占 是否有人共享打开了)、是否 一个查询 过于复杂(多表的查询 可以先建立分表查询 然后 再对这些分表查询 进行合并查询速度会相对快一些)……

计算机的配置 是否有足够的 运算内存可供使用 等等……

总之 原因很多 要视你的工作环境来判断……

Ⅳ 用PB开发的一个数据库服务器多个异地客户端使用查询更新速度慢问题解决的技术方法

处理的方法很简单:
1、并不是所有的地方都需要使用read commit的加锁级别,你从application中设置一句sqlca.lock="RU", 使用脏读,这样就可以去掉大多数不必要的SELECT行锁。然后在一定要读最新数据的地方,把SQLCA。LOCK改为RC,用完后再改回来。
这样就避免了几乎80%的阻塞。
2、对于由于行更新,或者其他UPDATE导致的锁,一般数据库会自己协调,在事务比较长的情况下,这需要你对原来的程序做适当的修改。把长事务变为几个小的事务,在事务中做更新操作,不要插入用户的交互。这是系统的设计原则。
如果你的系统对事务的要求不严格,又不想改动原来的程序,办法更简单,在前面
SQLCA。LOCK的基础上,加句SQLCA。AUTOCOMMIT=TRUE,这样每数据修改自动提交,就可以避免大多数由于更新产生的死锁和阻塞。
3、最后要对付的是刚才说的被大量应用频繁访问的表(HOT TABLE),如果你的系统允许使用RU加锁级别,那么不用太考虑,因为SELECT已经不会导致锁定了。
但是如果你不能使用RU方式(1里头提到的办法),
那么要采用这样的手段:
使用索引把更新锁,SELECT锁来分开,同时也避免SQLSERVER傻傻为了性能的原因把行锁升级为表锁。
具体办法是建立一个索引,如果可以的话使用聚集索引,因为聚集索引采用的是类似HASH的检索方式,这样当查找索引的时候,就不需要访问数据表了。
另一种办法,是将你SELECT语句中要检索的数据都加到索引中,例如你检索NAME,SEX,AGE,如果你把三个数据都加入了索引,这就意味着SELECT语句只要找到索引,就已经找到了最后要选取的数据(从索引中),这样自然不会去LOCK表了。这样做的时候要针对你的程序仔细选择索引,否则把索引变成了表的一个备份就没有意义了。

Ⅳ 我的程序,查询数据库很慢。请问怎么提高查询速度

查询慢是和表结构,语句,系统等相关的
建索引等方法都可以改善表结构,
另外如果返回数据量很大,当然会慢,所以你尽量查询相对有用的数据
再就是查询语句了
比如用in查询没有jion查询快,还有
between
改成
>
<会快
再还有,用子查询也会慢很多,
如果是一些很复杂的查询,可以改用存储过程会好点,有时用临时表会慢但,从海量数据中查询取数进行子查询又不如用临时表快,不同的问题用不同的解决方法,看你要哪种了,单看你的问题无法直接判断。
不过,优化查询句是关键的了。

Ⅵ 如何解决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 查询的优化,添加更合适的索引可以避免性能问题:执行计划使用索引并不意味着就能执行快。

Ⅶ 最近我的数据库(sql)查询速度很慢,这是什么原因

查询慢是和表结构,语句,系统等相关的 建索引等方法都可以改善表结构, 另外如果返回数据量很大,当然会慢,所以你尽量查询相对有用的数据 再就是查询语句了 比如用in查询没有jion查询快,还有 between 改成 > <会快 再还有,用子查询也会慢很多, 如果是一些很复杂的查询,可以改用存储过程会好点,有时用临时表会慢但,从海量数据中查询取数进行子查询又不如用临时表快,不同的问题用不同的解决方法,看你要哪种了,单看你的问题无法直接判断。 不过,优化查询句是关键的了。