2009-05-29 28 views
0

我正在維護一個用C#編寫的內部ORM,它目前沒有任何熱切加載機制。爲了提高性能,我們決定需要加載,所以我們需要編寫自己的代碼來支持它。 (我的同事和我沒有任何ORM工具的經驗,而且,由於一些遺留原因,我們不允許使用流行的工具,如LinqtoSQL,Entity Framework或Nhibernate。)需要關於編寫我自己的急切加載算法的建議

我的問題是,這是生成急切加載SQL語句的最佳實踐嗎?我已經想過這個問題,並提出了兩種方法 -

假設4桌一個典型的例子 - 一個CustomerCategory有許多客戶 一個客戶有很多訂單 一個訂單有許多的OrderDetail

,並假設我想要從所有4個表中急切加載數據,並且我的條件是 - 其中Order.OrderDate'2008-05-05'和'2008-12-31'之間

方法1 - 我生成一個sql以獲取來自所有4個表的數據,全部使用內部連接,以便每個表的主鍵的每個唯一組合都有一行。我會將我的Where條件應用於此SQL。

方法2 - 我生成一個SQL來首先獲取訂單數據,並將此Where條件應用於此SQL,因爲Order.OrderDate來自Order表。 然後,根據我的查詢結果,我將知道所需的所有訂單ID值,因此我將使用它們來檢索訂單明細數據。我也會知道我需要的所有唯一的Customer ID值,所以我也將使用這些值來從客戶表中檢索數據,最後我會爲CustomerCategory執行相同的操作。這個方法總共需要4個SQL語句。

我可以看到第一種方法更有效率,但是我的一位同事指出第二種方法儘管使用4個SQL語句,但它更容易編寫和維護,我同意這一點。

對此的任何想法將不勝感激。 謝謝!

回答

0

首先,你的域模型是大量錯誤的。我個人無法證明中收集Customer對象是有道理的,因爲從性能的角度來看,它只是沒有意義:大多數時候你需要一個客戶(加上它的組),而一組客戶將需要一次藍色的月亮,但它會一直在那裏,造成各種問題。 Customer同樣適用於許多Order

現在,你的問題。通常認爲數據庫往返次數應儘可能少,即使以檢索更多數據爲代價,也不必要。也就是說,加入兩個大表(長&寬)同時從兩個關聯表中選擇數據可能是一個性能殺手,所以要小心。

我建議你看看它是如何在NHibernate中完成的。它允許您爲每個關聯指定獲取策略(連接,選擇),無論是一對一關聯還是一對多關聯。

如果您使用的Microsoft SQL Server 2005或更高版本,可以使用MARS充塞幾個select s轉換一批,然後滋潤只發出一個SQL命令對象的整個圖形。

+0

感謝您的幫助。 我承認我們的模型確實有問題。 我們會研究它,並會根據您的建議看看nhibernate 。 – janem 2009-06-01 15:42:28