sql-execution-plan相关内容

DBMS优化器-最佳执行计划,无论查询形式如何

如果在关系DBMS中编写查询Q,优化器不会选择执行它的最佳方式(取决于多个因素)吗?不管您如何表示Q,优化器都不会选择最好的方式来执行它吗?我对SQL Server和Oracle很好奇。 例如,设Q为: SELECT * FROM t1, t2 WHERE t1.some_column = t2.some_column 如果存在正确的索引(具有正确的选择性),我们应该会看到索引查 ..
发布时间:2022-03-08 13:42:50 数据库

为什么执行计划包含一个用户定义的函数调用,用于持久化计算列?

我有一个包含 2 个计算列的表,这两个列都将“Is Persisted"设置为 true.但是,在查询中使用它们时,执行计划将用于计算列的 UDF 显示为计划的一部分.既然列数据是在添加/更新行时由 UDF 计算的,为什么计划会包含它? 当这些列包含在查询中时,查询速度非常慢(> 30 秒),而当它们被排除时,查询速度非常快( 我错过了什么吗? 更新:这里是关于我们使用计算列的推理的 ..

EXPLAIN 和 COUNT 返回两个不同的值

我在做: explain select * from 校准; 它说 52133456345632 行 当我这样做时: 从校准中选择计数(*); 我收到了 52134563456961 有人能解释一下这里发生了什么吗? 解决方案 表统计信息(由 EXPLAIN 使用)基于系统缓存的值,可能不准确. http://dev.mysql.com/doc/refman/5. ..
发布时间:2021-12-30 16:33:22 数据库

Hive 解释计划理解

有没有什么合适的资源可以让我们完全理解hive生成的解释计划?我曾尝试在 wiki 中搜索它,但找不到完整的指南来理解它.这是 wiki,它简要解释了解释计划的工作原理.但我需要有关如何推断解释计划的更多信息.https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Explain 解决方案 我会尽量解释我所知道的. ..
发布时间:2021-12-28 23:41:15 其他开发

什么是“位图堆扫描"?在查询计划中?

我想知道“Bitmap heap scan"的原理,我知道这种情况经常发生当我在条件中使用 OR 执行查询时. 谁能解释一下“位图堆扫描"背后的原理? 解决方案 最好的解释来自 来自 Tom Lane,他是算法的作者,除非我弄错了.另请参阅维基百科文章. 简而言之,有点像seq扫描.不同之处在于,位图索引不是访问每个磁盘页面,而是将适用的索引 AND 和 OR 一起扫描,并且只 ..
发布时间:2021-12-21 23:40:43 其他开发

JDBC Oracle - 获取查询的解释计划

