亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

SQL中樹形分層數據的查詢優化

2024-07-21 02:47:23
字體:
來源:轉載
供稿:網友
SQL中樹形分層數據的查詢優化

在數據查詢中,從2008開始SQL Server提供了一個新的數據類型hierarchyid,專門用來操作層次型數據結構。

hierarchyid 類型對層次結構樹中有關單個節點的信息進行邏輯編碼的方法是:對從樹的根目錄到該節點的路徑進行編碼。

這種路徑在邏輯上表示為一個在根之后被訪問的所有子級的節點標簽序列。 表示形式以一條斜杠開頭,只訪問根的路徑由單條斜杠表示。 對于根以下的各級,各標簽編碼為由點分隔的整數序列。 子級之間的比較就是按字典順序比較由點分隔的整數序列。 每個級別后面緊跟著一個斜杠。 因此斜杠將父級與其子級分隔開。 例如,以下是長度分別為 1 級、2 級、2 級、3 級和 3 級的有效 hierarchyid 路徑:

? /

? /1/

? /0.3.-7/

? /1/3/

? /0.1/0.2/

在沒有hierarchyid的日子里,我們通過CTE的方式來查詢父以及全部的下級,但是,數據量多的情況下,CTE的方式將會變的很慢,后來,我們通過構造PATH的方式來加快速度。那么,有了hierarchyid類型后,自然得使用hierarchyid了。

現在,通過一個實際的例子來看看hierarchyid的威力。

一:CTE方式

WITH CTEGetChild AS ( SELECT * FROM EL_Organization.Organization WHERE ID='ecc43c7159924dca91e2916368f923f4' --and [State]=0 and AuditState=2 UNION ALL ( SELECT A.* FROM EL_Organization.Organization AS A INNER JOIN CTEGetChild AS B ON a.PARENTID=B.ID --and A.[State]=0 and A.AuditState=2 ) )

查詢出來4489行,需要25S。

看來CTE方式已經到了不能容忍的地步,那么,現在,我們就用它來進行優化。

二:hierarchyid

首先,我們得新建該字段,然后為其賦值,

create function f_cidname(@id varchar(50)) returns varchar(max) as begin declare @pids nvarchar(max); declare @pNames nvarchar(max); set @pids=''; set @pNames=''; with cte as ( select id,parentid,name from EL_Organization.Organization where id =@id--'00037fdf184e48d084b87c3499e3c0e5'union all select b.id,b.parentid,b.name from cte A ,EL_Organization.Organization B where a.parentid = b.id )

select @pids=convert(varchar(32),Convert(int, Convert(varbinary(max), id))) + '/'+ @pids from cte return '/'+@pids

end go

接著,我們需要Update全表:

UPDATE EL_Organization.Organization SET PIDS=dbo.f_cidname(id)

注意,id是guid的32位字符串,而hierarchyid字段不支持那么大的Path內路徑,于是我們將GUID轉為了整型:convert(varchar(32),Convert(int, Convert(varbinary(max), id)))

2.1 Tip

Exception message: DataReader.GetFieldType(4) returned null. Exception data: System.Collections.ListDictionaryInternal

注意,極有可能我們把字段更新上去后,我們的程序卻出錯了,如上。這個時候,我們需要把

C:/PRogram Files/Microsoft SQL Server/100/SDK/Assemblies/Microsoft.SqlServer.Types.dll

這個DLL打包到我們的應用程序中去。原因不解釋了。

看看效果吧,修改過后的代碼為:

DECLARE @tmpIds hierarchyidSELECT @tmpIds=Pids FROM EL_Organization.Organization WHERE ID='ecc43c7159924dca91e2916368f923f4';WITH CTEGetChild AS ( SELECT * FROM EL_Organization.Organization WHERE ID='ecc43c7159924dca91e2916368f923f4' UNION ALL( SELECT * FROM EL_Organization.Organization WHERE Pids.IsDescendantOf(@tmpIds)=1 ))SELECT * FROM CTEGetChild

現在,我們的時間到了1S內。

2.2 一切為了不動應用層代碼

現在,既然,增加了一個字段,我們就要維護這個字段,如:本條記錄在應用程序中被移動到了別的父級下,就需要更新這個字段。為了不動上層代碼,唯一能做的就是創建觸發器,即:原有的ParentId變動的時候,就需要更新這個PIds字段,于是,我們創建觸發器如下:

create trigger UpdateOrgPIds on EL_Organization.Organization after update as if update ([ParentId]) begin declare @tmpId varchar(36) select @tmpId=id from inserted update EL_Organization.Organization set pids=dbo.f_cidname(@tmpId) end go-- drop trigger EL_Organization.UpdateOrgPIds

