查询表很快,查询相应的视图很慢为什么

如题所述

表之间连接的字段创建联合索引了么?另外连接条件的先后顺序也很重要。那个连接条件可以过滤掉不符合条件的数据那个字段连接条件应该在最后。如果数据量比较大,而且对数据的实时性要求不高,那么建议用oracle的物化视图来做。物化视图是介于普通视图和表之间的一种oracle专有对象,物化视图会将查询的数据缓存起来,同时可以对物化视图进行修改、查询、删除和添加操作。而且可以设置物化视图定时更新,但是定时的时间一定要大于数据查询的时间。
温馨提示:内容为网友见解,仅供参考
第1个回答  2016-12-19
表之间连接的字段创建联合索引了么?另外连接条件的先后顺序也很重要。那个连接条件可以过滤掉不符合条件的数据那个字段连接条件应该在最后。如果数据量比较大,而且对数据的实时性要求不高,那么建议用oracle的物化视图来做。物化视图是介于普通视图和表之间的一种oracle专有对象,物化视图会将查询的数据缓存起来,同时可以对物化视图进行修改、查询、删除和添加操作。而且可以设置物化视图定时更新,但是定时的时间一定要大于数据查询的时间。本回答被网友采纳
第2个回答  2021-01-23
表之间连接的字段创建bai联合du索引了么?另外连接条zhi件的先后顺序也很dao重要。那个连接条件可以过zhuan滤掉不符合条件的数据那个字段连接条件应该在最后。如果数据量比较大,而且对数据的实时性要求不高,那么建议用oracle的物化视图来做。物化视图是介于普通视图和表之间的一种oracle专有对象,物化视图会将查询的数据缓存起来,同时可以对物化视图进行修改、查询、删除和添加操作。而且可以设置物化视图定时更新,但是定时的时间一定要大于数据查询的时间。
第3个回答  2020-06-01

MySQL 8.0 推出了histogram,也叫柱状图或者直方图。先来解释下什么叫直方图。


关于直方图

我们知道,在DB中,优化器负责将SQL转换为很多个不同的执行计划,完了从中选择一个最优的来实际执行。但是有时候优化器选择的最终计划有可能随着DB环境的变化不是最优的,这就导致了查询性能不是很好。比如,优化器无法准确的知道每张表的实际行数以及参与过滤条件的列有多少个不同的值。那其实有时候有人就说了,索引不是可以解决这个问题吗?是的,不同类型的索引可以解决这个问题,但是你不能每个列都建索引吧?如果一张表有1000个字段,那全字段索引将会拖死对这张表的写入。而此时,直方图就是相对来说,开销较小的方法。

直方图就是在 MySQL 中为某张表的某些字段提供了一种数值分布的统计信息。比如字段NULL的个数,每个不同值出现的百分比、最大值、最小值等等。如果我们用过了 MySQL 的分析型引擎brighthouse,那对这个概念太熟悉了。

MySQL的直方图有两种,等宽直方图和等高直方图。等宽直方图每个桶(bucket)保存一个值以及这个值累积频率;等高直方图每个桶需要保存不同值的个数,上下限以及累计频率等。MySQL会自动分配用哪种类型的直方图,我们无需参与。

MySQL 定义了一张meta表column_statistics 来存储直方图的定义,每行记录对应一个字段的直方图,以json保存。同时,新增了一个参数histogram_generation_max_mem_size来配置建立直方图内存大小。

不过直方图有以下限制:

1. 不支持几何类型以及json。2. 不支持加密表和临时表。3. 不支持列值完全唯一。4. 需要手工的进行键值分布。

那我们来举个简单的例子说明直方图对查询的效果提升。


举例

