[英]O/R mapping: Single complex query vs. multiple simple queries
我對如何將SQL查詢的結果集從服務器傳輸到客戶端感到好奇。
大多數O / R映射器都支持渴望加載和延遲加載,兩者都有其優缺點。 例如,Entity Framework4(.NET)具有出色的熱切負載支持。
但是,假設我們有一個這樣的模型:
BlogPost
{
public string Body {get;set;}
ICollection<Comment> Comments {get;set;}
}
...
和這樣的查詢:
var posts = context
.Posts
.Include(post => post.Comments)
.Where(post => post.Id == 1)
.First();
這將導致一個SQL查詢,其中“發布”的所有數據在每個“注釋”的每一行上重復
假設我們在一個特定的帖子上有100條評論,而Post.Body是大量的文本。 這不好嗎? 還是將數據發送到客戶端時以某種方式進行壓縮,從而最大程度地減少了在每一行重復數據的開銷?
確定一個這樣的查詢是否比僅兩個簡單查詢(一個用於獲取帖子,一個用於獲取其評論)效率更高的最佳方法是什么?
在開發環境上進行基准測試毫無意義,這里有多個因素:SQL服務器上的CPU負載網絡負載應用服務器上的CPU負載(實現對象)
有這個想法嗎?
[編輯]說明:
兩個查詢將是這樣的:
sql
select * from post where postid = 123
結果
id , topic, body , etc...
sql
select * from comment where postid = 123
結果
id,postid, commenttext , etc...
第一個查詢將產生一行,第二個查詢將產生與注釋一樣多的行。
如果使用單個查詢,則該行的行數將與該特定帖子的評論的行數相同,但所有的行數據都在每一行上重復。
結果
p.id , p.topic, __p.body__, c.id, c.postid, c.commenttext
p.body將在每一行上重復,因此結果集非常大。 (假設p.body包含大量數據;-)
我認為確實可以歸結為以下幾點:
如果您有數百萬個帖子,則即使每個帖子有多個評論,也最好使用單個查詢,因為匯總的往返時間將比傳輸其他數據的時間差很多。
所以,我認為您需要敏銳的眼睛;-)
而且,我認為在開發環境中進行基准測試並不是沒有意義的,因為它至少可以在兩種實現方式之間提供聯系。
具有單個查詢返回很多行的查詢幾乎總是比許多僅返回單個行的查詢要快。
但是,在您的情況下,先檢索用戶,然后檢索所有注釋(使用單個查詢)可能比在一個查詢中獲取所有注釋更有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.