我想知道如何使用 Java 获取解释计划.我需要这个的原因是因为我们有一个框架,特殊用户可以在其中制作报告.这些报告有时会构建大量查询,我们希望在其中即时解释并存储成本.通过这种方式,我们可以稍后分析高成本查询并进行优化. 给我非法列异常的示例代码: ResultSet rs = null;尝试 {oracle = ConnectionManager.getConnection(Conne ..
发布时间:2021-12-21 19:23:20 Java开发

测量查询性能:“执行计划查询成本"vs “所用时间"

我正在尝试确定两个不同查询的相对性能,并有两种可用的测量方法: 1. 运行每个查询并计时 2. 两者都运行,从实际执行计划中得到“Query Cost" 这是我运行查询时间的代码... DBCC FREEPROCCACHE去DBCC 删除缓冲区去声明 @start DATETIME SET @start = getDate()执行测试_1aSELECT getDate() - @sta ..

SQL 操作顺序

如果我运行以下 SQL 查询 SELECT *从 A左连接 BON A.foo=B.fooWHERE A.date = "昨天" WHERE 语句是在 JOIN 之前还是之后计算的? 如果之后,编写此语句的更好方法是什么,以便仅返回 "Yesterday" 中的 A 中的行连接到 B? 解决方案 这取决于数据库. 在 SQL Server 上,运行:SET SHOWPLAN ..
发布时间:2021-12-17 20:41:30 其他开发

SQL 糟糕的存储过程执行计划性能——参数嗅探

我有一个存储过程,它接受一个日期输入,如果没有传入任何值,该输入将被设置为当前日期: 创建程序 MyProc@MyDate 日期时间 = NULL作为如果 @MyDate 为 NULL SET @MyDate = CURRENT_TIMESTAMP-- 使用@MyDate 做一些事情 我遇到了问题,如果在第一次编译存储过程时将 @MyDate 作为 NULL 传入,则所有输入值的性能总是很糟糕 ..
发布时间:2021-12-10 13:01:21 数据库

防止 PostgreSQL 有时选择错误的查询计划

我在使用 PostgreSQL 8.4.9 进行查询的 PostgreSQL 性能方面有一个奇怪的问题.此查询选择 3D 体积内的一组点,使用 LEFT OUTER JOIN 在存在相关 ID 的位置添加相关 ID 列.x 范围内的微小变化都会导致 PostgreSQL 选择不同的查询计划,执行时间从 0.01 秒到 50 秒不等.这是有问题的查询: SELECT treenode.id AS ..

从执行计划中分解 XML

在此之前我会说我讨厌 XML,它使用起来很糟糕,但有时是必要的. 我当前的问题是我试图从执行计划(由用户提供,因此可以是任何大小)中获取 XML 并将其切碎到表中以进行进一步操作.目前我只有两个选择; 我可以计算出可用于执行计划的最大节点数(我怀疑这会很多)并创建可用于任何 XML 输入的整个脚本.这将是一次性的,所以不是问题. 另一种方法是动态计算节点数量并根据要求创建输出. ..
发布时间:2021-08-25 19:14:12 数据库

使用 CTE 的 TSQL 语句的执行顺序

我正在为通用表的表运行报告.因此,“ParameterValue"字段中的值将包含来自许多不同类型的数据.我想要做的是仅在“ParameterName"列等于“Historian Timestamp"时才执行转换. 这是我正在运行的查询... WITH LogbookSourceObjects AS (SELECT CAST(obj.NAME AS INT) 作为 LogbookId, O ..
发布时间:2021-08-23 18:40:36 其他开发

执行大量读取但计划没问题的查询

我在 SQL Server 2008 R2 中的特定查询中遇到奇怪的行为.我有一个执行 1900 万次读取且非常耗时的查询,当我尝试检查其缓存计划时,该计划是可以的,没有任何问题. 执行DBCC FREEPROCCACHE 后,同一个查询进行了 400 次读取(耗时 16 毫秒).结论是不知何故以错误的计划执行查询,但这不是我从 SQL Server 获得的信息. 有人知道这是怎么回事 ..
发布时间:2021-08-23 18:40:30 数据库

重置执行计划

我正在优化一个查询,并且担心 SQL Server 正在缓存执行计划,所以想清除它们. 我该怎么做? 解决方案 你应该这样做:DBCC FREEPROCCACHE; 我也这样做DBCC DROPCLEANBUFFERS; 使用 DBCC DROPCLEANBUFFERS 测试带有冷缓冲区缓存的查询无需关闭并重新启动服务器. 要从缓冲池中删除干净的缓冲区,首先使用 C ..
发布时间:2021-08-23 18:40:24 其他开发

SQL Server 2005 缓存了一个永远无法工作的执行计划

我们有一个视图,用于通过聚集索引在表中查找记录.该视图在 select 语句中还有几个子查询,它们在两个大表中查找数据,同样通过聚集索引. 为了极大地简化,它会是这样的: 选择一个,(SELECT b FROM tableB where tableB.a=tableA.a) as b(SELECT c FROM tableC where tableC.a=tableA.a) as c从表A ..
发布时间:2021-08-23 18:40:21 数据库

Sql 索引 vs 全表扫描

在编写复杂的 SQL 查询时,我们如何确保使用正确的索引并避免全表扫描?我通过确保我只加入具有索引(主键、唯一键等)的列来做到这一点.够了吗? 解决方案 查看查询的执行计划,了解查询优化器如何认为必须检索事物.该计划通常基于表的统计信息、索引的选择性和连接的顺序.请注意,优化器可以决定执行全表扫描比索引查找“便宜". 其他需要查找的内容: 尽可能避免子查询. 尽量减少'O ..
发布时间:2021-08-23 18:40:18 其他开发

具有估计行数的表值参数 1

我在互联网上搜索了几个小时,试图找出如何使用表值参数 (TVP) 提高查询性能. 经过数小时的搜索,我终于确定了我认为是问题的根源.在检查我的查询的估计执行计划后,我发现每次使用 TVP 时,我的查询的估计行数都是 1.如果我将 TVP 交换为选择我感兴趣的数据的查询,那么估计的行数会准确得多,约为 7400.这会显着提高性能. 然而,在实际场景中,我不能使用查询,我必须使用 TVP. ..