表相关定义以及行数信息等:

    mysql> show create table t2\G

    *************************** 1. row ***************************

    Table: t2

    Create Table: CREATE TABLE `t2` (

    `id` int(11) NOT NULL AUTO_INCREMENT,

    `rank1` int(11) DEFAULT NULL,

    `rank2` int(11) DEFAULT NULL,

    `rank3` int(11) DEFAULT NULL,

    `log_date` date DEFAULT NULL,

    PRIMARY KEY (`id`),

    KEY `idx_rank1` (`rank1`),

    KEY `idx_log_date` (`log_date`)

    ) ENGINE=InnoDB AUTO_INCREMENT=49140 DEFAULT CHARSET=utf8mb4 \

    COLLATE=utf8mb4_0900_ai_ci STATS_PERSISTENT=1 STATS_AUTO_RECALC=0

    1 row in set (0.00 sec)

    mysql> select count(*) from t2;

    +----------+

    | count(*) |

    +----------+

    | 30940 |

    +----------+

    1 row in set (0.00 sec)

    同时对t2克隆了一张表t3

    mysql> create table t3 like t2;

    Query OK, 0 rows affected (0.13 sec)

    mysql> insert into t3 select * from t2;

    Query OK, 30940 rows affected (1.94 sec)

    Records: 30940 Duplicates: 0 Warnings: 0

    给表t3列rank1和log_date 添加histogram

    mysql> analyze table t3 update histogram on rank1,log_date;+--------+-----------+----------+-----------------------------------------------------+| Table | Op | Msg_type | Msg_text |+--------+-----------+----------+-----------------------------------------------------+| ytt.t3 | histogram | status | Histogram statistics created for column 'log_date'. || ytt.t3 | histogram | status | Histogram statistics created for column 'rank1'. |+--------+-----------+----------+-----------------------------------------------------+2 rows in set (0.19 sec)


    我们来看看histogram的分布状况

    mysql> select json_pretty(histogram) result from information_schema.column_statistics where table_name = 't3' and column_name = 'log_date'\G*************************** 1. row ***************************result: { "buckets": [ [ "2018-04-17", "2018-04-20", 0.01050420168067227, 4 ], ... , [ "2019-04-14", "2019-04-16", 1.0, 3 ] ], "data-type": "date", "null-values": 0.0, "collation-id": 8, "last-updated": "2019-04-17 03:43:01.910185", "sampling-rate": 1.0, "histogram-type": "equi-height", "number-of-buckets-specified": 100}1 row in set (0.03 sec)


    MySQL自动为这个字段分配了等高直方图,默认为100个桶。SQL A:

    select count(*) from t2/t3 where (rank1 between 1 and 10) and log_date < '2018-09-01';


    SQL A的执行结果:

    mysql> select count(*) from t2/t3 where (rank1 between 1 and 10) and log_date < '2018-09-01';+----------+| count(*) |+----------+| 2269 |+----------+1 row in set (0.01 sec)


    无histogram的执行计划

    mysql> explain format=json select count(*) from t2 where (rank1 between 1 and 10) and log_date < '2018-09-01'\G*************************** 1. row ***************************EXPLAIN: { "query_block": { "select_id": 1, "cost_info": { "query_cost": "2796.11" }, "table": { "table_name": "t2", "access_type": "range", "possible_keys": [ "idx_rank1", "idx_log_date" ], "key": "idx_rank1", "used_key_parts": [ "rank1" ], "key_length": "5", "rows_examined_per_scan": 6213, "rows_produced_per_join": 3106, "filtered": "50.00", "index_condition": "(`ytt`.`t2`.`rank1` between 1 and 10)", "cost_info": { "read_cost": "2485.46", "eval_cost": "310.65", "prefix_cost": "2796.11", "data_read_per_join": "72K" }, "used_columns": [ "rank1", "log_date" ], "attached_condition": "(`ytt`.`t2`.`log_date` < '2018-09-01')" } }}


    有histogram的执行计划

    mysql> explain format=json select count(*) from t3 where (rank1 between 1 and 10) and log_date < '2018-09-01'\G*************************** 1. row ***************************EXPLAIN: { "query_block": { "select_id": 1, "cost_info": { "query_cost": "0.71" }, "table": { "table_name": "t3", "access_type": "range", "possible_keys": [ "idx_rank1", "idx_log_date" ], "key": "idx_log_date", "used_key_parts": [ "log_date" ], "key_length": "4", "rows_examined_per_scan": 1, "rows_produced_per_join": 1, "filtered": "100.00", "index_condition": "(`ytt`.`t3`.`log_date` < '2018-09-01')", "cost_info": { "read_cost": "0.61", "eval_cost": "0.10", "prefix_cost": "0.71", "data_read_per_join": "24" }, "used_columns": [ "rank1", "log_date" ], "attached_condition": "(`ytt`.`t3`.`rank1` between 1 and 10)" } }}1 row in set, 1 warning (0.00 sec)

    我们看到两个执行计划的对比,有Histogram的执行计划cost比普通的sql快了好多倍。上面文字可以看起来比较晦涩,贴上两张图,看起来就很简单了。我这里举得例子相对简单,有兴趣的朋友可以更深入学习其他复杂些的例子。

