sql使用memo
count(1), count(*), count(column)区别
count(1)
和count(*)
是相同的, 但count(*)
代表的语义更明确
COUNT(<expression>)
统计非空值个数
使用IN时是否需要先distinct
不需要, distinct反而会降低性能
EXISTS vs IN
由于目前的数据库优化, 对于可以替代的情况下, 性能没有区别
EXISTS 可以用来进行多列的比较, IN则不行
多线程, 乐观锁, 悲观锁
当存在一条记录可能被很多人同时修改的时候, 需要考虑同步操作的问题, 当不加锁无法达成目标时, 可以使用锁, 悲观锁由于需要锁定记录, 太影响性能, 优先考虑使用乐观锁
考虑同步更新库存的情况
不加锁方案
将库存数量放入更新条件中, 如果库存不足, 则更新结果数量为0, 再做相应处理
Update from Stock set quantity = quantity - 5 where ItemId='01' and quantity >= 5
乐观锁方案
在处理的最开始先查询记录, 将更新时间(或者版本号)(即事先约定每次更新都要更新的字段)放入更新条件中, 如果更新结果数量为0, 则说明记录已被其他人修改过, 再做相应处理
UPDATE Stock SET quantity = 15, version = version + 1 WHERE itemId = '01' and version = 1
悲观锁方案
处理的最开始先把记录锁住(SELECT FOR UPDATE), 处理完成后再放开
reference
- Should I use ‘DISTINCT’ in a subquery when using ‘IN’? - Quora
- Count(*) vs Count(1) in Oracle: The ultimate comparison - Pretius
- SQL Best Practice: count(1) or count(*) - Stack Overflow
- On Counts | SQL in the Wild
- EXISTS vs IN | SQL in the Wild
- SQL Server IN vs. EXISTS Performance - Stack Overflow
- Optimistic vs. Pessimistic locking - Stack Overflow
- Optimistic or Pessimistic Locking: Which One Should You Pick? | Couchbase Blog
- Effective usage Oracle Row Locking with Spring JDBC for concurrent data processing without having… | by Manjula Piyumal | Medium
- Why is optimistic locking faster than pessimistic locking? - Database Administrators Stack Exchange
- SELECT FOR UPDATE - オラクル・Oracle SQL 入門
- SELECT FOR UPDATE SKIP LOCKED Tips (Oracle PL/SQL)
- Exclusion Control | Tutorials | Guidelines | Terasoluna Development Architecture 5.x
- MyBatis 楽観ロック - Qiita
Updated: 2023-08-06 17:26
Created: 2023-08-06 14:00