Oracle---Tip for SQL Database tuning and performance



Indexes(索引)

如果您是数据库的新手,甚至问自己“什么是SQL调优”,您应该知道索引是调整SQL数据库的有效方式,这在开发过程中经常被忽略。 在基本术语中,索引是一种数据结构,通过提供快速随机查询和高效访问有序记录来提高数据库表中数据检索操作的速度。 这意味着,一旦创建了索引,您可以比以前更快地查询。

索引也用于定义主键或唯一索引,这将保证没有其他列具有相同的值。 当然,索引是一个广泛的有趣的话题,我无法通过这个简短的描述来说明。

基本上,目标是索引主要的搜索和排序列。

请注意,如果您的表不断被INSERT,UPDATE和DELETE,您应该在索引时小心 - 因为所有索引需要在这些操作之后进行修改,所以可能会降低性能。

此外,在执行百万次以上的批次批处理插入之前,DBA经常会丢弃它们的索引,以加速插入过程。 插入批次后,它们将重新创建索引。 但是请记住,丢弃索引将影响该表中运行的每个查询; 所以这种方法仅在使用单个大型插入时才推荐使用。

索引详细介绍:https://baike.baidu.com/item/%E7%B4%A2%E5%BC%95/5716853?fr=aladdin

Oracle Performance Tuning: Execution Plans

执行一条SQL,按F5即可查看。

基数(Rows):Oracle估计的当前操作的返回结果集行数

字节(Bytes):执行该步骤后返回的字节数

耗费(COST)、CPU耗费:Oracle估计的该步骤的执行成本,用于说明SQL执行的代价,理论上越小越好(该值可能与实际有出入)

时间(Time):Oracle估计的当前操作所需的时间


看懂执行计划

执行顺序:

根据Operation缩进来判断,缩进最多的最先执行;(缩进相同时,最上面的最先执行)

例:上图中 INDEX RANGE SCAN 和 INDEX UNIQUE SCAN 两个动作缩进最多,最上面的 INDEX RANGE SCAN 先执行;

同一级如果某个动作没有子ID就最先执行

同一级的动作执行时遵循最上最右先执行的原则

具体详细分析请看:http://www.cnblogs.com/Dreamer-1/p/6076440.html


总的来说,通过执行计划来查看你SQL哪里可以优化。微观上优化SQL语句:http://www.cnblogs.com/rootq/archive/2008/11/17/1334727.html


Tune SQL query performance by avoiding coding loops

想象一下,1000次插入您的数据库。 就像是:

for (int i = 0; i < 1000; i++)
{
    SqlCommand cmd = new SqlCommand("INSERT INTO TBL (A,B,C) VALUES...");
    cmd.ExecuteNonQuery();
}

你应该避免代码中的这种循环。 例如,我们可以通过使用具有多个行和值的唯一INSERT或UPDATE语句来转换上述代码段:

INSERT INTO TableName (A,B,C) VALUES (1,2,3),(4,5,6),(7,8,9) 

UPDATE TableName SET A = CASE B
        WHEN 1 THEN 'NEW VALUE'
        WHEN 2 THEN 'NEW VALUE 2'
        WHEN 3 THEN 'NEW VALUE 3'
    END
WHERE B in (1,2,3)

Select sparingly

我最喜欢的SQL优化提示之一是避免SELECT *!相反,您应该单独包含所需的特定列。再次,这听起来很简单,但是我在这个地方看到这个错误。考虑一个具有数百列和数百万行的表 - 如果您的应用程序只需要几列,查询所有数据就没有任何意义。这是资源的浪费。

SELECT * FROM Employees

vs.

SELECT FirstName, City, Country FROM Employees
如果您确实需要每一列,请明确列出每一列。 这不是一个规则,而是防止未来系统错误和额外的数据库性能调整的手段。 例如,如果您正在使用INSERT ... SELECT ...并且通过添加新列更改了源表,则即使目标表不需要该列,也可能会遇到问题, 例如:
INSERT INTO Employees SELECT * FROM OldEmployees

Msg 213, Level 16, State 1, Line 1
Insert Error: Column name or number of supplied values does not match table definition.
为了避免这种错误,您应该单独声明每一列:
INSERT INTO Employees (FirstName, City, Country)
SELECT Name, CityName, CountryName
FROM OldEmployees
但是请注意,在某些情况下,使用SELECT *可能是合适的。 例如,使用临时表.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值