Oracle 视图查询有的时候很慢,有的时候查询很快
这种情况有很多可能性,首先,你的服务器的负载情况会影响到你的数据读取速度的,如果数据库服务器执行的进程过多,会导致查询速度下降很多。另外,第一次执行同一个SQL的时候,都会比较慢一些,再次执行的时候,由于数据等还在内存内,会速度快很多。再者,在Oracle中,有共享SQL语句的机制,在第一次解析...

视图搜数据很慢
视图查询慢。因为视图是为了方便多个表联表查询是而设的,所以视图也是多个表中的字段由各个表中的关联关系二创建的一种虚拟表。它不存在与实际的数据库存储空间中。因此不能创建索引。1首先可以看下ASH中查看会话的信息,如event等。2. 查看SQL的执行计划信息,主要是为了获取涉及到了哪些 X$视图。

MySQL视图查询超慢,求解答
时间的快慢主要由索引决定,在索引都最优化的情况下才与数据量有关。视图不可能明显加快的查询速度,只是编程方便而已。

...写的函数查询很快,加了函数做条件就很慢是为什么?
查询的时候, 默认是查询第一页, 因此很快。因为只显示少部分行。例如一页20行的话, 那么也就执行你那个函数 20次。

视图超慢,要十几秒才出结果.求优化方法,在线等...
慢的原因在:,查询中出现的话数据库会解析成下面这个样子去执行。而数据库一旦使用了条件做查询的话,索引就不会用到了,因此就会造成查询过慢。建议:SELECT 。。。WHERE DELETE_FLAG='R'UNION SELECT 。。。WHERE DELETE_FLAG='X'UNION SELECT 。。。WHERE DELETE_FLAG='U'UNION SELECT 。。。W...

对视图查询与对一个表查询的速度有区别么
创建视图的过程需要消耗资源和时间的,创建好了再根据条件去查找,而且视图上也没有索引,自然慢了. 视图一般用来呈现按照特定规则进行显示的内容比较合适.

SQL 视图 不用TOP查询的时候几秒就出来了,用了TOP 20反而会超时 求解决...
依据查询条件来建主键.创建好主键之后, 数据就是按主键去排列的, 你 top 20 应该不会慢.影响数据查询速度的是 order by, 尽量不要使用, 事先都要通过创建主键把数据顺序排列好的.还有就是大数据量的时候,发现 between and 也很慢, 不如依据ID(identity(1,1))去遍历数据......

sql数据库组成视图的多个表中数据增加,视图怎么不同步变啊,愁死了...
数据表数据变动如果频率很快 视图中的数据会跟不上 因为每次运行视图查询的同时 需要读取每张表内的数据 如果数据变动频繁 开始读取大量数据的同时 已经变动 那数据肯定不是同步变的 例如:表1 20万条数据 表2 30万条数据 视图1 整合了表1表2的数据 叉乘 约35万条 读取视图1 需要15秒 先读取表1 ...

SQL视图查询跟实际表查询有什么区别莫?
没有区别,视图是将一些查询语句已经预先写好,在调用视图时同样是将那些语句执行,只不过是在你调用它的时候,它的查询结果被看过是一张表,你可以去按条件去查询~

mysql视图优化,多表关联视图,我在查询的时候很慢,该怎么优化???_百度...
这么多的join你应该是在数据库设计的时候表结构设计的不够好 - 建议采用后台数据同步的方式批量将数据整合进一张表中后定期刷新数据来平衡性能上的需求。

相似回答