在SQL Server 2005中解释查询的执行计划是否有任何好的文章,教程或类似的参考?
我有一个查询,创建几个临时表,然后将数据插入其中.根据我的理解,这是Table Spool的潜在原因.当我查看我的执行计划时,我的大部分处理都花在了Table Spool上.有没有什么好的技术可以改善这些类型的性能问题?使用视图或CTE会为我提供临时表的任何好处吗?
我还注意到,当我将鼠标悬停在每个表假脱机上时,输出列表来自同一个临时表.
我有一个视图,我想查询我的视图,从基表提示一些索引,我可以这样做吗?
我的意思是:
--view
create or replace view temp_view
as select col1,col2,col3
from table1,table2....
Run Code Online (Sandbox Code Playgroud)
我在table1.col1上有一个名为" index1 " 的索引.
我有一个问题:
--query
select *
from temp_view
where col1=12;
Run Code Online (Sandbox Code Playgroud)
当我看到这个查询的解释计划时,它告诉我查询不使用"index1",我想表明它..
所以我希望它是,例如:
--query with hint
select /*+ index(temp_view index1)*/*
from temp_view
where col1=12;
Run Code Online (Sandbox Code Playgroud)
我可以指出视图的提示吗?(如果我不想在创建此视图期间指出它)
我经常在Oracle执行计划中遇到以下情况:
Operation | Object | Order | Rows | Bytes | Projection
----------------------------+---------+-------+------+-------+-------------
TABLE ACCESS BY INDEX ROWID | PROD | 7 | 2M | 28M | PROD.VALUE
INDEX UNIQUE SCAN | PROD_PK | 6 | 1 | | PROD.ROWID
Run Code Online (Sandbox Code Playgroud)
这是一个更大的执行计划的摘录.基本上,我正在使用表的主键访问(加入)表.通常,存在另一个表ACCO与ACCO.PROD_ID = PROD.ID,其中PROD_PK是主关键字PROD.ID.显然,可以使用a访问该表UNIQUE SCAN,但是只要我在该表上有一些愚蠢的投影,似乎整个表(大约200万行)计划在内存中读取.我得到了很多I/O和缓冲区.当我从更大的查询中删除投影时,问题消失:
Operation | Object | Order | Rows | Bytes | Projection
----------------------------+---------+-------+------+-------+-------------
TABLE ACCESS BY INDEX ROWID | PROD | 7 | 1 | 8 | …Run Code Online (Sandbox Code Playgroud) 我正在学习数据库索引,我正在努力了解使用它们的有效性.
我正在使用sql +.
我如何查看执行计划,我在哪里可以找到告诉我我的索引是否被使用的信息?
我的目的是获得客户的分页结果集.我正在使用Tom的这个算法:
select * from (
select /*+ FIRST_ROWS(20) */ FIRST_NAME, ROW_NUMBER() over (order by FIRST_NAME) RN
from CUSTOMER C
)
where RN between 1 and 20
order by RN;
Run Code Online (Sandbox Code Playgroud)
我还在"CUSTOMER"列上定义了一个索引."FIRST_NAME":
CREATE INDEX CUSTOMER_FIRST_NAME_TEST ON CUSTOMER (FIRST_NAME ASC);
Run Code Online (Sandbox Code Playgroud)
查询返回预期的结果集,但是从解释计划中我注意到没有使用索引:
--------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 15467 | 679K| 157 (3)| 00:00:02 |
| 1 | SORT ORDER BY | | 15467 …Run Code Online (Sandbox Code Playgroud) sql oracle performance database-performance sql-execution-plan
我正在尝试理解SQL Server执行计划中的物理运算符.这个页面非常有帮助:
http://technet.microsoft.com/en-us/library/ms191158.aspx
SSMS 2008显示了SSMS 2005中未显示的一些物理运算符属性:Estimated Number of Executions和Number of Executions.但这些实际上意味着什么,它们与重新组合和回卷有何关系?
Estimated Number of Executions特别有趣,因为它似乎没有存储在XML中.那怎么算呢?它似乎等于Estimated Rebinds + Estimated Rewinds + 1.0.但如果是这样的话,为什么Number of Executions不等于Actual Rebinds + Actual Rewinds + 1?
谢谢.
我想知道如何使用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) 我正在分析Oracle执行计划,并发现了一个令人惊讶的事实.看看这个查询.提示只是为了显示我有一个索引,我希望Oracle将它用于范围扫描:
// execute_at is of type DATE.
PreparedStatement stmt = connection.prepareStatement(
"SELECT /*+ index(my_table my_index) */ * " +
"FROM my_table " +
"WHERE execute_at > ? AND execute_at < ?");
Run Code Online (Sandbox Code Playgroud)
这两个绑定导致完全不同的行为(排除绑定变量偷看问题,我实际上强制执行两个硬解析):
// 1. with timestamps
stmt.setTimestamp(1, start);
stmt.setTimestamp(2, end);
// 2. with dates
stmt.setDate(1, start);
stmt.setDate(2, end);
Run Code Online (Sandbox Code Playgroud)
1)有了时间戳,我得到INDEX FULL SCAN一个过滤谓词
--------------------------------------------------------------
| Id | Operation | Name |
--------------------------------------------------------------
| 0 | SELECT STATEMENT | |
|* 1 | FILTER | |
| 2 | TABLE ACCESS …Run Code Online (Sandbox Code Playgroud) 我有这样的情况:
create table a(
a_id number(38) not null,
constraint pk_a primary key (id)
);
create table b(
a_id number(38) not null
);
create index b_a_id_index on b(a_id);
Run Code Online (Sandbox Code Playgroud)
现在b.a_id实际上是指外键引用a.a_id,但它没有正式声明.显然,这应该是出于诚信原因.但是,外键约束是否也会改善一般情况下或特定情况下的连接性能?如果是,对于什么类型的查询转换?
是否有关于此主题的相关文档?
我正在使用Oracle 11g(11.2.0.2.0)
oracle optimization performance cost-based-optimizer sql-execution-plan
oracle ×7
performance ×4
sql ×4
jdbc ×2
optimization ×2
sql-server ×2
explain ×1
hints ×1
indexing ×1
java ×1
oracle11g ×1
sqlplus ×1
timestamp ×1