本站首页    管理页面    写新日志    退出


«July 2026»
1234
567891011
12131415161718
19202122232425
262728293031


公告
努力学习C#。

我的分类(专题)

日志更新

最新评论

留言板

链接


Blog信息
blog名称:Areyan's Blog
日志总数:31
评论数量:10
留言数量:-2
访问次数:140077
建立时间:2005年1月5日




[SQL Server 2000]提高SQL效率
软件技术

阿严 发表于 2006/5/4 21:52:19

避免LEFT JOIN 和 NULL 當然,有很多時候您需要執行LEFT JOIN 和使用 NULL 值。但是,它們並不適用於所有情況。改變 SQL 查詢的構建方式可能會#29987;生將一個花幾分鐘運行的報告縮短到只花幾秒鐘這樣的天壤之別的效果。有時,必須在查詢中調整資料的形態,使之適應應用程式所要求的顯示方式。雖然 TABLE 資料類型會減少大量佔用資源的情況,但在查詢中還有許多區域可以進行優化。SQL 的一個有價值的常用功能是 LEFT JOIN。它可以用於檢索第一個表中的所有行、第二個表中所有匹配的行、以及第二個表中與第一個表不匹配的所有行。例如,如果希望返回每個客戶及其定單,使用 LEFT JOIN 則可以顯示有定單和沒有定單的客戶。此工具可能會被過度使用。LEFT JOIN 消耗的資源非常之多,因#29234;它們包含與 NULL(不存在)資料匹配的資料。在某些情況下,這是不可避免的,但是代價可能非常高。LEFT JOIN 比 INNER JOIN 消耗資源更多,所以如果您可以重新編寫查詢以使得該查詢不使用任何 LEFT JOIN,則會得到非常可觀的回報。 加快使用LEFT JOIN 的查詢速度的一項技術涉及創建一個 TABLE 資料類型,插入第一個表(LEFT JOIN 左側的表)中的所有行,然後使用第二個表中的值更新 TABLE 資料類型。此技術是一個兩步的過程,但與標準的 LEFT JOIN 相比,可以節省大量時間。一個很好的規則是嘗試各種不同的技術並記錄每種技術所需的時間,直到獲得用於您的應用程式的執行性能最佳的查詢。 測試查詢的速度時,有必要多次運行此查詢,然後取一個平均值。因#29234;查詢(或存儲過程)可能會存儲在SQL Server 記憶體中的過程緩存中,因此第一次嘗試耗費的時間好像稍長一些,而所有後續嘗試耗費的時間都較短。另外,運行您的查詢時,可能正在針對相同的表運行其他查詢。當其他查詢鎖定和解鎖這些表時,可能會導致您的查詢要排隊等待。例如,如果您進行查詢時某人正在更新此表中的資料,則在更新提交時您的查詢可能需要耗費更長時間來執行。 避免使用LEFT JOIN 時速度降低的最簡單方法是盡可能多地圍繞它們設計資料庫。例如,假設某一#29987;品可能具有類別也可能沒有類別。如果 Products 表存儲了其類別的 ID,而沒有用於某個特定#29987;品的類別,則您可以在欄位中存儲 NULL 值。然後您必須執行 LEFT JOIN 來獲取所有#29987;品及其類別。您可以創建一個值#29234;“No Category”的類別,從而指定外鍵關係不允許 NULL 值。通過執行上述操作,現在您就可以使用 INNER JOIN 檢索所有#29987;品及其類別了。雖然這看起來好像是一個帶有多餘資料的變通方法,但可能是一個很有價值的技術,因#29234;它可以消除 SQL 批次處理語句中消耗資源較多的 LEFT JOIN。在資料庫中全部使用此概念可以#29234;您節省大量的處理時間。請記住,對於您的用戶而言,即使幾秒鐘的時間也非常重要,因#29234;當您有許多用戶正在訪問同一個聯機資料庫應用程式時,這幾秒鐘實際上的意義會非常重大。


阅读全文(2216) | 回复(1) | 编辑 | 精华
 


回复:提高SQL效率
软件技术

swlgc(游客)发表评论于2006/8/2 17:55:54

应该有例子,还有字体太小了


个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


» 1 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.031 second(s), page refreshed 144833653 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号