最近萬年議題又被拿出來討論了,「該把程式碼寫在 Stored Procedure,還是寫在 Application 裡面?」
⠀
以下是個人的看法以及選擇,僅供參考。
⠀
我個人的背景是這樣的,都是以開發 Web 應用程式為主,資料庫的使用經驗都在 SQL Server,其他的資料庫領域我不了解,在這樣的背景之下我個人傾向不使用 Stored Procedure 的,原因如下:
⠀
1. 對 DB 的操作已經是在應用程式生命週期的末端,這時候關注的應該是「效能」,如何運用最少的資源(CPU、Memory、Network IO、Disk IO、Money...)最快的速度拿到想要取得的資料,如果把程式碼都寫在 Stored Procedure,為了效能這件事,就會開始在商業邏輯中混入一些 Temp Table、額外定義 Table Type、因效能而使用的特殊語法...等,隨著時間流逝這個 Stored Procedure 就慢慢變成了哥吉拉。
⠀
2. 由於 SQL Server 的改進,Stored Procedure precompiled 的優點早已消失。
(https://www.codeproject.com/Articles/414272/Stored-Procedures-DO-NOT-increase-performance)
⠀
3. 被 Parameter Sniffing 搞得很煩。
⠀
4. 身為那條龍,我為何要將原始碼放在兩個地方?
⠀
雖然我不想使用 Stored Procedure 但不表示可以忽視查詢效能這件事,基本對 Index 的了解、各種 JOIN 差異、查詢計劃的解讀、...等,會影響查詢效能的要略懂,也順便跟還在跟哥吉拉奮戰的朋友說聲辛苦了。
「sql join差異」的推薦目錄:
- 關於sql join差異 在 軟體廚房 Facebook 的最讚貼文
- 關於sql join差異 在 91 敏捷開發之路 Facebook 的最佳解答
- 關於sql join差異 在 SQL cross join 的語法差異 的評價
- 關於sql join差異 在 What's the difference between INNER JOIN , LEFT JOIN ... 的評價
- 關於sql join差異 在 SQL Joins: Difference Between Inner/Left/Right/Outer Joins 的評價
- 關於sql join差異 在 sql server - difference of left join and left outer join 的評價
sql join差異 在 91 敏捷開發之路 Facebook 的最佳解答
NOT IN/NOT EXISTS/EXCEPT 使用注意事項
#SQL
【SQL Tips】之【 NULL處理技巧,使用NOT IN /NOT EXISTS/EXCEPT】
許多時候,兩個資料表要找出差異值的時候,許多人第一直覺就是使用【NOT IN】,當然大部分時候都不會有狀況,但是碰到NOT IN的子查詢資料值,如果有NULL,就全盤皆輸,意思就是找不出任何差異。這樣在小量資料可以藉由眼力觀察的狀況下,還可以找出這樣寫法NOT IN的危險地方,但是碰到背景程式,或是資料量多的時候,幾乎無法觀察到這樣危險。所以,告訴自己不要再用【NOT IN】去找出兩邊資料差異。
反倒是要使用【NOT EXISTS】寫法,雖然是複雜一點,但是跨越SQL Server與Oracle兩種資料庫,都是可以正常找出兩邊資料差異值,不擔心NOT EXISTS的基礎資料表有NULL值狀況。另外值得一提就是,需多人會直接使用SQL Server的【EXCEPT】與Oracle的【MINUS】方式,要留意再留意,這樣的方式雖然可以找出差異值,但是針對回傳值,會自動進行重複資料列移除。
【SQL Server Code】
if object_id('x') is not null
drop table x
go
--建立比對基礎資料
create table x(a int)
go
insert into x values(1)
insert into x values(1) --注意重複
insert into x values(NULL) --注意NULL
go
if object_id('y') is not null
drop table y
go
--建立簡單比對來源資料
create table y(b int not null)
go
insert into y values(1)
insert into y values(1)
insert into y values(2)
insert into y values(2)
insert into y values(2) --注意三個2
go
--三種找出y資料表中(1,1,2,2,2) 然後不存在於 x資料表中的(1,1,null)
--【預期要回傳三個2】
--第一種 使用NOT IN 注意(子查詢有NULL值)
--無法處理對比資料表有NULL狀況
SELECT b
FROM y
WHERE b NOT IN(SELECT a from x)
GO
--第二種 使用NOT EXISTS 注意(SELECT 需要 JOIN)
--忠實回傳三個2
SELECT b
FROM y
WHERE NOT EXISTS (SELECT * FROM x WHERE x.a = y.b)
GO
--第三種 使用EXCEPT (僅回傳一個2)
SELECT b FROM y
EXCEPT
SELECT a FROM x
GO
【Oracle Code】
drop table x purge;
--建立比對基礎資料
create table x(a int);
insert into x values(1);
insert into x values(1); --注意重複
insert into x values(NULL); --注意NULL
drop table y purge;
--建立簡單比對來源資料
create table y(b int not null);
insert into y values(1);
insert into y values(1);
insert into y values(2);
insert into y values(2);
insert into y values(2); --注意三個2
--三種找出y資料表中(1,1,2,2,2) 然後不存在於 x資料表中的(1,1,null)
--第一種 使用NOT IN 注意(子查詢有NULL值)
--無法處理對比資料表有NULL狀況
SELECT b
FROM y
WHERE b NOT IN(SELECT a from x);
--第二種 使用NOT EXISTS 注意(SELECT 需要 JOIN)
--忠實回傳三個2
SELECT b
FROM y
WHERE NOT EXISTS (SELECT * FROM x WHERE x.a = y.b);
--第三種 使用EXCEPT (僅回傳一個2)
SELECT b FROM y
MINUS
SELECT a FROM x;
sql join差異 在 SQL Joins: Difference Between Inner/Left/Right/Outer Joins 的推薦與評價
Join JomaClass for weekly full-length videos like this: http://jomaclass.com/ ... SQL Joins : Difference Between Inner /Left/Right/Outer Joins. ... <看更多>
sql join差異 在 SQL cross join 的語法差異 的推薦與評價
今天遇到了一個sql join 的語法問題,首先第一個sql 如下: 123SELECT c.customer_id, o.order_id, o.order_date FROM customers as c JOIN orders as ... ... <看更多>