- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的应用程序将接收用户提交的选择查询,而不是执行它并获得完整的结果集,在这个阶段,它只需要列名和类型。
用户将是数据分析师,所以我预计会提交很多毛茸茸的查询。随着数据量的增长,提交的查询将保留在应用程序中并经常被评估(基于触发器和 cron 的混合)。
客户端应用程序是用 python 和 sqlalchemy-core 编写的,用于与数据库交互。
目前,我在查询末尾附加一个 LIMIT 0
以仅获取结果元数据。到目前为止,这给了我可接受的结果
例子:
要检查的查询:
SELECT * FROM users
探测查询
SELECT * FROM users LIMIT 0
EXPLAIN ANALYZE
返回以下结果:
Limit (cost=0.00..0.11 rows=1 width=646) (actual time=0.001..0.001 rows=0 loops=1)
-> Seq Scan on users (cost=0.00..22457.28 rows=207728 width=646) (never executed)
Planning time: 0.067 ms
Execution time: 0.025 ms
请注意,Seq Scan on users
有一个注释(从未执行)
。
接下来我在一个更复杂的查询上尝试了 LIMIT 0
,结果如下:
EXPLAIN ANALYZE
WITH blah AS (
SELECT *
FROM users
JOIN reservation
ON reservation.user_id = users.id
)
SELECT * FROM blah
LIMIT 0
-- result:
Limit (cost=482925.94..482925.96 rows=1 width=1955) (actual time=0.001..0.001 rows=0 loops=1)
CTE blah
-> Hash Join (cost=42094.88..482925.94 rows=1563750 width=1418) (never executed)
Hash Cond: (reservation.user_id = users.id)
-> Seq Scan on reservation (cost=0.00..96868.50 rows=1563750 width=772) (never executed)
-> Hash (cost=22457.28..22457.28 rows=207728 width=646) (never executed)
-> Seq Scan on users (cost=0.00..22457.28 rows=207728 width=646) (never executed)
-> CTE Scan on blah (cost=0.00..31275.00 rows=1563750 width=1955) (never executed)
Planning time: 8.284 ms
Execution time: 0.113 ms
同样,唯一的成本是计划时间和更短的执行时间。
问题:
将总时间的上限假设为计划时间的两倍是否安全?
在 Postgresql 中,我一直认为 CTE 是优化围栏。但是,对于 LIMIT 0
,CTE 似乎没有实现 (从未执行)
。这是我可以依靠的行为吗(9.5+)
是否有更简单/更有效的方法来获取选择查询的元数据? 如果我可以假设上面的第 1 点,那么这不是一个非常重要的问题
有趣的是,您在 SELECT 查询上观察到的最大计划时间是多少?
我相当确定,即使基础表中的数据量增加,我也可以假设同一查询的计划时间相似。有没有这种情况不成立的情况?
最佳答案
我认为在大多数情况下,执行时间将大致保持不变,数据修改 CTE 除外(见下文)。
如果 CTE 从未被使用过,它就不会被执行。此规则的异常(exception)情况是 CTE 中是否存在数据修改语句;在这种情况下,始终执行 CTE。
我认为在 PL/Python 中没有更好的方法。如果您编写一个 C 函数,您可能可以准备该语句,然后获取其结果列,但这也可能很重要。
没有很棒的故事可以分享...
计划时间与表的大小无关。
关于python - LIMIT 0 的查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46833173/
好吧,我对我的页面发生的事情有点困惑。我在底部有页码, table 上摆满了 23 种不同的元素。 每个页面应一次显示 5 个项目。我显示的页面发送了一个带有 pagenumber = 不管怎样的 g
几周前我开始学习 Ada。我知道 limited 在某些情况下声明了一个有限类型,不允许复制对象 来自 Ada Reference Manual 2012 7.5 1/2 A limited type
我想按 DESC 选择日期并限制为最后 3 个,然后我需要基本上翻转最后 3 个结果,以便它们按 ASC 排序 任何帮助将不胜感激,我正在使用 postgresql 最佳答案 SELECT * FRO
SELECT * FROM mm_tfs WHERE product_slug LIKE '%football%' AND schoolid = '8' AND category_id ='2
SELECT * FROM mm_tfs WHERE product_slug LIKE '%football%' AND schoolid = '8' AND category_id ='2
我正在尝试访问按“日期”键排序的表中恒定数量的最新文档。请注意,不幸的是,日期是被实现的(不是由我......),使得该值设置为字符串,例如“2014-01-14”,或者有时“2014-01-14 2
我目前正在使用具有限制 cpu、限制内存以及保留 cpu 和内存的 Docker Swarm。 完成测试后,我想删除这些配置。我找不到任何有关如何删除这些的文章。 是否有办法通过更新来删除这些设置而不
我目前正在使用具有限制 cpu、限制内存以及保留 cpu 和内存的 Docker Swarm。 完成测试后,我想删除这些配置。我找不到任何有关如何删除这些的文章。 是否有办法通过更新来删除这些设置而不
我必须对我的数据应用分页。我通过复杂的连接查询获取数据,没有任何子查询,只有简单的连接。 假设这个查询[这是一个非常简单的查询,我有一个比这个复杂的查询] SELECT states.state
我经常制作条形图,并将条形图的值额外包含为注释 (geom_text)。通常,我更喜欢这些值右对齐(与将标签放在条形顶部相反)。在绘制多面条形图时,我将这些值放在每个组中的最大值(我之前计算过)加上我
delivery-limit 和 x-delivery-limit 有什么区别? 当我将 x-delivery-limit 设置为 RabbitMQ 队列参数时,我可以看到它限制了我的消息重新排队尝试
delivery-limit 和 x-delivery-limit 有什么区别? 当我将 x-delivery-limit 设置为 RabbitMQ 队列参数时,我可以看到它限制了我的消息重新排队尝试
我正在使用 PostgreSQL 9.3。这应该在具有 100,000 多行的任何表上重现。 EXPLAIN ANALYZE 显示使用 LIMIT 2 扫描了更多行,但我不明白为什么。 限制 1: E
我正在尝试找出是否可以在 PHP 中全局设置和取消设置 MySQL 结果的默认限制。 一些可能看起来像的伪代码: $pdo->prepare('SELECT * FROM example'); $pd
我有下面的代码片段表 在这里我必须对投票前 3 个值求和。 假设 product_id 3030 vote 列的总和为 8.1 和 3671 总和 是 5.2 在这里,我必须获得前 3 个 produ
我正在使用全文搜索来提取行。 我根据分数 (ORDER BY SCORE) 对行进行排序,然后在前 20 行 (LIMIT 20) 中,我想对结果集进行兰德 (RAND)。 因此,对于任何特定的搜索词
帮助创建搜索条件 SELECT * FROM mlt_adr_city WHERE name LIKE "Text%" AND region_id = 59 AND id <> 0 IF (name
MySQL 查询示例: SELECT message_id, message_text FROM messages LIMIT 0 , 30 我得到的这个提示是错误的: HIN
我注意到如果我将查询限制为 1 个而不是 5 个,速度会急剧下降。 SELECT he. * FROM homematic_events he WHERE he.homematic_devices_i
我需要从我的表中获取最后一个 ID,以便我可以在另一个函数中使用它我在我的存储库中创建了这个函数,但我没有工作,它显示了一个错误: [Syntax Error] line 0, col 60: Err
我是一名优秀的程序员,十分优秀!