- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不太熟悉查看 EXPLAIN ANALYZE 结果,我的查询速度太慢是个大问题。我试图阅读如何解释解释查询的结果,但我仍然不知道我应该寻找什么,以及可能有什么问题。我感觉某处有一些大红灯在闪烁,我只是没看到。
所以查询非常简单,看起来像这样:
EXPLAIN ANALYZE SELECT "cars".* FROM "cars" WHERE "cars"."sales_state" = 'onsale' AND "cars"."brand" = 'BMW' AND "cars"."model_name" = '318i' AND "cars"."has_auto_gear" = TRUE LIMIT 25 OFFSET 0
结果是这样的:
Limit (cost=0.00..161.07 rows=25 width=1245) (actual time=35.232..38.694 rows=25 loops=1)
-> Index Scan using index_cars_onsale_on_brand_and_model_name on cars (cost=0.00..1179.06 rows=183 width=1245) (actual time=35.228..38.652 rows=25 loops=1)
Index Cond: (((brand)::text = 'BMW'::text) AND ((model_name)::text = '318i'::text))
Filter: has_auto_gear"
Total runtime: 38.845 ms
一点背景:我在 Postgresql 9.1.6 上,在 Herokus 专用数据库上运行。我的数据库有大约 7.5Gb RAM, table 车包含 310 万行,大约 200 万行的 sales_state = 'onsale'。该表有 170 列。它使用的索引看起来像这样:
CREATE INDEX index_cars_onsale_on_brand_and_model_name
ON cars
USING btree
(brand COLLATE pg_catalog."default" , model_name COLLATE pg_catalog."default" )
WHERE sales_state::text = 'onsale'::text;
有人看到一些明显的大问题吗?
编辑:
SELECT pg_relation_size('cars'), pg_total_relation_size('cars');
pg_relation_size:2058444800pg_total_relation_size:4900126720
SELECT pg_relation_size('index_cars_onsale_on_brand_and_model_name');
pg_relation_size:46301184
SELECT avg(pg_column_size(cars)) FROM cars limit 5000;
平均:636.9732567210792995
没有限制:
EXPLAIN ANALYZE SELECT "cars".* FROM "cars" WHERE "cars"."sales_state" = 'onsale' AND "cars"."brand" = 'BMW' AND "cars"."model_name" = '318i' AND "cars"."has_auto_gear" = TRUE
Bitmap Heap Scan on cars (cost=12.54..1156.95 rows=183 width=4) (actual time=17.067..55.198 rows=2096 loops=1)
Recheck Cond: (((brand)::text = 'BMW'::text) AND ((model_name)::text = '318i'::text) AND ((sales_state)::text = 'onsale'::text))
Filter: has_auto_gear
-> Bitmap Index Scan on index_cars_onsale_on_brand_and_model_name (cost=0.00..12.54 rows=585 width=0) (actual time=15.211..15.211 rows=7411 loops=1)"
Index Cond: (((brand)::text = 'BMW'::text) AND ((model_name)::text = '318i'::text))
Total runtime: 56.851 ms
最佳答案
虽然对于像这样的简单计划没有那么有用,http://explain.depesz.com真的很有用。参见 http://explain.depesz.com/s/t4fi .请注意“统计信息”选项卡和“选项”下拉菜单。
本计划注意事项:
估计行数 (183) 与实际行数 (25) 相当。它不是数百倍,也不是 1。当涉及到行计数估计或“1 vs 非 1”问题时,您更感兴趣的是数量级。 (你甚至不需要“足够接近政府工作”的准确性——“足够接近军事承包会计”就可以了)。选择性估计和统计数据似乎是合理的。
它使用提供的两列部分索引(使用 index_cars_onsale_on_brand_and_model_name 进行索引扫描
),因此它符合部分索引条件。您可以在 Filter: has_auto_gear
中看到它。还显示了索引搜索条件。
鉴于表的行数意味着索引相当大,尤其是超过两列时,查询性能看起来还不错。匹配的行将是分散的,因此很可能每一行也需要阅读单独的页面。
我看不出有什么问题。不过,此查询可能会从 PostgreSQL 9.2 的仅索引扫描中受益匪浅。
这里可能有一些表膨胀,但考虑到 2 列索引和绝对行数,响应时间并非完全不合理,特别是对于具有 170 (!!) 列的表,可能适合相对较少的列元组到每一页。如果您可以承受一些停机时间,请尝试 VACUUM FULL
来重组表并重建索引。这将在重建表时专门锁定表一段时间。如果您无法承受停机时间,请参阅 pg_reorg和/或 CREATE INDEX CONCURRENTLY
和 ALTER INDEX ... RENAME TO
。
您可能会发现 EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
有时会提供更多信息,因为它可以显示缓冲区访问等。
可能使此查询更快的一个选项(尽管它冒着使其他查询稍微变慢的风险)是根据 brand
对表进行分区并启用 constraint_exclusion
。参见 partitioning .
关于performance - 如何理解 EXPLAIN ANALYZE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12915209/
INSERT 或 UPDATE 语句中的 EXPLAIN 关键字是执行查询,还是只是为您显示(“解释”)查询 - MySQL 新手,无法足够快地找到问题。 最佳答案 Reference说 The EX
这两个命令有什么区别? db.collection.explain().find() db.collection.find().explain() 最佳答案 正在运行 db.collection.ex
SQLite Explain(解释) 在SQLite 语句之前,可以使用 “EXPLAIN” 关键字或 “EXPLAIN QUERY PLAN” 短语,用于描述表的细节。 如果省略了 EXPLAI
我有一个查询,在 WHERE 子句之后有几个 filter 条件。 此外,大多数涉及的列都有索引。 当我运行 EXPLAIN 命令时,我看到: -> Bitmap Index Scan on fea
我需要实现对 MySQL EXPLAIN 命令输出的自动分析,它将查询标记为“坏”(例如,如果不使用索引)、“中等”(可以优化)和“好” ”。 是否有任何现有的解决方案或任何算法来实现它? 最佳答案
我在 SQL 字符串中的查询前面添加了 EXPLAIN 我在本地服务器上运行的网站的网页 但是我如何才能看到 EXPLAIN 的输出? Echo 和 print_r 都返回:资源 id #33 我如何
我有一个快速且非常简单的问题。 我有一个包含以下 SQL 的表: CREATE TABLE `users` ( `id` int(20) NOT NULL AUTO_INCREMENT, `use
我有一个缓慢的 MySQl 查询,大约需要 15 秒才能运行。所以我做了一些调查,发现我可以使用 EXPLAIN 语句来查看瓶颈在哪里。所以我这样做了,但真的无法破译这些结果。 如果我不得不尝试一下,
我在数据库中有一个“posts”表,它在 user_id 上有非唯一索引(键:MUL)。 mysql> show columns from posts; +---------+------------
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
我有一个非常大、复杂的查询,我正在尝试使用 MySQL EXPLAIN SELECT 或 EXPLAIN EXTENDED SELECT 进行优化。 如果我针对查询运行它,我会看到查询中的每个表都在
8.2.2. EXPLAIN Output Format基于以下 SQL 查询的连续优化,给出了几个 EXPLAIN 示例: EXPLAIN SELECT tt.TicketNumber, tt.Ti
下面的查询完全符合我的预期,它很直观并且不会生成中间表。缺点是需要很长时间才能完成。 在这种情况下,我要做的是逐步分解查询并创建那些中间表和索引。这一次,我想更好地处理 explain 提供的提示,并
今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情。当我们去设计数据库表结构,对操作数
Mysql Explain 这里做一个资料的全面整理。 一.语法 explain < table_name > 例如: explain select * from t3 where
MySQL的EXPLAIN命令用于SQL语句的查询执行计划(QEP)。这条命令的输出结果能够让我们了解MySQL 优化器是如何执行SQL语句的。这条命令并没有提供任何调整建议,但它能够提供重要的信息
使用方法,在select语句前加上explain就可以了: 如:explain select * from test1 EXPLAIN列的解释: table:显示
我正在使用 python shap包以更好地理解我的机器学习模型。 (来自 documentation:“SHAP(SHpley Additive exPlanations)是一种解释任何机器学习模型
如标题。我想知道我的查询是否优化得很好。 最佳答案 是的,在Cassandra 1.2中,您可以打开request tracing进行查询。 关于optimization - 有没有办法 "EXPLA
如何使用 DB2 的 Explain 功能? -- 既可以运行它,也可以使用它来优化查询。是否有更好的工具可用于 DB2? 我以前构建过查询,但我必须知道它们需要多长时间的唯一方法是运行它们并为它们计
我是一名优秀的程序员,十分优秀!