共计 4635 个字符,预计需要花费 12 分钟才能阅读完成。
这篇文章主要介绍 sql 数据库语句如何优化,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
通常 sql 数据库需要进行优化分析,并且还有一定的技巧,sql 优化的几种方法这里就不做详细介绍了,本文将会 sql 语句优化进行总结,后面还附了优化工具 SQL Tuning Expert for Oracle 及使用方法,首先我们要遵随数据库优化的几个原则:
1. 尽量避免在列上做运算,这样会导致索引失败;
2. 使用 join 是应该用小结果集驱动大结果集,同时把复杂的 join 查询拆分成多个 query。不然 join 的越多表,就会导致越多的锁定和堵塞。
3. 注意 like 模糊查询的使用,避免使用 %%,例如 select * from a where name like %de%
代替语句:select * from a where name = de and name df
4. 仅列出需要查询的字段,不要使用 select * from …,节省内存;
5. 使用批量插入语句,节省交互;
insert into a (id ,name)
values(2, a),
(3, s
6.limit 基数比较大时,使用 between … and …
7. 不要使用 rand 函数随机获取记录;
8. 避免使用 null,这就需要在建表时,尽量设置为 not null,提升查询性能;
9,不要使用 count(id), 而应该是 count(*)
10. 不要做无谓的排序,尽可能在索引中完成排序;
我们先来看一个 sql:
select
ii.product_id,
p.product_name,
count(distinct pim.pallet_id) count_pallet_id,
if(round(sum(itg.quantity),2) -1 round(sum(itg.quantity),2) 0.005, 0, round(sum(itg.quantity),2)) quantity,
round(ifnull(sum(itag.locked_quantity), 0.00000),2) locked_quantity,
pc.container_unit_code_name,
if(round(sum(itg.qoh),2) -1 round(sum(itg.qoh),2) 0.005, 0, round(sum(itg.qoh),2)) qoh,
round(ifnull(sum(itag.locked_qoh), 0.00000),2) locked_qoh,
p.unit_code,
p.unit_code_name
from (select
it.inventory_item_id item_id,
sum(it.quantity) quantity,
sum(it.real_quantity) qoh
from
ws_inventory_transaction it
where
it.enabled = 1
group by
it.inventory_item_id
) itg
left join (select
ita.inventory_item_id item_id,
sum(ita.quantity) locked_quantity,
sum(ita.real_quantity) locked_qoh
from
ws_inventory_transaction_action ita
where
1=1 and ita.type in (locked , release)
group by
ita.inventory_item_id
)itag on itg.item_id = itag.item_id
inner join ws_inventory_item ii on itg.item_id = ii.inventory_item_id
inner join ws_pallet_item_mapping pim on ii.inventory_item_id = pim.inventory_item_id
inner join ws_product p on ii.product_id = p.product_id and p.status = OK
left join ws_product_container pc on ii.container_id = pc.container_id
// 总起来说关联太多表,设计表时可以多一些冗余字段,减少表之间的关联查询; where
ii.inventory_type = raw_material and
ii.inventory_status = in_stock and
ii.facility_id = 25 and
datediff(now(),ii.last_updated_time) 3 // 违反了第一个原则
and p.product_type = goods
and p.product_name like % 果 % // 违反原则 3
group by
ii.product_id
having
qoh 0.005
order by
qoh desc
上面的 sql 我们在 from 中使用了子查询,这样对查询是非常不利的;
更好的一种做法是下面的语句:
select
t.facility_id,
f.facility_name,
t.inventory_status,
wis.inventory_status_name,
t.inventory_type,
t.product_type,
t.product_id,
p.product_name,
t.container_id,
t.unit_quantity,
p.unit_code,
p.unit_code_name,
pc.container_unit_code_name,
t.secret_key,
sum(t.quantity) quantity,
sum(t.real_quantity) real_quantity,
sum(t.locked_quantity) locked_quantity,
sum(t.locked_real_quantity) locked_real_quantity
from ( select
ii.facility_id,
ii.inventory_status,
ii.inventory_type,
ii.product_type,
ii.product_id,
ii.container_id,
ii.unit_quantity,
ita.secret_key,
ii.quantity quantity,
ii.real_quantity real_quantity,
sum(ita.quantity) locked_quantity,
sum(ita.real_quantity) locked_real_quantity
from
ws_inventory_item ii
inner join ws_inventory_transaction_action ita on ii.inventory_item_id = ita.inventory_item_id
where
ii.facility_id = {$facility_id} and
ii.inventory_status = {$inventory_status} and
ii.product_type = {$product_type} and
ii.inventory_type = {$inventory_type} and
ii.locked_real_quantity 0 and
ita.type in (locked , release)
group by
ii.product_id, ita.secret_key, ii.container_id, ita.inventory_item_id
having
locked_real_quantity 0
) as t
inner join ws_product p on t.product_id = p.product_id
left join ws_facility f on t.facility_id = f.facility_id
left join ws_inventory_status wis on wis.inventory_status = t.inventory_status
left join ws_product_container pc on pc.container_id = t.container_id
group by
t.product_id, t.secret_key, t.container_id
注意:
1、from 语句中一定不要使用子查询;
2、使用更多的 where 加以限制,缩小查找范围;
3、合理利用索引;
4、通过 explain 查看 sql 性能;
使用工具 SQL Tuning Expert for Oracle 优化 SQL 语句
对于 SQL 开发人员和 DBA 来说,根据业务需求写出一条正确的 SQL 很容易。但是 SQL 的执行性能怎么样呢?能优化一下跑得更快吗?如果不是资深
DBA, 估计很多人都没有信心。
幸运的是,自动化优化工具可以帮助我们解决这个难题。这就是今天要介绍的 Tosska SQL Tuning Expert for Oracle 工具。
下载 https://tosska.com/tosska-sql-tuning-expert-tse-oracle-free-download/
本工具发明人 Richard To, Dell 的前首席工程师, 拥有超过 20 年的 SQL 优化经验.
1、创建数据库连接,也可以稍后创建。填好连接信息,点击“Connect”按钮。
如果您已经安装 Oracle 客户端,并且在 Oracle 客户端配置了 TNS,可以在本窗口选择“TNS”作为”Connection Mode”,然后在”Database Alias”中选择配置好的 TNS 作为数据库别名。
如果您没有安装 Oracle 客户端或者不想安装 Oracle 客户端,可以选择“Basic Type”作为”Connection Mode”,只需数据库服务器 IP, 端口和服务名即可。
2、输入有性能问题的 SQL
3、点击 Tune 按钮,自动生成大量的等价 SQL 并且开始执行。虽然测试还没有完成,我们已经可以看到 SQL 20 的性能提升了 100%。
让我们仔细看一下 SQL 20, 它使用了两个 Hints, 以最快的执行速度脱颖而出。原来的 SQL 要 0.99 秒,优化后的 SQL 执行时间接近 0 秒。
由于这条 SQL 每天要在数据库中执行上万次,优化后可节省大约 165 秒的数据库执行时间。
最后,用等价的 SQL 20 替换 应用程序源代码中有性能问题的 SQL。重新编译应用程序,性能得到了提高。
以上是“sql 数据库语句如何优化”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注丸趣 TV 行业资讯频道!