标签: sql-execution-plan

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

我想知道如何使用Java获取解释计划.我需要这个的原因是因为我们有一个特殊用户可以制作报告的框架.这些报告有时会构建大量查询,我们希望在其中动态解释并存储成本.这样我们就可以在以后分析高成本查询并进行优化.

给出非法列异常的示例代码:

ResultSet rs = null;
   try {
        oracle = ConnectionManager.getConnection(ConnectionManager.Test);
        pstmt = oracle.prepareStatement("begin execute immediate 
        'explain plan for SELECT   1 from Dual'; end;");
        rs = pstmt.executeQuery();
        while (rs.next()) {
            System.out.println(rs.getString(1));
        }
Run Code Online (Sandbox Code Playgroud)

java oracle jdbc explain sql-execution-plan

12
推荐指数
2
解决办法
1万
查看次数

MySQL,删除和索引提示

我必须根据某些条件从一个超过1亿行的表中删除大约10K行.当我执行查询时,大约需要5分钟.我运行了一个解释计划(自MySQL不支持后delete转换为查询)并发现MySQL使用了错误的索引.select *explain delete

我的问题是:有没有办法告诉MySQL在删除期间使用哪个索引?如果没有,我该怎么办?选择临时表然后从临时表中删除?

mysql query-optimization sql-execution-plan sql-delete

11
推荐指数
1
解决办法
9302
查看次数

相对于批次的查询成本是100%

我不确定如何解释这一点,但我在sql server 2005中运行的所有查询都有"查询成本(相对于批处理)"100%.有没有办法降低成本?

sql-server indexing sql-server-2005 sql-execution-plan

11
推荐指数
2
解决办法
2万
查看次数

用于将执行xml计划可视化为HTML的工具

是否有任何工具/ XSLT样式表可以将Microsoft Visual Studio返回的XML执行计划转换为HTML?

如果不这样做,有没有人知道任何可用于在HTML中显示适合显示执行计划的图表的技术?

sql-server sql-execution-plan

11
推荐指数
1
解决办法
2304
查看次数

为什么这两个查询的表现如此不同?

我有一个存储过程,使用全文索引搜索产品(250,000行).

存储过程采用的参数是全文搜索条件.这个参数可以为null,所以我添加了一个空检查,查询突然开始运行速度慢了几个数量级.

-- This is normally a parameter of my stored proc
DECLARE @Filter VARCHAR(100)
SET @Filter = 'FORMSOF(INFLECTIONAL, robe)'

-- #1 - Runs < 1 sec
SELECT TOP 100 ID FROM dbo.Products
WHERE CONTAINS(Name, @Filter)

-- #2 - Runs in 18 secs
SELECT TOP 100 ID FROM dbo.Products
WHERE @Filter IS NULL OR CONTAINS(Name, @Filter)
Run Code Online (Sandbox Code Playgroud)

以下是执行计划:

查询#1 执行工厂#1

查询#2 执行工厂#2

我必须承认我对执行计划不太熟悉.对我来说唯一明显的区别是连接是不同的.我会尝试添加提示,但在我的查询中没有加入我不知道该怎么做.

我也不太明白为什么使用名为IX_SectionID的索引,因为它是一个只包含列SectionID的索引,并且该列不在任何地方使用.

sql-server performance sql-server-2008-r2 sql-execution-plan

11
推荐指数
1
解决办法
253
查看次数

创建索引并使用dbms_stats compute后,查询执行速度较慢

我有一张150万行的表.我运行一个查询,该查询获取列中具有非重复值的记录.我正在观察一种行为,在创建索引之后,查询的性能会降低.我还使用具有100%估计百分比(计算模式)的dbms_stats来收集统计信息,以便oracle 11g CBO为查询计划做出更明智的决策,但它不会改善查询执行时间.

 SQL> desc tab3;
 Name                 Null?    Type
 ----------------------------------------------
 COL1                          NUMBER(38)
 COL2                          VARCHAR2(100)
 COL3                          VARCHAR2(36)
 COL4                          VARCHAR2(36)
 COL5                          VARCHAR2(4000)
 COL6                          VARCHAR2(4000)
 MEASURE_0                     VARCHAR2(4000)
 MEASURE_1                     VARCHAR2(4000)
 MEASURE_2                     VARCHAR2(4000)
 MEASURE_3                     VARCHAR2(4000)
 MEASURE_4                     VARCHAR2(4000)
 MEASURE_5                     VARCHAR2(4000)
 MEASURE_6                     VARCHAR2(4000)
 MEASURE_7                     VARCHAR2(4000)
 MEASURE_8                     VARCHAR2(4000)
 MEASURE_9                     VARCHAR2(4000)
Run Code Online (Sandbox Code Playgroud)

该列measure_0有40万个唯一值.

SQL> select count(*) from (select measure_0 from tab3 group by measure_0 having count(*) = 1) abc;

  COUNT(*)
----------
    403664
Run Code Online (Sandbox Code Playgroud)

以下是执行计划的查询,请注意表中没有索引.

SQL> set autotrace traceonly;

SQL> SELECT * FROM (
  2     SELECT
  3             (ROWNUM -1) AS …
Run Code Online (Sandbox Code Playgroud)

sql oracle indexing sql-execution-plan

11
推荐指数
1
解决办法
1万
查看次数

SQL操作顺序

如果我运行以下SQL查询

SELECT * 
FROM A
LEFT JOIN B
ON A.foo=B.foo
WHERE A.date = "Yesterday"
Run Code Online (Sandbox Code Playgroud)

请问WHERE声明得到之前或之后的评价JOIN

如果之后,什么是更好的方式来编写此语句,以便只返回A从中的行"Yesterday"连接到B

sql optimization join where sql-execution-plan

10
推荐指数
3
解决办法
8970
查看次数

SQL差的存储过程执行计划性能 - 参数嗅探

我有一个存储过程接受一个日期输入,如果没有传入值,则该日期输入稍后设置为当前日期:

CREATE PROCEDURE MyProc
    @MyDate DATETIME = NULL
AS
    IF @MyDate IS NULL SET @MyDate = CURRENT_TIMESTAMP
    -- Do Something using @MyDate
Run Code Online (Sandbox Code Playgroud)

我遇到问题,如果@MyDateNULL第一次编译存储过程时传入if ,则对于所有输入值(NULL或其他),性能总是很糟糕,如果在编译存储过程时传入日期/当前日期性能适用于所有输入值(NULL或其他).

令人困惑的是,即使实际 使用@MyDate的值NULL(而不是CURRENT_TIMESTAMP由IF语句设置),生成的糟糕执行计划也很糟糕

我发现禁用参数嗅探(通过欺骗参数)修复了我的问题:

CREATE PROCEDURE MyProc
    @MyDate DATETIME = NULL
AS
    DECLARE @MyDate_Copy DATETIME
    SET @MyDate_Copy = @MyDate
    IF @MyDate_Copy IS NULL SET @MyDate_Copy = CURRENT_TIMESTAMP
    -- Do Something using @MyDate_Copy
Run Code Online (Sandbox Code Playgroud)

我知道这与参数嗅探有关,但我看到的所有"参数嗅探变坏"的例子都涉及使用传递的非代表性参数编译存储过程,但是在这里我看到了执行计划是可怕的SQL Server可能认为执行该语句其中参数可能需要在该点所有可能的值- NULL,CURRENT_TIMESTAMP或以其他方式.

有没有人知道为什么会这样?

sql t-sql sql-server parameter-sniffing sql-execution-plan

10
推荐指数
1
解决办法
3万
查看次数

如何使用LINQ to SQL/ADO.NET获取执行计划

是否有可能以编程方式获取LINQ to SQL或ADO.NET Query的执行计划以显示调试信息?如果是这样,怎么样?

.net c# sql linq-to-sql sql-execution-plan

10
推荐指数
1
解决办法
2991
查看次数

解释MySQL解释执行计划的数学,两个计划之间的区别

我有一个与解释相关的基本MySQL性能问题.我有两个返回相同结果的查询,我试图了解如何理解EXPLAIN执行计划.

该表中有50000条记录,我正在进行记录比较.我的第一个查询需要18.625秒才能运行.解释计划如下.

id  select_type table   type    possible_keys                   key         key_len ref                                 rows    filtered    Extra
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
1   SIMPLE      a       ALL     NULL                            NULL        NULL    NULL                                49520   100.00  
1   SIMPLE      b       ref     scoreEvent,eventScore           eventScore  4       olympics.a.eventId                  413     100.00      Using where; Using index; Not exists
1   SIMPLE      c       ref     PRIMARY,scoreEvent,eventScore   scoreEvent  8       olympics.a.score,olympics.a.eventId 4       100.00      Using where; Using index; Not exists
Run Code Online (Sandbox Code Playgroud)

我的下一个查询需要0.106秒才能运行...

id  select_type table       type    possible_keys   key     key_len     ref     rows    filtered    Extra
-----------------------------------------------------------------------------------------------------------------------------------
1   PRIMARY     <derived2>  ALL     NULL            NULL    NULL        NULL    50000 …
Run Code Online (Sandbox Code Playgroud)

mysql performance explain sql-execution-plan

10
推荐指数
1
解决办法
2877
查看次数