Two Database Tips
#別用浮點數算錢 Don't use float in currency calculation
DECLARE @f1 FLOAT, @f2 FLOAT
DECLARE @f3 FLOAT, @f4 FLOAT
SET @f1=6481.45
SET @f2=6000
SET @f3=0.1
SET @f4=(@f1-@f2)*@f3
SELECT (6481.45-6000)*0.1 AS V1
SELECT @f4 AS V2
SELECT ROUND(@f4, 2) AS V3
SELECT 48.145 - @f4 AS V4
又到了猜迷時間,V1=48.145 V2=48.145 所以V3=ROUND(@f4, 2)=ROUND(48.145, 2)=48.15?? 錯!! V3會等於48.14,由V4的結果來看,@f4其實等於48.144999999999979,只是在顯示時會被視為48.145,但到了計算四捨五入時,卻被判定成<48.145而四捨五入成48.14。
總論: 要計算到分亳不差,乖乖用DECIMAL吧,別再用FLOAT了。
#別小看資料庫統計不準的殺傷力 Watch out for out-of-date index statistics
--Super Fast
SELECT Col1 FROM Table1
WHERE Col2 IN (
SELECT Col2 FROM Table2
WHERE Col3 LIKE 'Blah'
)
--Be Patient... ZZZzzzz
SELECT Col1 FROM Table1
WHERE Col2 IN (
SELECT Col2 FROM Table2
WHERE Col3 LIKE 'Blah%'
)
在我的認知裡,在有設Index的前題下,LIKE 'Blah'與LIKE 'Blah%'的效能差異不大,不慎使用LIKE '%Blah'才會導致Table Scan效能不佳。但今天遇到一個例子,用得好好的ORACLE查詢程式今天突然查不出資料來。追蹤下去,發現問題出在上述的SQL。LIKE 'Blah'只需1秒,LIKE 'Blah%'卻等上半個小時還看不到結果。DBA偵斷結果: 這個高達2G大小的Table大久沒做統計更新了,才搞出這樣的飛機。
結論: 千萬記得定期為資料庫更新統計資料!