sql-execution-plan相关内容
如果在关系DBMS中编写查询Q,优化器不会选择执行它的最佳方式(取决于多个因素)吗?不管您如何表示Q,优化器都不会选择最好的方式来执行它吗?我对SQL Server和Oracle很好奇。 例如,设Q为: SELECT * FROM t1, t2 WHERE t1.some_column = t2.some_column 如果存在正确的索引(具有正确的选择性),我们应该会看到索引查
..
我有两张大桌子: 表“public.tx_input1_new"(100,000,000 行)专栏 |类型 |修饰符----------------|-----------------------------|-----------blk_hash |字符变化(500) |blk_time |没有时区的时间戳|tx_hash |字符变化(500) |input_tx_hash |字符变化(100
..
我有一个包含 2 个计算列的表,这两个列都将“Is Persisted"设置为 true.但是,在查询中使用它们时,执行计划将用于计算列的 UDF 显示为计划的一部分.既然列数据是在添加/更新行时由 UDF 计算的,为什么计划会包含它? 当这些列包含在查询中时,查询速度非常慢(> 30 秒),而当它们被排除时,查询速度非常快( 我错过了什么吗? 更新:这里是关于我们使用计算列的推理的
..
我在做: explain select * from 校准; 它说 52133456345632 行 当我这样做时: 从校准中选择计数(*); 我收到了 52134563456961 有人能解释一下这里发生了什么吗? 解决方案 表统计信息(由 EXPLAIN 使用)基于系统缓存的值,可能不准确. http://dev.mysql.com/doc/refman/5.
..
有没有什么合适的资源可以让我们完全理解hive生成的解释计划?我曾尝试在 wiki 中搜索它,但找不到完整的指南来理解它.这是 wiki,它简要解释了解释计划的工作原理.但我需要有关如何推断解释计划的更多信息.https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Explain 解决方案 我会尽量解释我所知道的.
..
我想知道“Bitmap heap scan"的原理,我知道这种情况经常发生当我在条件中使用 OR 执行查询时. 谁能解释一下“位图堆扫描"背后的原理? 解决方案 最好的解释来自 来自 Tom Lane,他是算法的作者,除非我弄错了.另请参阅维基百科文章. 简而言之,有点像seq扫描.不同之处在于,位图索引不是访问每个磁盘页面,而是将适用的索引 AND 和 OR 一起扫描,并且只
..
我想知道如何使用 Java 获取解释计划.我需要这个的原因是因为我们有一个框架,特殊用户可以在其中制作报告.这些报告有时会构建大量查询,我们希望在其中即时解释并存储成本.通过这种方式,我们可以稍后分析高成本查询并进行优化. 给我非法列异常的示例代码: ResultSet rs = null;尝试 {oracle = ConnectionManager.getConnection(Conne
..
我正在尝试确定两个不同查询的相对性能,并有两种可用的测量方法: 1. 运行每个查询并计时 2. 两者都运行,从实际执行计划中得到“Query Cost" 这是我运行查询时间的代码... DBCC FREEPROCCACHE去DBCC 删除缓冲区去声明 @start DATETIME SET @start = getDate()执行测试_1aSELECT getDate() - @sta
..
如果我运行以下 SQL 查询 SELECT *从 A左连接 BON A.foo=B.fooWHERE A.date = "昨天" WHERE 语句是在 JOIN 之前还是之后计算的? 如果之后,编写此语句的更好方法是什么,以便仅返回 "Yesterday" 中的 A 中的行连接到 B? 解决方案 这取决于数据库. 在 SQL Server 上,运行:SET SHOWPLAN
..
我有一个存储过程,它接受一个日期输入,如果没有传入任何值,该输入将被设置为当前日期: 创建程序 MyProc@MyDate 日期时间 = NULL作为如果 @MyDate 为 NULL SET @MyDate = CURRENT_TIMESTAMP-- 使用@MyDate 做一些事情 我遇到了问题,如果在第一次编译存储过程时将 @MyDate 作为 NULL 传入,则所有输入值的性能总是很糟糕
..
我在使用 PostgreSQL 8.4.9 进行查询的 PostgreSQL 性能方面有一个奇怪的问题.此查询选择 3D 体积内的一组点,使用 LEFT OUTER JOIN 在存在相关 ID 的位置添加相关 ID 列.x 范围内的微小变化都会导致 PostgreSQL 选择不同的查询计划,执行时间从 0.01 秒到 50 秒不等.这是有问题的查询: SELECT treenode.id AS
..
在此之前我会说我讨厌 XML,它使用起来很糟糕,但有时是必要的. 我当前的问题是我试图从执行计划(由用户提供,因此可以是任何大小)中获取 XML 并将其切碎到表中以进行进一步操作.目前我只有两个选择; 我可以计算出可用于执行计划的最大节点数(我怀疑这会很多)并创建可用于任何 XML 输入的整个脚本.这将是一次性的,所以不是问题. 另一种方法是动态计算节点数量并根据要求创建输出.
..
我正在为通用表的表运行报告.因此,“ParameterValue"字段中的值将包含来自许多不同类型的数据.我想要做的是仅在“ParameterName"列等于“Historian Timestamp"时才执行转换. 这是我正在运行的查询... WITH LogbookSourceObjects AS (SELECT CAST(obj.NAME AS INT) 作为 LogbookId, O
..
我有一个相对简单的查询 SELECT, db1.something, COALESCE(db2.something_else, 'NA') 作为 something2从 dwh.db_1 AS db1左连接 dwh.db_2 AS db2 ON db1.some_id = db2 = some_id EXPLAIN 给出了超过 15 秒的估计时间. 另一方面,解释如下,我们基本上用表名替
..
我在 SQL Server 2008 R2 中的特定查询中遇到奇怪的行为.我有一个执行 1900 万次读取且非常耗时的查询,当我尝试检查其缓存计划时,该计划是可以的,没有任何问题. 执行DBCC FREEPROCCACHE 后,同一个查询进行了 400 次读取(耗时 16 毫秒).结论是不知何故以错误的计划执行查询,但这不是我从 SQL Server 获得的信息. 有人知道这是怎么回事
..
我正在优化一个查询,并且担心 SQL Server 正在缓存执行计划,所以想清除它们. 我该怎么做? 解决方案 你应该这样做:DBCC FREEPROCCACHE; 我也这样做DBCC DROPCLEANBUFFERS; 使用 DBCC DROPCLEANBUFFERS 测试带有冷缓冲区缓存的查询无需关闭并重新启动服务器. 要从缓冲池中删除干净的缓冲区,首先使用 C
..
我们有一个视图,用于通过聚集索引在表中查找记录.该视图在 select 语句中还有几个子查询,它们在两个大表中查找数据,同样通过聚集索引. 为了极大地简化,它会是这样的: 选择一个,(SELECT b FROM tableB where tableB.a=tableA.a) as b(SELECT c FROM tableC where tableC.a=tableA.a) as c从表A
..
在编写复杂的 SQL 查询时,我们如何确保使用正确的索引并避免全表扫描?我通过确保我只加入具有索引(主键、唯一键等)的列来做到这一点.够了吗? 解决方案 查看查询的执行计划,了解查询优化器如何认为必须检索事物.该计划通常基于表的统计信息、索引的选择性和连接的顺序.请注意,优化器可以决定执行全表扫描比索引查找“便宜". 其他需要查找的内容: 尽可能避免子查询. 尽量减少'O
..
我有以下查询 DECLARE @StartDate DATE = '2017-09-22'声明 @EndDate DATE = '2017-09-23'选择 a.col1,a.col2,b.col1,b.col2,b.col3,a.col3从表AJOIN 表BON b.pred = a.pred哪里 b.col2 >@StartDate AND b.col2 当我运行它并检查实际执行计划时,
..
我在互联网上搜索了几个小时,试图找出如何使用表值参数 (TVP) 提高查询性能. 经过数小时的搜索,我终于确定了我认为是问题的根源.在检查我的查询的估计执行计划后,我发现每次使用 TVP 时,我的查询的估计行数都是 1.如果我将 TVP 交换为选择我感兴趣的数据的查询,那么估计的行数会准确得多,约为 7400.这会显着提高性能. 然而,在实际场景中,我不能使用查询,我必须使用 TVP.
..