在线精品99_中国九九盗摄偷拍偷看_91免费版在线观看_91.app_91高清视频在线_99热最新网站

sql数据库语句如何优化

131次阅读
没有评论

共计 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 行业资讯频道!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-28发表,共计4635字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)
主站蜘蛛池模板: 国内亚州视频在线观看 | 国产成人三级 | 欧美va在线高清 | 欧美精品一区在线看 | 黄网站免费在线观看 | 亚洲欧美精品中文字幕 | 韩国三级久久网 | 99热3| 在线播放一级片 | 亚洲avtv永久综合在线 | 国产精品高清视亚洲乱码 | 日本本人69视频 | 亚洲无线码一区二区三区在线观看 | 亚洲爆乳大丰满无码专区 | 91精品视频网 | 久久国产成人午夜av影院 | 香蕉视频地址 | 亚洲精品久久99久久一区 | 亚洲精品午夜在线观看 | 女bbbxxx毛片视频 | 久9久9精品视频在线观看 | 在线播放免费人成视频在线观看 | 国产99在线 | 欧美 | 欧美特黄a级高清免费大片 欧美特黄a级高清免费看片 | 人成精品视频三区二区一区 | 亚洲 另类 日韩 制服 无码 | 免费看黄网站在线看 | 一区二区三区四区日韩 | 成人免费视频在线 | 四虎影视永久在线精品 | 99久久久国产精品免费蜜臀 | 亚洲欧美自拍视频 | 免费深夜福利 | 97久久精品亚洲中文字幕无码 | 国产原创在线视频 | 亚洲第一红杏精品久久 | 久久三级电影 | 欧美激情在线播放一区二区三区 | 欧美国产日本精品一区二区三区 | 日本丰满少妇裸体自慰 | 中国丰满少妇人妻xxx性董鑫洁 |