我相信,问题是不言自明的。sqlplus中的explain plan out表,看起来崩溃了。很难解释每一行。我试图设置 linesize 但它不起作用。你能提供任何建议来格式化输出吗?
解决方案:因为我正在使用 CMD。我只是在sqlplus中调整了CMD的宽度并将行大小设置为132。它按我的预期工作。
谢谢你们
我试图找到在java中的整个猪脚本上运行explain命令的方法.我使用的是PigServer,但它只提供单个查询(别名)而不是整个脚本的解释.有没有办法做这样的事情:
$ pig -x local -e 'explain -script Temp1/TPC_test.pig -out explain-out9.txt'
Run Code Online (Sandbox Code Playgroud)
但是从我的Java代码?
我想将以下计划转换为提示。我该怎么做。
这是需要较长时间的实际查询,请向我们建议相同的解决方案
SELECT AIA.INVOICE_ID,
AIA.INVOICE_NUM,
AIA.INVOICE_TYPE_LOOKUP_CODE,
AIA.BATCH_ID,
AIA.LAST_UPDATED_BY,
AIA.INVOICE_DATE,
AIA.ORG_ID,
AIA.VENDOR_ID,
AIA.INVOICE_CURRENCY_CODE,
AIA.SET_OF_BOOKS_ID,
AIA.VENDOR_SITE_ID,
AIA.INVOICE_AMOUNT,
AIA.BASE_AMOUNT
FROM AP_INVOICES_ALL AIA
WHERE AIA.INVOICE_AMOUNT = 0
AND AIA.SET_OF_BOOKS_ID = 1
AND AIA.CANCELLED_DATE is null
AND EXISTS
(SELECT 1
FROM AP_INVOICE_DISTRIBUTIONS_ALL AIDA,
GL_CODE_COMBINATIONS GCC,
FND_LOOKUP_VALUES_VL FLVC
WHERE AIDA.INVOICE_id=AIA.INVOICE_id
AND AIDA.ACCOUNTING_DATE BETWEEN '01-apr-2006' AND
sysdate
AND GCC.CODE_COMBINATION_ID= AIDA.DIST_CODE_COMBINATION_ID
AND FLVC.LOOKUP_CODE=GCC.SEGMENT7
AND FLVC.LOOKUP_TYPE = 'NATURAL_ACCT_SERVICE_TAX'
AND FLVC.DESCRIPTION IN
('Service Tax', 'Secondary High Edu',
'Education Cess'));
Run Code Online (Sandbox Code Playgroud)
这是计划
SELECT STATEMENT, GOAL = ALL_ROWS Cost=43 Cardinality=1 Bytes=83
FILTER Parent …
Run Code Online (Sandbox Code Playgroud) 关于查询优化,我想知道以下语句是否得到优化:
select *
from (
select *
from table1 t1
join table2 t2 using (entity_id)
order by t2.sort_order, t1.name
) as foo -- main query of object
where foo.name = ?; -- inserted
Run Code Online (Sandbox Code Playgroud)
考虑到查询是由依赖对象处理的,但只是(正确?)允许一个 WHERE 条件。我认为至少不会有很多数据被提取到您最喜欢的语言中,但是如果这是一个足够的优化并且可能数据库仍然需要一些时间来完成查询,我会重新考虑。
或者最好去掉那个查询并编写一个单独的查询方法,它也有 where 和一个LIMIT 1
子句?
我知道这似乎是一个简单的问题 - 您可能认为存在现有的答案。然而 ...
了解我希望它具有合理的性能,因此它允许记录执行的每个查询(或者至少是大查询),而无需太多开销。
我的第一个想法是这个查询:
select sid,serial#,prev_sql_id from v$session where audsid=userenv('sessionid');
Run Code Online (Sandbox Code Playgroud)
我的想法是,如果我在目标查询之后立即运行此命令,我将sql_id
通过 prev_sql_id 捕获正确的结果。
然而...我不是...我得到了不同的SQL...显然在我的目标 SELECT 语句和 的查询之间prev_sql_id
,运行了其他东西。在我的例子中,审计已启用,并且我正在将插入捕获到SYS.AUD$
表中。不好。
由于我这次尝试的主要目的是捕获查询的执行计划(因为它是由共享池执行和捕获的),所以我认为我可以简单地运行此查询:
SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR());
Run Code Online (Sandbox Code Playgroud)
文档指出,使用NULL
SQL_ID
as 参数,它将在最近运行的查询上运行解释计划。我希望这能解决之前的问题。然而......我得到了将完全相同的插入到SYS.AUD$
表中的计划。
您可能会说,好吧,那么只需在查询中添加注释即可轻松捕获SQL_ID
,如下所示:
SELECT /* SQL: 1234-12' */ FROM DUAL;
Run Code Online (Sandbox Code Playgroud)
然后我可以尝试按如下方式查找 SQL_ID:
SELECT * FROM V$SQLAREA WHERE sql_text like '%SQL: 1234-12%';
Run Code Online (Sandbox Code Playgroud)
这将为我提供几个可能的候选者,其中V$SQLAREA
也包括查询本身。这里的问题是我需要随机化运行的每个查询,这会导致我总是进行硬解析。
我尝试过其他解决方案来回顾历史,但这需要付出更大的代价。我尝试寻找其他解决方案。他们似乎都在某种程度上落后了。
相关文章:
explain analyze
显示 postgres 将对我的查询使用索引扫描,该查询获取行并按日期执行过滤(即2017-04-14 05:27:51.039
):
explain analyze select * from tbl t where updated > '2017-04-14 05:27:51.039';
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------
Index Scan using updated on tbl t (cost=0.43..7317.12 rows=10418 width=93) (actual time=0.011..0.515 rows=1179 loops=1)
Index Cond: (updated > '2017-04-14 05:27:51.039'::timestamp without time zone)
Planning time: 0.102 ms
Execution time: 0.720 ms
Run Code Online (Sandbox Code Playgroud)
但是运行相同的查询但使用不同的日期过滤器 '2016-04-14 05:27:51.039' 显示 postgres 将使用 seq scan 运行查询:
explain analyze select * from tbl t where updated > '2016-04-14 05:27:51.039';
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------
Seq Scan …
Run Code Online (Sandbox Code Playgroud) 我有2张桌子,"transaksi"和"buku"."transaksi"有大约250k行,buku大约有170k行.两个表都有名为"k999a"的列,两个表都不使用索引.现在我检查这两个陈述.
声明1:
explain select k999a from transaksi where k999a not in (select k999a from buku);
Run Code Online (Sandbox Code Playgroud)
声明1输出:
Seq Scan on transaksi (cost=0.00..721109017.46 rows=125426 width=9)
Filter: (NOT (SubPlan 1))
SubPlan 1
-> Materialize (cost=0.00..5321.60 rows=171040 width=8)
-> Seq Scan on buku (cost=0.00..3797.40 rows=171040 width=8)
Run Code Online (Sandbox Code Playgroud)
声明2:
explain select k999a from transaksi where k999a in (select k999a from buku);
Run Code Online (Sandbox Code Playgroud)
声明2输出:
Hash Semi Join (cost=6604.40..22664.82 rows=250853 width=9)
Hash Cond: (transaksi.k999a = buku.k999a)
-> Seq Scan on transaksi (cost=0.00..6356.53 rows=250853 width=9)
-> Hash (cost=3797.40..3797.40 rows=171040 width=8) …
Run Code Online (Sandbox Code Playgroud) 我知道如果数据是唯一的,理论上唯一索引会比非唯一索引更快。
因为唯一索引能够提供更多的信息,让查询优化器选择更有效的执行计划。
我正在做一些测试,想证明唯一索引可能比执行计划中的非唯一索引更好,但结果显示它们是相同的......
CREATE TABLE T3(
ID INT NOT NULL,
val INT NOT NULL,
col1 UUID NOT NULL,
col2 UUID NOT NULL,
col3 UUID NOT NULL,
col4 UUID NOT NULL,
col5 UUID NOT NULL,
col6 UUID NOT NULL
);
CREATE INDEX IX_ID_T3 ON T3 (ID);
CREATE UNIQUE INDEX UIX_ID_T3 ON T3 (ID);
INSERT INTO T3
SELECT i,
RANDOM() * 1000000,
md5(random()::text || clock_timestamp()::text)::uuid,
md5(random()::text || clock_timestamp()::text)::uuid,
md5(random()::text || clock_timestamp()::text)::uuid,
md5(random()::text || clock_timestamp()::text)::uuid,
md5(random()::text || clock_timestamp()::text)::uuid,
md5(random()::text || clock_timestamp()::text)::uuid
FROM generate_series(1,1000000) …
Run Code Online (Sandbox Code Playgroud) 有谁知道如何减少在MS SQL Server中SQL查询的执行计划中可以看到的"执行次数"?
我们有一个在一个生产服务器上运行缓慢的查询(其他都很好).检查执行计划时,我们发现其中一个步骤是聚集索引扫描.在运行正常的服务器上,此扫描执行一次.在运行缓慢的那个上,执行4次.
我们在这里阅读(http://www.sql-server-performance.com/tips/query_execution_plan_analysis_p2.aspx)您应该尝试减少它,但我们找不到有关如何执行此操作的任何提示.
两台服务器都运行相同版本的Windows(2003)和SQL Server(2000).
任何帮助,将不胜感激.
浏览器在生成jasper报告[PDF格式]时被绞死,该报告运行查询,其解释计划如下.
请帮忙分析查询,这个查询花了太多时间吗?我们还注意到在生成此报告时卡住了线程.
oracle performance query-optimization explain sql-execution-plan
oracle ×4
postgresql ×4
explain ×3
sql ×3
apache-pig ×1
indexing ×1
java ×1
mysql ×1
performance ×1
sql-server ×1
sqlplus ×1
unique-index ×1