微信掃一掃,關注最課程,獲取每日一練


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
福利精品视频在线| 狠狠做深爱婷婷久久综合一区| 97av在线视频免费播放| 欧美大成色www永久网站婷| 国产精品一区二区久久国产| 97精品国产91久久久久久| 亚洲色图第一页| 91精品国产91久久久久久久久| 国产va免费精品高清在线| 91天堂在线观看| 久久精品91久久久久久再现| 国产精品麻豆va在线播放| 日本午夜人人精品| 欧美日韩在线视频观看| 色妞一区二区三区| 久久精品视频在线| 欧美成人精品三级在线观看| 国产中文字幕亚洲| 欧洲日韩成人av| 久久久精品中文字幕| 精品国产户外野外| 亚洲成年人在线播放| 国产精品成人免费电影| 久久99久国产精品黄毛片入口| 亚洲人成电影网站| 日韩色av导航| 亚洲人成在线一二| 日韩在线观看免费高清| 欧美最顶级丰满的aⅴ艳星| 欧美大胆在线视频| 亚洲欧美日本精品| 欧美一级淫片播放口| 欧美性少妇18aaaa视频| 一区二区三区视频观看| 播播国产欧美激情| 久久精品中文字幕| 久热国产精品视频| 精品亚洲精品福利线在观看| 日韩免费在线电影| 欧美日韩美女在线| 国产精品国产亚洲伊人久久| 久久久久久久久久久久av| 91欧美视频网站| 久久夜色精品国产| 亚洲男人天堂视频| 91日本在线视频| 97视频在线观看免费高清完整版在线观看| 91中文精品字幕在线视频| 欧美日韩一区二区免费视频| 亚洲国产成人精品一区二区| 91成人精品网站| 亚洲精品国产精品国自产观看浪潮| 日韩中文字幕在线播放| 欧美激情亚洲另类| 91沈先生作品| 国产精品三级在线| 日韩视频免费中文字幕| 2018日韩中文字幕| 久久激情视频久久| 国产91精品黑色丝袜高跟鞋| 亚州国产精品久久久| 国产精品草莓在线免费观看| 亚洲精品久久久一区二区三区| 69视频在线播放| 亚洲综合中文字幕在线观看| 欧美一级免费视频| 国产精品都在这里| 国产精品福利小视频| 91免费版网站入口| 成人国产精品色哟哟| 欧美激情视频三区| 欧美二区乱c黑人| 亚洲免费一在线| 亚洲xxxx在线| 91国产美女视频| 青青草精品毛片| 国产精品第3页| 欧美第一黄色网| 亚洲精品日韩丝袜精品| 欧美国产第二页| 在线精品91av| 欧美色视频日本版| 亚洲а∨天堂久久精品喷水| 久久成年人免费电影| 久久欧美在线电影| www欧美日韩| 久久精品99国产精品酒店日本| 国产精品亚洲自拍| 成人黄色免费网站在线观看| 乱亲女秽乱长久久久| 91极品女神在线| 88xx成人精品| 红桃av永久久久| 91伊人影院在线播放| 久久91精品国产91久久跳| 久久精品成人欧美大片| 国产日韩欧美自拍| 国产精品直播网红| 日韩av影院在线观看| 亚洲午夜未删减在线观看| 久久成人免费视频| 亚洲国产欧美一区二区三区同亚洲| 国产日产久久高清欧美一区| 国产精品一区二区久久久| 欧美日在线观看| 成人综合国产精品| 欧美一区深夜视频| 国产日韩专区在线| 91经典在线视频| 97涩涩爰在线观看亚洲| 疯狂欧美牲乱大交777| 欧美另类精品xxxx孕妇| 国产成人短视频| 日韩在线精品视频| 亚洲成avwww人| 777国产偷窥盗摄精品视频| 亚洲精品资源在线| 国产精品美女呻吟| 久久亚洲春色中文字幕| 日本视频久久久| 国模私拍一区二区三区| 中文字幕在线视频日韩| 中文字幕无线精品亚洲乱码一区| 久久av红桃一区二区小说| 久久久亚洲影院你懂的| 中文字幕日韩综合av| 亚洲石原莉奈一区二区在线观看| 91午夜在线播放| 国产精品久久久久9999| 国产综合在线视频| 欧美美女操人视频| 伊人伊成久久人综合网站| 国产69精品久久久久久| 一区二区三区天堂av| 91视频-88av| 国产精品香蕉在线观看| 日韩av电影免费观看高清| 成人午夜激情免费视频| yw.139尤物在线精品视频| 在线日韩欧美视频| 欧美大肥婆大肥bbbbb| 久久久国产精品亚洲一区| 成人网页在线免费观看| 亚洲欧美另类中文字幕| 国产精品狠色婷| 国产精品久久久91| 久久欧美在线电影| 久久久久久网站| 在线观看91久久久久久| 亚洲第一av网| 色偷偷888欧美精品久久久| 日本免费久久高清视频| 日本成人精品在线| 日韩欧美在线视频日韩欧美在线视频| 亚洲美女精品久久| 欧美成人精品xxx| 久久久久国色av免费观看性色| 欧美精品videosex极品1| 成人免费网视频| 国产99久久精品一区二区永久免费| 国产精品爽爽ⅴa在线观看| 欧美成人精品激情在线观看| 欧美综合国产精品久久丁香| 亚洲新声在线观看|