在Oracle10g中,沒有定義間隔分區(qū),只能通過范圍分區(qū)實(shí)現(xiàn)間隔分區(qū)功能,如果要實(shí)現(xiàn)自動(dòng)創(chuàng)建分區(qū),只能通過創(chuàng)建JOB或者scheduler來實(shí)現(xiàn);而在11g中,Oracle直接提供了間隔分區(qū)功能,大大簡(jiǎn)化了間隔分區(qū)的實(shí)現(xiàn)。

創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)樺甸,10多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575
----注:oracle11g雖然可以自動(dòng)分區(qū),但是分區(qū)的名字不能自定義,對(duì)于需要定時(shí)刪除分區(qū)時(shí)沒法處理,不如通過時(shí)間范圍來手工分區(qū)。詳見
create table HIP_LOG_NODE_Part
(
ID?????????????????? VARCHAR2(32)???????? not null,
RECORD_TIME????????? DATE
)tablespace TB_HIP_LOG_NODE
PARTITION BY RANGE (RECORD_TIME) interval (numtoyminterval(1, 'month'))
STORE IN (TB_HIP_LOG_NODE)
(
partition hip_log_node_partition values less than (to_date('2019-08-01 00:00','yyyy-MM-dd HH24:mi')) tablespace TB_HIP_LOG_NODE
);
1、Oracle11g有間隔分區(qū)功能,對(duì)于使用Range分區(qū)的可以按年,月,日來自動(dòng)生成分區(qū)。
2、2019-08-01前的數(shù)據(jù)(包含8月份的數(shù)據(jù))會(huì)放入hip_log_node_partition?分區(qū),8月1日后的數(shù)據(jù)每月只要有數(shù)據(jù),就會(huì)自動(dòng)創(chuàng)建一個(gè)分區(qū)。也就是從9月開始,開始新建分區(qū)。
3、interval函數(shù)--將數(shù)值按標(biāo)準(zhǔn)換算為日期
numtodsinterval、numtodsinterval函數(shù),將數(shù)字轉(zhuǎn)成年月,時(shí)分秒
詳見:
4、查看表分區(qū) select table_name,partition_name from user_tab_partitions where table_name='INTERVAL_SALES';
5、插入數(shù)據(jù)再次查看分區(qū),詳見:
6、修改分區(qū)、合并分區(qū)、拆分分區(qū),詳見 :
7、創(chuàng)建索引(分區(qū)索引、全局索引) :
非分區(qū)字段創(chuàng)建主鍵,則創(chuàng)建主鍵local索引時(shí)必須加上分區(qū)字段
ALTER TABLE TEST ADD CONSTRAINT PK_TEST PRIMARY KEY (主鍵字段,分區(qū)字段) USING INDEX LOCAL;
8、oracle 10g創(chuàng)建表分區(qū)
9、刪除
1.不保留,直接刪除:
alter table table_name drop/truncate partition partition_name;
具體用drop還是truncate,得你自己衡量,drop的話原來的分區(qū)和數(shù)據(jù)直接就沒有了,truncate的話,只是數(shù)據(jù)沒有了,分區(qū)還在。
Hash Join只能用于相等連接,且只能在CBO優(yōu)化器模式下。相對(duì)于nested loop join,hash join更適合處理大型結(jié)果集Hash Join的執(zhí)行計(jì)劃第1個(gè)是hash表(build table),第2個(gè)探查表(probe table),一般不叫內(nèi)外表,nested loop才有內(nèi)外表Hash表也就是所謂的內(nèi)表,探查表所謂的外表
兩者的執(zhí)行計(jì)劃形如:
nested loop
outer table --驅(qū)動(dòng)表
inner table
hash join
build table (inner table) --驅(qū)動(dòng)表
probe table (outer table)
先看一張圖片,大致了解Hash Join的過程:
深入理解Oracle表:三大表連接方式詳解之Hash Join的定義,原理,算法,成本,模式和位圖 - Andy - Andys home下面詳細(xì)了解一下Hash Join
一 Hash join概念
Hash join算法的一個(gè)基本思想就是根據(jù)小的row sources(稱作build input 也就是前文提到的build table,我們記較小的表為S,較大的表為B)建立一個(gè)可以存在于hash area內(nèi)存中的hash table然后用大的row sources(稱作probe input,也就是前文提到的probe table) 來探測(cè)前面所建的hash table如果hash area內(nèi)存不夠大,hash table就無法完全存放在hash area內(nèi)存中針對(duì)這種情況,Oracle在連接鍵利用一個(gè)hash函數(shù)將build input和probe input分割成多個(gè)不相連的分區(qū)分別記作Si和Bi,這個(gè)階段叫做分區(qū)階段;然后各自相應(yīng)的分區(qū),即Si和Bi再做Hash join,這個(gè)階段叫做join階段如果HASH表太大,無法一次構(gòu)造在內(nèi)存中,則分成若干個(gè)partition,寫入磁盤的temporary segment,則會(huì)多一個(gè)寫的代價(jià),會(huì)降低效率至于小表的概念,對(duì)于 hash join 來說,能容納在 pga 中的 hash table 都可以叫小表,通常比如:
pga_aggregate_target big integer 1073741824hash area size 大體能使用到40多 M ,這樣的話通常可能容納 幾十萬的記錄hash area size缺省是2*sort_area_size,我們可以直接修改SORT_AREA_SIZE 的大小,HASH_AREA_SIZE也會(huì)跟著改變的如果你的workarea_size_policy=auto,那么我們只需設(shè)定pga_aggregate_target但請(qǐng)記住,這是一個(gè)session級(jí)別的參數(shù),有時(shí),我們更傾向于把hash_area_size的大小設(shè)成驅(qū)動(dòng)表的1.6倍左右驅(qū)動(dòng)表僅僅用于nested loop join 和 hash join,但Hash join不需要在驅(qū)動(dòng)表上存在索引,而nested loop join則迫切需求一兩百萬記錄的表 join上 千萬記錄的表,hash join的通常表現(xiàn)非常好不過,多與少,大與小,很多時(shí)候很難量化,具體情況還得具體分析如果在分區(qū)后,針對(duì)某個(gè)分區(qū)所建的hash table還是太大的話,oracle就采用nested loop hash join所謂的nested-loops hash join就是對(duì)部分Si建立hash table,然后讀取所有的Bi與所建的hash table做連接然后再對(duì)剩余的Si建立hash table,再將所有的Bi與所建的hash table做連接,直至所有的Si都連接完了二 Hash Join原理
考慮以下兩個(gè)數(shù)據(jù)集:
S={1,1,1,3,3,4,4,4,4,5,8,8,8,8,10}
B={0,0,1,1,1,1,2,2,2,2,2,2,3,8,9,9,9,10,10,11}
Hash Join的第一步就是判定小表(即build input)是否能完全存放在hash area內(nèi)存中如果能完全存放在內(nèi)存中,則在內(nèi)存中建立hash table,這是最簡(jiǎn)單的hash join如果不能全部存放在內(nèi)存中,則build input必須分區(qū)。分區(qū)的個(gè)數(shù)叫做fan-outFan-out是由hash_area_size和cluster size來決定的。其中cluster size等于db_block_size * _hash_multiblock_io_counthash_multiblock_io_count是個(gè)隱藏參數(shù),在9.0.1以后就不再使用了[sql]
sys@ORCL ed
Wrote file afiedt.buf
1 select a.ksppinm name,b.ksppstvl value,a.ksppdesc description2 from x$ksppi a,x$ksppcv b
3 where a.indx = b.indx
4* and a.ksppinm like '%hash_multiblock_io_count%'
sys@ORCL /
NAME VALUE DESCRIPTION
------------------------------ ----- ------------------------------------------------------------_hash_multiblock_io_count 0 number of blocks hash join will read/write at onceOracle采用內(nèi)部一個(gè)hash函數(shù)作用于連接鍵上,將S和B分割成多個(gè)分區(qū)在這里我們假設(shè)這個(gè)hash函數(shù)為求余函數(shù),即Mod(join_column_value,10)這樣產(chǎn)生十個(gè)分區(qū),如下表:
深入理解Oracle表:三大表連接方式詳解之Hash Join的定義,原理,算法,成本,模式和位圖 - Andy - Andys home經(jīng)過這樣的分區(qū)之后,只需要相應(yīng)的分區(qū)之間做join即可(也就是所謂的partition pairs)如果有一個(gè)分區(qū)為NULL的話,則相應(yīng)的分區(qū)join即可忽略在將S表讀入內(nèi)存分區(qū)時(shí),oracle即記錄連接鍵的唯一值,構(gòu)建成所謂的位圖向量它需要占hash area內(nèi)存的5%左右。在這里即為{1,3,4,5,8,10}
當(dāng)對(duì)B表進(jìn)行分區(qū)時(shí),將每一個(gè)連接鍵上的值與位圖向量相比較,如果不在其中,則將其記錄丟棄在我們這個(gè)例子中,B表中以下數(shù)據(jù)將被丟棄{0,0,2,2,2,2,2,2,9,9,9,9,9}
這個(gè)過程就是位圖向量過濾
當(dāng)S1,B1做完連接后,接著對(duì)Si,Bi進(jìn)行連接
這里oracle將比較兩個(gè)分區(qū),選取小的那個(gè)做build input,就是動(dòng)態(tài)角色互換這個(gè)動(dòng)態(tài)角色互換發(fā)生在除第一對(duì)分區(qū)以外的分區(qū)上面三 Hash Join算法
第1步:判定小表是否能夠全部存放在hash area內(nèi)存中,如果可以,則做內(nèi)存hash join。如果不行,轉(zhuǎn)第二步第2步:決定fan-out數(shù)
(Number of Partitions) * C= Favm *M
其中C為Cluster size,其值為DB_BLOCK_SIZE*HASH_MULTIBLOCK_IO_COUNTFavm為hash area內(nèi)存可以使用的百分比,一般為0.8左右M為Hash_area_size的大小
第3步:讀取部分小表S,采用內(nèi)部hash函數(shù)(這里稱為hash_fun_1)將連接鍵值映射至某個(gè)分區(qū),同時(shí)采用hash_fun_2函數(shù)對(duì)連接鍵值產(chǎn)生另外一個(gè)hash值這個(gè)hash值用于創(chuàng)建hash table用,并且與連接鍵值存放在一起第4步:對(duì)build input建立位圖向量
第5步:如果內(nèi)存中沒有空間了,則將分區(qū)寫至磁盤上第6步:讀取小表S的剩余部分,重復(fù)第三步,直至小表S全部讀完第7步:將分區(qū)按大小排序,選取幾個(gè)分區(qū)建立hash table(這里選取分區(qū)的原則是使選取的數(shù)量最多)第8步:根據(jù)前面用hash_fun_2函數(shù)計(jì)算好的hash值,建立hash table第9步:讀取表B,采用位圖向量進(jìn)行位圖向量過濾第10步:對(duì)通過過濾的數(shù)據(jù)采用hash_fun_1函數(shù)將數(shù)據(jù)映射到相應(yīng)的分區(qū)中去,并計(jì)算hash_fun_2的hash值第11步:如果所落的分區(qū)在內(nèi)存中,則將前面通過hash_fun_2函數(shù)計(jì)算所得的hash值與內(nèi)存中已存在的hash table做連接將結(jié)果寫致磁盤上。如果所落的分區(qū)不在內(nèi)存中,則將相應(yīng)的值與表S相應(yīng)的分區(qū)放在一起第12步:繼續(xù)讀取表B,重復(fù)第9步,直至表B讀取完畢第13步:讀取相應(yīng)的(Si,Bi)做hash連接。在這里會(huì)發(fā)生動(dòng)態(tài)角色互換第14步:如果分區(qū)過后,最小的分區(qū)也比內(nèi)存大,則發(fā)生nested-loop hash join四 Hash Join的成本
⑴ In-Memory Hash Join
Cost(HJ)=Read(S)+ build hash table in memory(CPU)+Read(B) + Perform In memory Join(CPU)忽略cpu的時(shí)間,則:
Cost(HJ)=Read(S)+Read(B)
⑵ On-Disk Hash Join
根據(jù)上述的步驟描述,我們可以看出:
Cost(HJ)=Cost(HJ1)+Cost(HJ2)
其中Cost(HJ1)的成本就是掃描S,B表,并將無法放在內(nèi)存上的部分寫回磁盤,對(duì)應(yīng)前面第2步至第12步Cost(HJ2)即為做nested-loop hash join的成本,對(duì)應(yīng)前面的第13步至第14步其中Cost(HJ1)近似等于Read(S)+Read(B)+Write((S-M)+(B-B*M/S))因?yàn)樵谧鰊ested-loop hash join時(shí),對(duì)每一chunk的build input,都需要讀取整個(gè)probe input,因此Cost(HJ2)近似等于Read((S-M)+n*(B-B*M/S)),其中n是nested-loop hash join需要循環(huán)的次數(shù):n=(S/F)/M一般情況下,如果n大于10的話,hash join的性能將大大下降從n的計(jì)算公式可以看出,n與Fan-out成反比例,提高fan-out,可以降低n當(dāng)hash_area_size是固定時(shí),可以降低cluster size來提高fan-out從這里我們可以看出,提高h(yuǎn)ash_multiblock_io_count參數(shù)的值并不一定提高h(yuǎn)ash join的性能五 Hash Join的過程
一次完整的hash join如下:
1 計(jì)算小表的分區(qū)(bucket)數(shù)--Hash分桶
決定hash join的一個(gè)重要因素是小表的分區(qū)(bucket)數(shù)這個(gè)數(shù)字由hash_area_size、hash_multiblock_io_count和db_block_size參數(shù)共同決定Oracle會(huì)保留hash area的20%來存儲(chǔ)分區(qū)的頭信息、hash位圖信息和hash表因此,這個(gè)數(shù)字的計(jì)算公式是:
Bucket數(shù)=0.8*hash_area_size/(hash_multiblock_io_count*db_block_size)2 Hash計(jì)算
讀取小表數(shù)據(jù)(簡(jiǎn)稱為R),并對(duì)每一條數(shù)據(jù)根據(jù)hash算法進(jìn)行計(jì)算Oracle采用兩種hash算法進(jìn)行計(jì)算,計(jì)算出能達(dá)到最快速度的hash值(第一hash值和第二hash值)而關(guān)于這些分區(qū)的全部hash值(第一hash值)就成為hash表3 存放數(shù)據(jù)到hash內(nèi)存中
將經(jīng)過hash算法計(jì)算的數(shù)據(jù),根據(jù)各個(gè)bucket的hash值(第一hash值)分別放入相應(yīng)的bucket中第二hash值就存放在各條記錄中
4 創(chuàng)建hash位圖
與此同時(shí),也創(chuàng)建了一個(gè)關(guān)于這兩個(gè)hash值映射關(guān)系的hash位圖5 超出內(nèi)存大小部分被移到磁盤
如果hash area被占滿,那最大一個(gè)分區(qū)就會(huì)被寫到磁盤(臨時(shí)表空間)上去任何需要寫入到磁盤分區(qū)上的記錄都會(huì)導(dǎo)致磁盤分區(qū)被更新這樣的話,就會(huì)嚴(yán)重影響性能,因此一定要盡量避免這種情況2-5一直持續(xù)到整個(gè)表的數(shù)據(jù)讀取完畢
6 對(duì)分區(qū)排序
為了能充分利用內(nèi)存,盡量存儲(chǔ)更多的分區(qū),Oracle會(huì)按照各個(gè)分區(qū)的大小將他們?cè)趦?nèi)存中排序7 讀取大表數(shù)據(jù),進(jìn)行hash匹配
接下來就開始讀取大表(簡(jiǎn)稱S)中的數(shù)據(jù)
按順序每讀取一條記錄,計(jì)算它的hash值,并檢查是否與內(nèi)存中的分區(qū)的hash值一致如果是,返回join數(shù)據(jù)
如果內(nèi)存中的分區(qū)沒有符合的,就將S中的數(shù)據(jù)寫入到一個(gè)新的分區(qū)中,這個(gè)分區(qū)也采用與計(jì)算R一樣的算法計(jì)算出hash值也就是說這些S中的數(shù)據(jù)產(chǎn)生的新的分區(qū)數(shù)應(yīng)該和R的分區(qū)集的分區(qū)數(shù)一樣。這些新的分區(qū)被存儲(chǔ)在磁盤(臨時(shí)表空間)上8 完全大表全部數(shù)據(jù)的讀取
一直按照7進(jìn)行,直到大表中的所有數(shù)據(jù)的讀取完畢9 處理沒有join的數(shù)據(jù)
這個(gè)時(shí)候就產(chǎn)生了一大堆join好的數(shù)據(jù)和從R和S中計(jì)算存儲(chǔ)在磁盤上的分區(qū)10 二次hash計(jì)算
從R和S的分區(qū)集中抽取出最小的一個(gè)分區(qū),使用第二種hash函數(shù)計(jì)算出并在內(nèi)存中創(chuàng)建hash表采用第二種hash函數(shù)的原因是為了使數(shù)據(jù)分布性更好11 二次hash匹配
在從另一個(gè)數(shù)據(jù)源(與hash在內(nèi)存的那個(gè)分區(qū)所屬數(shù)據(jù)源不同的)中讀取分區(qū)數(shù)據(jù),與內(nèi)存中的新hash表進(jìn)行匹配。返回join數(shù)據(jù)12 完成全部hash join
繼續(xù)按照9-11處理剩余分區(qū),直到全部處理完畢六 Hash Join的模式
Oracle中,Hash Join也有三種模式:optimal,one-pass,multi-pass⑴ optimal
當(dāng)驅(qū)動(dòng)結(jié)果集生成的hash表全部可以放入PGA的hash area時(shí),稱為optimal,大致過程如下:
① 先根據(jù)驅(qū)動(dòng)表,得到驅(qū)動(dòng)結(jié)果集
② 在hash area生成hash bulket,并將若干bulket分成一組,成為一個(gè)partition,還會(huì)生成一個(gè)bitmap的列表,每個(gè)bulket在上面占一位③ 對(duì)結(jié)果集的join鍵做hash運(yùn)算,將數(shù)據(jù)分散到相應(yīng)partition的bulket中當(dāng)運(yùn)算完成后,如果鍵值唯一性較高的話,bulket里的數(shù)據(jù)會(huì)比較均勻,也有可能有的桶里面數(shù)據(jù)會(huì)是空的這樣bitmap上對(duì)應(yīng)的標(biāo)志位就是0,有數(shù)據(jù)的桶,標(biāo)志位會(huì)是1④ 開始掃描第二張表,對(duì)jion鍵做hash運(yùn)算,確定應(yīng)該到某個(gè)partition的某個(gè)bulket去探測(cè)探測(cè)之前,會(huì)看這個(gè)bulket的bitmap是否會(huì)1,如果為0,表示沒數(shù)據(jù),這行就直接丟棄掉⑤ 如果bitmap為1,則在桶內(nèi)做精確匹配,判斷OK后,返回?cái)?shù)據(jù)這個(gè)是最優(yōu)的hash join,他的成本基本是兩張表的full table scan,在加微量的hash運(yùn)算博客開篇的那幅圖描述的也就是這種情況
⑵ one-pass
如果進(jìn)程的pga很小,或者驅(qū)動(dòng)表結(jié)果集很大,超過了hash area的大小,會(huì)怎么辦?
當(dāng)然會(huì)用到臨時(shí)表空間,此時(shí)oracle的處理方式稍微復(fù)雜點(diǎn)需奧注意上面提到的有個(gè)partition的概念可以這么理解,數(shù)據(jù)是經(jīng)過兩次hash運(yùn)算的,先確定你的partition,再確定你的bulket假設(shè)hash area小于整個(gè)hash table,但至少大于一個(gè)partition的size,這個(gè)時(shí)候走的就是one-pass當(dāng)我們生成好hash表后,狀況是部分partition留在內(nèi)存中,其他的partition留在磁盤臨時(shí)表空間中當(dāng)然也有可能某個(gè)partition一半在內(nèi)存,一半在磁盤,剩下的步驟大致如下:
① 掃描第二張表,對(duì)join鍵做hash運(yùn)算,確定好對(duì)應(yīng)的partition和bulket② 查看bitmap,確定bulket是否有數(shù)據(jù),沒有則直接丟棄③ 如果有數(shù)據(jù),并且這個(gè)partition是在內(nèi)存中的,就進(jìn)入對(duì)應(yīng)的桶去精確匹配,能匹配上,就返回這行數(shù)據(jù),否則丟棄④ 如果partition是在磁盤上的,則將這行數(shù)據(jù)放入磁盤中暫存起來,保存的形式也是partition,bulket的方式⑤ 當(dāng)?shù)诙埍肀粧呙柰旰螅O碌氖球?qū)動(dòng)表和探測(cè)表生成的一大堆partition,保留在磁盤上⑥ 由于兩邊的數(shù)據(jù)都按照相同的hash算法做了partition和bulket,現(xiàn)在只要成對(duì)的比較兩邊partition數(shù)據(jù)即可并且在比較的時(shí)候,oracle也做了優(yōu)化處理,沒有嚴(yán)格的驅(qū)動(dòng)與被驅(qū)動(dòng)關(guān)系他會(huì)在partition對(duì)中選較小的一個(gè)作為驅(qū)動(dòng)來進(jìn)行,直到磁盤上所有的partition對(duì)都join完可以發(fā)現(xiàn),相比optimal,他多出的成本是對(duì)于無法放入內(nèi)存的partition,重新讀取了一次,所以稱為one-pass只要你的內(nèi)存保證能裝下一個(gè)partition,oracle都會(huì)騰挪空間,每個(gè)磁盤partition做到one-pass⑶ multi-pass
這是最復(fù)雜,最糟糕的hash join
此時(shí)hash area小到連一個(gè)partition也容納不下,當(dāng)掃描好驅(qū)動(dòng)表后可能只有半個(gè)partition留在hash area中,另半個(gè)加其他的partition全在磁盤上剩下的步驟和one-pass比價(jià)類似,不同的是針對(duì)partition的處理由于驅(qū)動(dòng)表只有半個(gè)partition在內(nèi)存中,探測(cè)表對(duì)應(yīng)的partition數(shù)據(jù)做探測(cè)時(shí)如果匹配不上,這行還不能直接丟棄,需要繼續(xù)保留到磁盤,和驅(qū)動(dòng)表剩下的半個(gè)partition再做join這里舉例的是內(nèi)存可以裝下半個(gè)partition,如果裝的更少的話,反復(fù)join的次數(shù)將更多當(dāng)發(fā)生multi-pass時(shí),partition物理讀的次數(shù)會(huì)顯著增加七 Hash Join的位圖
這個(gè)位圖包含了每個(gè)hash分區(qū)是否有有值的信息。它記錄了有數(shù)據(jù)的分區(qū)的hash值這個(gè)位圖的最大作用就是,如果probe input中的數(shù)據(jù)沒有與內(nèi)存中的hash表匹配上先查看這個(gè)位圖,以決定是否將沒有匹配的數(shù)據(jù)寫入磁盤那些不可能匹配到的數(shù)據(jù)(即位圖上對(duì)應(yīng)的分區(qū)沒有數(shù)據(jù))就不再寫入磁盤八 小結(jié)
① 確認(rèn)小表是驅(qū)動(dòng)表
② 確認(rèn)涉及到的表和連接鍵分析過了
③ 如果在連接鍵上數(shù)據(jù)不均勻的話,建議做柱狀圖④ 如果可以,調(diào)大hash_area_size的大小或pga_aggregate_target的值⑤ Hash Join適合于小表與大表連接、返回大型結(jié)果集的連接
范圍(range)分區(qū):
一::對(duì)于分區(qū)表,如果where條件種沒有分區(qū)列,那么oracle會(huì)掃描所有的分區(qū),然后做PARTITION RANGE
ALL 操作,這樣成本將比未分區(qū)的全表掃描稍微高點(diǎn),因?yàn)樾枰喜⒏鱾€(gè)分區(qū).
二:范圍分區(qū)可以用values less than (maxvalue)增加一個(gè)默認(rèn)分區(qū),maxvalue 常量表示該分區(qū)用來存放所有其
他分區(qū)無法存放的記錄,
三:范圍分區(qū)可以對(duì)各種謂詞做分區(qū)消除,包括=,,,等比hash,和list分區(qū)要靈活
當(dāng)前名稱:oracle怎么分桶,oracle分桶表
瀏覽路徑:http://chinadenli.net/article43/dsgohhs.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、微信公眾號(hào)、定制網(wǎng)站、搜索引擎優(yōu)化、靜態(tài)網(wǎng)站、App開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)