中文字幕人妻中文_99精品欧美一区二区三区综合在线_精品久久久久一区二区_色月丁香_免费福利在线视频_欧美大片免费观看网址_国产伦精品一区二区三区在线播放_污污污污污污www网站免费_久久月本道色综合久久_色69激情爱久久_尹人香蕉久久99天天拍_国产美女www_亚洲国产精品无码7777一线_五月婷婷六月激情_看免费一级片_精品久久久久久成人av_在线色亚洲_女人另类性混交zo_国产精品青青在线观看爽香蕉_人人澡人人添人人爽一区二区

主頁 > 知識(shí)庫(kù) > 海量數(shù)據(jù)庫(kù)查詢語句

海量數(shù)據(jù)庫(kù)查詢語句

熱門標(biāo)簽:貴州房產(chǎn)智能外呼系統(tǒng)供應(yīng)商 鎮(zhèn)江網(wǎng)路外呼系統(tǒng)供應(yīng)商 電銷外呼有錄音系統(tǒng)有哪些 外呼運(yùn)營(yíng)商線路收費(fèi) 臨沂智能電銷機(jī)器人加盟哪家好 小e電話機(jī)器人 一個(gè)導(dǎo)航軟件能用幾個(gè)地圖標(biāo)注點(diǎn) 申請(qǐng)400電話在哪辦理流程 百度地圖標(biāo)注改顏色
以下代碼說明了我們實(shí)例中數(shù)據(jù)庫(kù)的“紅頭文件”一表的部分?jǐn)?shù)據(jù)結(jié)構(gòu):
CREATE TABLE [dbo].[TGongwen] (    --TGongwen是紅頭文件表名
   [Gid] [int] IDENTITY (1, 1) NOT NULL ,
--本表的id號(hào),也是主鍵
   [title] [varchar] (80) COLLATE Chinese_PRC_CI_AS NULL ,  
--紅頭文件的標(biāo)題
   [fariqi] [datetime] NULL ,
--發(fā)布日期
   [neibuYonghu] [varchar] (70) COLLATE Chinese_PRC_CI_AS NULL ,
--發(fā)布用戶
   [reader] [varchar] (900) COLLATE Chinese_PRC_CI_AS NULL ,
--需要瀏覽的用戶。每個(gè)用戶中間用分隔符“,”分開
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

下面,我們來往數(shù)據(jù)庫(kù)中添加1000萬條數(shù)據(jù):

declare @i int
set @i=1
while @i=250000
begin
    insert into Tgongwen(fariqi,neibuyonghu,reader,title) values('2004-2-5','通信科','通信科,辦公室,王局長(zhǎng),劉局長(zhǎng),張局長(zhǎng),admin,刑偵支隊(duì),特勤支隊(duì),交巡警支隊(duì),經(jīng)偵支隊(duì),戶政科,治安支隊(duì),外事科','這是最先的25萬條記錄')
    set @i=@i+1
end
GO


declare @i int

set @i=1

while @i=250000

begin

    insert into Tgongwen(fariqi,neibuyonghu,reader,title) values('2004-9-16','辦公室','辦公室,通信科,王局長(zhǎng),劉局長(zhǎng),張局長(zhǎng),admin,刑偵支隊(duì),特勤支隊(duì),交巡警支隊(duì),經(jīng)偵支隊(duì),戶政科,外事科','這是中間的25萬條記錄')

    set @i=@i+1

end

GO

 

 

declare @h int
set @h=1
while @h=100
begin
declare @i int
set @i=2002
while @i=2003
begin
declare @j int
        set @j=0
        while @j50
            begin
declare @k int
            set @k=0
            while @k50
            begin
    insert into Tgongwen(fariqi,neibuyonghu,reader,title) values(cast(@i as varchar(4))+'-8-15 3:'+cast(@j as varchar(2))+':'+cast(@j as varchar(2)),'通信科','辦公室,通信科,王局長(zhǎng),劉局長(zhǎng),張局長(zhǎng),admin,刑偵支隊(duì),特勤支隊(duì),交巡警支隊(duì),經(jīng)偵支隊(duì),戶政科,外事科','這是最后的50萬條記錄')
            set @k=@k+1
            end
set @j=@j+1
        end
set @i=@i+1
end
set @h=@h+1
end
GO
declare @i int
set @i=1
while @i=9000000
begin
    insert into Tgongwen(fariqi,neibuyonghu,reader,title) values('2004-5-5','通信科','通信科,辦公室,王局長(zhǎng),劉局長(zhǎng),張局長(zhǎng),admin,刑偵支隊(duì),特勤支隊(duì),交巡警支隊(duì),經(jīng)偵支隊(duì),戶政科,治安支隊(duì),外事科','這是最后添加的900萬條記錄')
    set @i=@i+1000000
end
GO

通過以上語句,我們創(chuàng)建了25萬條由通信科于200425發(fā)布的記錄,25萬條由辦公室于200496發(fā)布的記錄,2002年和2003年各100個(gè)2500條相同日期、不同分秒的由通信科發(fā)布的記錄(共50萬條),還有由通信科于200455發(fā)布的900萬條記錄,合計(jì)1000萬條。

 

一、因情制宜,建立“適當(dāng)”的索引

建立“適當(dāng)”的索引是實(shí)現(xiàn)查詢優(yōu)化的首要前提。

索引(index)是除表之外另一重要的、用戶定義的存儲(chǔ)在物理介質(zhì)上的數(shù)據(jù)結(jié)構(gòu)。當(dāng)根據(jù)索引碼的值搜索數(shù)據(jù)時(shí),索引提供了對(duì)數(shù)據(jù)的快速訪問。事實(shí)上,沒有索引,數(shù)據(jù)庫(kù)也能根據(jù)SELECT語句成功地檢索到結(jié)果,但隨著表變得越來越大,使用“適當(dāng)”的索引的效果就越來越明顯。注意,在這句話中,我們用了“適當(dāng)”這個(gè)詞,這是因?yàn)椋绻褂盟饕龝r(shí)不認(rèn)真考慮其實(shí)現(xiàn)過程,索引既可以提高也會(huì)破壞數(shù)據(jù)庫(kù)的工作性能。

(一)深入淺出理解索引結(jié)構(gòu)

實(shí)際上,您可以把索引理解為一種特殊的目錄。微軟的SQL SERVER提供了兩種索引:聚集索引(clustered index,也稱聚類索引、簇集索引)和非聚集索引(nonclustered index,也稱非聚類索引、非簇集索引)。下面,我們舉例來說明一下聚集索引和非聚集索引的區(qū)別:

其實(shí),我們的漢語字典的正文本身就是一個(gè)聚集索引。比如,我們要查“安”字,就會(huì)很自然地翻開字典的前幾頁,因?yàn)椤鞍病钡钠匆羰恰?/SPAN>an”,而按照拼音排序漢字的字典是以英文字母“a”開頭并以“z”結(jié)尾的,那么“安”字就自然地排在字典的前部。如果您翻完了所有以“a”開頭的部分仍然找不到這個(gè)字,那么就說明您的字典中沒有這個(gè)字;同樣的,如果查“張”字,那您也會(huì)將您的字典翻到最后部分,因?yàn)椤皬垺钡钠匆羰恰?/SPAN>zhang”。也就是說,字典的正文部分本身就是一個(gè)目錄,您不需要再去查其他目錄來找到您需要找的內(nèi)容。

我們把這種正文內(nèi)容本身就是一種按照一定規(guī)則排列的目錄稱為“聚集索引”。

如果您認(rèn)識(shí)某個(gè)字,您可以快速地從自動(dòng)中查到這個(gè)字。但您也可能會(huì)遇到您不認(rèn)識(shí)的字,不知道它的發(fā)音,這時(shí)候,您就不能按照剛才的方法找到您要查的字,而需要去根據(jù)“偏旁部首”查到您要找的字,然后根據(jù)這個(gè)字后的頁碼直接翻到某頁來找到您要找的字。但您結(jié)合“部首目錄”和“檢字表”而查到的字的排序并不是真正的正文的排序方法,比如您查“張”字,我們可以看到在查部首之后的檢字表中“張”的頁碼是672頁,檢字表中“張”的上面是“馳”字,但頁碼卻是63頁,“張”的下面是“弩”字,頁面是390頁。很顯然,這些字并不是真正的分別位于“張”字的上下方,現(xiàn)在您看到的連續(xù)的“馳、張、弩”三字實(shí)際上就是他們?cè)诜蔷奂饕械呐判颍亲值湔闹械淖衷诜蔷奂饕械挠成洹N覀兛梢酝ㄟ^這種方式來找到您所需要的字,但它需要兩個(gè)過程,先找到目錄中的結(jié)果,然后再翻到您所需要的頁碼。

我們把這種目錄純粹是目錄,正文純粹是正文的排序方式稱為“非聚集索引”。

通過以上例子,我們可以理解到什么是“聚集索引”和“非聚集索引”。

進(jìn)一步引申一下,我們可以很容易的理解:每個(gè)表只能有一個(gè)聚集索引,因?yàn)槟夸浿荒馨凑找环N方法進(jìn)行排序。

(二)何時(shí)使用聚集索引或非聚集索引

下面的表總結(jié)了何時(shí)使用聚集索引或非聚集索引(很重要)。

動(dòng)作描述

使用聚集索引

使用非聚集索引

列經(jīng)常被分組排序

應(yīng)

應(yīng)

返回某范圍內(nèi)的數(shù)據(jù)

應(yīng)

不應(yīng)

一個(gè)或極少不同值

不應(yīng)

不應(yīng)

小數(shù)目的不同值

應(yīng)

不應(yīng)

大數(shù)目的不同值

不應(yīng)

應(yīng)

頻繁更新的列

不應(yīng)

應(yīng)

外鍵列

應(yīng)

應(yīng)

主鍵列

應(yīng)

應(yīng)

頻繁修改索引列

不應(yīng)

應(yīng)

事實(shí)上,我們可以通過前面聚集索引和非聚集索引的定義的例子來理解上表。如:返回某范圍內(nèi)的數(shù)據(jù)一項(xiàng)。比如您的某個(gè)表有一個(gè)時(shí)間列,恰好您把聚合索引建立在了該列,這時(shí)您查詢2004112004101之間的全部數(shù)據(jù)時(shí),這個(gè)速度就將是很快的,因?yàn)槟倪@本字典正文是按日期進(jìn)行排序的,聚類索引只需要找到要檢索的所有數(shù)據(jù)中的開頭和結(jié)尾數(shù)據(jù)即可;而不像非聚集索引,必須先查到目錄中查到每一項(xiàng)數(shù)據(jù)對(duì)應(yīng)的頁碼,然后再根據(jù)頁碼查到具體內(nèi)容。

(三)結(jié)合實(shí)際,談索引使用的誤區(qū)

理論的目的是應(yīng)用。雖然我們剛才列出了何時(shí)應(yīng)使用聚集索引或非聚集索引,但在實(shí)踐中以上規(guī)則卻很容易被忽視或不能根據(jù)實(shí)際情況進(jìn)行綜合分析。下面我們將根據(jù)在實(shí)踐中遇到的實(shí)際問題來談一下索引使用的誤區(qū),以便于大家掌握索引建立的方法。

1、主鍵就是聚集索引

這種想法筆者認(rèn)為是極端錯(cuò)誤的,是對(duì)聚集索引的一種浪費(fèi)。雖然SQL SERVER默認(rèn)是在主鍵上建立聚集索引的。

通常,我們會(huì)在每個(gè)表中都建立一個(gè)ID列,以區(qū)分每條數(shù)據(jù),并且這個(gè)ID列是自動(dòng)增大的,步長(zhǎng)一般為1。我們的這個(gè)辦公自動(dòng)化的實(shí)例中的列Gid就是如此。此時(shí),如果我們將這個(gè)列設(shè)為主鍵,SQL SERVER會(huì)將此列默認(rèn)為聚集索引。這樣做有好處,就是可以讓您的數(shù)據(jù)在數(shù)據(jù)庫(kù)中按照ID進(jìn)行物理排序,但筆者認(rèn)為這樣做意義不大。

顯而易見,聚集索引的優(yōu)勢(shì)是很明顯的,而每個(gè)表中只能有一個(gè)聚集索引的規(guī)則,這使得聚集索引變得更加珍貴。

從我們前面談到的聚集索引的定義我們可以看出,使用聚集索引的最大好處就是能夠根據(jù)查詢要求,迅速縮小查詢范圍,避免全表掃描。在實(shí)際應(yīng)用中,因?yàn)?/SPAN>ID號(hào)是自動(dòng)生成的,我們并不知道每條記錄的ID號(hào),所以我們很難在實(shí)踐中用ID號(hào)來進(jìn)行查詢。這就使讓ID號(hào)這個(gè)主鍵作為聚集索引成為一種資源浪費(fèi)。其次,讓每個(gè)ID號(hào)都不同的字段作為聚集索引也不符合“大數(shù)目的不同值情況下不應(yīng)建立聚合索引”規(guī)則;當(dāng)然,這種情況只是針對(duì)用戶經(jīng)常修改記錄內(nèi)容,特別是索引項(xiàng)的時(shí)候會(huì)負(fù)作用,但對(duì)于查詢速度并沒有影響。

在辦公自動(dòng)化系統(tǒng)中,無論是系統(tǒng)首頁顯示的需要用戶簽收的文件、會(huì)議還是用戶進(jìn)行文件查詢等任何情況下進(jìn)行數(shù)據(jù)查詢都離不開字段的是“日期”還有用戶本身的“用戶名”。

通常,辦公自動(dòng)化的首頁會(huì)顯示每個(gè)用戶尚未簽收的文件或會(huì)議。雖然我們的where語句可以僅僅限制當(dāng)前用戶尚未簽收的情況,但如果您的系統(tǒng)已建立了很長(zhǎng)時(shí)間,并且數(shù)據(jù)量很大,那么,每次每個(gè)用戶打開首頁的時(shí)候都進(jìn)行一次全表掃描,這樣做意義是不大的,絕大多數(shù)的用戶1個(gè)月前的文件都已經(jīng)瀏覽過了,這樣做只能徒增數(shù)據(jù)庫(kù)的開銷而已。事實(shí)上,我們完全可以讓用戶打開系統(tǒng)首頁時(shí),數(shù)據(jù)庫(kù)僅僅查詢這個(gè)用戶近3個(gè)月來未閱覽的文件,通過“日期”這個(gè)字段來限制表掃描,提高查詢速度。如果您的辦公自動(dòng)化系統(tǒng)已經(jīng)建立的2年,那么您的首頁顯示速度理論上將是原來速度8倍,甚至更快。

在這里之所以提到“理論上”三字,是因?yàn)槿绻木奂饕€是盲目地建在ID這個(gè)主鍵上時(shí),您的查詢速度是沒有這么高的,即使您在“日期”這個(gè)字段上建立的索引(非聚合索引)。下面我們就來看一下在1000萬條數(shù)據(jù)量的情況下各種查詢的速度表現(xiàn)(3個(gè)月內(nèi)的數(shù)據(jù)為25萬條):

1)僅在主鍵上建立聚集索引,并且不劃分時(shí)間段:

Select gid,fariqi,neibuyonghu,title from tgongwen

用時(shí):128470毫秒(即:128秒)

2)在主鍵上建立聚集索引,在fariq上建立非聚集索引:

 

 

select gid,fariqi,neibuyonghu,title from Tgongwen
where fariqi> dateadd(day,-90,getdate())

用時(shí):53763毫秒(54秒)

3)將聚合索引建立在日期列(fariqi)上:

 

 

select gid,fariqi,neibuyonghu,title from Tgongwen
where fariqi> dateadd(day,-90,getdate())

用時(shí):2423毫秒(2秒)

雖然每條語句提取出來的都是25萬條數(shù)據(jù),各種情況的差異卻是巨大的,特別是將聚集索引建立在日期列時(shí)的差異。事實(shí)上,如果您的數(shù)據(jù)庫(kù)真的有1000萬容量的話,把主鍵建立在ID列上,就像以上的第12種情況,在網(wǎng)頁上的表現(xiàn)就是超時(shí),根本就無法顯示。這也是我摒棄ID列作為聚集索引的一個(gè)最重要的因素。

得出以上速度的方法是:在各個(gè)select語句前加:declare @d datetime

set @d=getdate()

并在select語句后加:

select [語句執(zhí)行花費(fèi)時(shí)間(毫秒)]=datediff(ms,@d,getdate())

2、只要建立索引就能顯著提高查詢速度

事實(shí)上,我們可以發(fā)現(xiàn)上面的例子中,第23條語句完全相同,且建立索引的字段也相同;不同的僅是前者在fariqi字段上建立的是非聚合索引,后者在此字段上建立的是聚合索引,但查詢速度卻有著天壤之別。所以,并非是在任何字段上簡(jiǎn)單地建立索引就能提高查詢速度。

從建表的語句中,我們可以看到這個(gè)有著1000萬數(shù)據(jù)的表中fariqi字段有5003個(gè)不同記錄。在此字段上建立聚合索引是再合適不過了。在現(xiàn)實(shí)中,我們每天都會(huì)發(fā)幾個(gè)文件,這幾個(gè)文件的發(fā)文日期就相同,這完全符合建立聚集索引要求的:“既不能絕大多數(shù)都相同,又不能只有極少數(shù)相同”的規(guī)則。由此看來,我們建立“適當(dāng)”的聚合索引對(duì)于我們提高查詢速度是非常重要的。

3、把所有需要提高查詢速度的字段都加進(jìn)聚集索引,以提高查詢速度

上面已經(jīng)談到:在進(jìn)行數(shù)據(jù)查詢時(shí)都離不開字段的是“日期”還有用戶本身的“用戶名”。既然這兩個(gè)字段都是如此的重要,我們可以把他們合并起來,建立一個(gè)復(fù)合索引(compound index)。

很多人認(rèn)為只要把任何字段加進(jìn)聚集索引,就能提高查詢速度,也有人感到迷惑:如果把復(fù)合的聚集索引字段分開查詢,那么查詢速度會(huì)減慢嗎?帶著這個(gè)問題,我們來看一下以下的查詢速度(結(jié)果集都是25萬條數(shù)據(jù)):(日期列fariqi首先排在復(fù)合聚集索引的起始列,用戶名neibuyonghu排在后列)

1select gid,fariqi,neibuyonghu,title from Tgongwen where fariqi>'2004-5-5'

查詢速度:2513毫秒

2select gid,fariqi,neibuyonghu,title from Tgongwen where fariqi>'2004-5-5' and neibuyonghu='辦公室'

查詢速度:2516毫秒

3select gid,fariqi,neibuyonghu,title from Tgongwen where neibuyonghu='辦公室'

查詢速度:60280毫秒

從以上試驗(yàn)中,我們可以看到如果僅用聚集索引的起始列作為查詢條件和同時(shí)用到復(fù)合聚集索引的全部列的查詢速度是幾乎一樣的,甚至比用上全部的復(fù)合索引列還要略快(在查詢結(jié)果集數(shù)目一樣的情況下);而如果僅用復(fù)合聚集索引的非起始列作為查詢條件的話,這個(gè)索引是不起任何作用的。當(dāng)然,語句12的查詢速度一樣是因?yàn)椴樵兊臈l目數(shù)一樣,如果復(fù)合索引的所有列都用上,而且查詢結(jié)果少的話,這樣就會(huì)形成“索引覆蓋”,因而性能可以達(dá)到最優(yōu)。同時(shí),請(qǐng)記住:無論您是否經(jīng)常使用聚合索引的其他列,但其前導(dǎo)列一定要是使用最頻繁的列。

(四)其他書上沒有的索引使用經(jīng)驗(yàn)總結(jié)

1、用聚合索引比用不是聚合索引的主鍵速度快

下面是實(shí)例語句:(都是提取25萬條數(shù)據(jù))

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-9-16'

使用時(shí)間:3326毫秒

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where gid=250000

使用時(shí)間:4470毫秒

這里,用聚合索引比用不是聚合索引的主鍵速度快了近1/4

2、用聚合索引比用一般的主鍵作order by時(shí)速度快,特別是在小數(shù)據(jù)量情況下

select gid,fariqi,neibuyonghu,reader,title from Tgongwen order by fariqi

用時(shí):12936

select gid,fariqi,neibuyonghu,reader,title from Tgongwen order by gid

用時(shí):18843

這里,用聚合索引比用一般的主鍵作order by時(shí),速度快了3/10。事實(shí)上,如果數(shù)據(jù)量很小的話,用聚集索引作為排序列要比使用非聚集索引速度快得明顯的多;而數(shù)據(jù)量如果很大的話,如10萬以上,則二者的速度差別不明顯。

3、使用聚合索引內(nèi)的時(shí)間段,搜索時(shí)間會(huì)按數(shù)據(jù)占整個(gè)數(shù)據(jù)表的百分比成比例減少,而無論聚合索引使用了多少個(gè)

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi>'2004-1-1'

用時(shí):6343毫秒(提取100萬條)

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi>'2004-6-6'

用時(shí):3170毫秒(提取50萬條)

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-9-16'

用時(shí):3326毫秒(和上句的結(jié)果一模一樣。如果采集的數(shù)量一樣,那么用大于號(hào)和等于號(hào)是一樣的)

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi>'2004-1-1' and fariqi'2004-6-6'

用時(shí):3280毫秒

4 、日期列不會(huì)因?yàn)橛蟹置氲妮斎攵鴾p慢查詢速度

下面的例子中,共有100萬條數(shù)據(jù),200411以后的數(shù)據(jù)有50萬條,但只有兩個(gè)不同的日期,日期精確到日;之前有數(shù)據(jù)50萬條,有5000個(gè)不同的日期,日期精確到秒。

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi>'2004-1-1' order by fariqi

用時(shí):6390毫秒

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi'2004-1-1' order by fariqi

用時(shí):6453毫秒

(五)其他注意事項(xiàng)

“水可載舟,亦可覆舟”,索引也一樣。索引有助于提高檢索性能,但過多或不當(dāng)?shù)乃饕矔?huì)導(dǎo)致系統(tǒng)低效。因?yàn)橛脩粼诒碇忻考舆M(jìn)一個(gè)索引,數(shù)據(jù)庫(kù)就要做更多的工作。過多的索引甚至?xí)?dǎo)致索引碎片。

所以說,我們要建立一個(gè)“適當(dāng)”的索引體系,特別是對(duì)聚合索引的創(chuàng)建,更應(yīng)精益求精,以使您的數(shù)據(jù)庫(kù)能得到高性能的發(fā)揮。

當(dāng)然,在實(shí)踐中,作為一個(gè)盡職的數(shù)據(jù)庫(kù)管理員,您還要多測(cè)試一些方案,找出哪種方案效率最高、最為有效。

 

二、改善SQL語句

很多人不知道SQL語句在SQL SERVER中是如何執(zhí)行的,他們擔(dān)心自己所寫的SQL語句會(huì)被SQL SERVER誤解。比如:

select * from table1 where name='zhangsan' and tID > 10000

和執(zhí)行:

select * from table1 where tID > 10000 and name='zhangsan'

一些人不知道以上兩條語句的執(zhí)行效率是否一樣,因?yàn)槿绻?jiǎn)單的從語句先后上看,這兩個(gè)語句的確是不一樣,如果tID是一個(gè)聚合索引,那么后一句僅僅從表的10000條以后的記錄中查找就行了;而前一句則要先從全表中查找看有幾個(gè)name='zhangsan'的,而后再根據(jù)限制條件條件tID>10000來提出查詢結(jié)果。

事實(shí)上,這樣的擔(dān)心是不必要的。SQL SERVER中有一個(gè)“查詢分析優(yōu)化器”,它可以計(jì)算出where子句中的搜索條件并確定哪個(gè)索引能縮小表掃描的搜索空間,也就是說,它能實(shí)現(xiàn)自動(dòng)優(yōu)化。

雖然查詢優(yōu)化器可以根據(jù)where子句自動(dòng)的進(jìn)行查詢優(yōu)化,但大家仍然有必要了解一下“查詢優(yōu)化器”的工作原理,如非這樣,有時(shí)查詢優(yōu)化器就會(huì)不按照您的本意進(jìn)行快速查詢。

在查詢分析階段,查詢優(yōu)化器查看查詢的每個(gè)階段并決定限制需要掃描的數(shù)據(jù)量是否有用。如果一個(gè)階段可以被用作一個(gè)掃描參數(shù)(SARG),那么就稱之為可優(yōu)化的,并且可以利用索引快速獲得所需數(shù)據(jù)。

SARG的定義:用于限制搜索的一個(gè)操作,因?yàn)樗ǔJ侵敢粋€(gè)特定的匹配,一個(gè)值得范圍內(nèi)的匹配或者兩個(gè)以上條件的AND連接。形式如下:

列名 操作符 常數(shù) 變量>

常數(shù) 變量> 操作符列名

列名可以出現(xiàn)在操作符的一邊,而常數(shù)或變量出現(xiàn)在操作符的另一邊。如:

Name='張三'

價(jià)格>5000

5000價(jià)格

Name='張三' and 價(jià)格>5000

如果一個(gè)表達(dá)式不能滿足SARG的形式,那它就無法限制搜索的范圍了,也就是SQL SERVER必須對(duì)每一行都判斷它是否滿足WHERE子句中的所有條件。所以一個(gè)索引對(duì)于不滿足SARG形式的表達(dá)式來說是無用的。

介紹完SARG后,我們來總結(jié)一下使用SARG以及在實(shí)踐中遇到的和某些資料上結(jié)論不同的經(jīng)驗(yàn):

1Like語句是否屬于SARG取決于所使用的通配符的類型

如:name like ‘張%' ,這就屬于SARG

而:name like %張' ,就不屬于SARG

原因是通配符%在字符串的開通使得索引無法使用。

2or 會(huì)引起全表掃描

Name='張三' and 價(jià)格>5000 符號(hào)SARG,而:Name='張三' or 價(jià)格>5000 則不符合SARG。使用or會(huì)引起全表掃描。

3、非操作符、函數(shù)引起的不滿足SARG形式的語句

不滿足SARG形式的語句最典型的情況就是包括非操作符的語句,如:NOT!=>!!>NOT EXISTSNOT INNOT LIKE等,另外還有函數(shù)。下面就是幾個(gè)不滿足SARG形式的例子:

ABS(價(jià)格)5000

Name like %三'

有些表達(dá)式,如:

WHERE 價(jià)格*2>5000

SQL SERVER也會(huì)認(rèn)為是SARGSQL SERVER會(huì)將此式轉(zhuǎn)化為:

WHERE 價(jià)格>2500/2

但我們不推薦這樣使用,因?yàn)橛袝r(shí)SQL SERVER不能保證這種轉(zhuǎn)化與原始表達(dá)式是完全等價(jià)的。

4IN 的作用相當(dāng)與OR

語句:

Select * from table1 where tid in (2,3)

Select * from table1 where tid=2 or tid=3

是一樣的,都會(huì)引起全表掃描,如果tid上有索引,其索引也會(huì)失效。

5、盡量少用NOT

6exists in 的執(zhí)行效率是一樣的

很多資料上都顯示說,exists要比in的執(zhí)行效率要高,同時(shí)應(yīng)盡可能的用not exists來代替not in。但事實(shí)上,我試驗(yàn)了一下,發(fā)現(xiàn)二者無論是前面帶不帶not,二者之間的執(zhí)行效率都是一樣的。因?yàn)樯婕白硬樵儯覀冊(cè)囼?yàn)這次用SQL SERVER自帶的pubs數(shù)據(jù)庫(kù)。運(yùn)行前我們可以把SQL SERVERstatistics I/O狀態(tài)打開。

1select title,price from titles where title_id in (select title_id from sales where qty>30)

該句的執(zhí)行結(jié)果為:

'sales'。掃描計(jì)數(shù) 18,邏輯讀 56 次,物理讀 0 次,預(yù)讀 0 次。

'titles'。掃描計(jì)數(shù) 1,邏輯讀 2 次,物理讀 0 次,預(yù)讀 0 次。

   

2select title,price from titles where exists (select * from sales where sales.title_id=titles.title_id and qty>30)

第二句的執(zhí)行結(jié)果為:

'sales'。掃描計(jì)數(shù) 18,邏輯讀 56 次,物理讀 0 次,預(yù)讀 0 次。

'titles'。掃描計(jì)數(shù) 1,邏輯讀 2 次,物理讀 0 次,預(yù)讀 0 次。

我們從此可以看到用exists和用in的執(zhí)行效率是一樣的。

7、用函數(shù)charindex()和前面加通配符%LIKE執(zhí)行效率一樣

前面,我們談到,如果在LIKE前面加上通配符%,那么將會(huì)引起全表掃描,所以其執(zhí)行效率是低下的。但有的資料介紹說,用函數(shù)charindex()來代替LIKE速度會(huì)有大的提升,經(jīng)我試驗(yàn),發(fā)現(xiàn)這種說明也是錯(cuò)誤的:

select gid,title,fariqi,reader from tgongwen where charindex('刑偵支隊(duì)',reader)>0 and fariqi>'2004-5-5'

用時(shí):7秒,另外:掃描計(jì)數(shù) 4,邏輯讀 7155 次,物理讀 0 次,預(yù)讀 0 次。

select gid,title,fariqi,reader from tgongwen where reader like '%' + '刑偵支隊(duì)' + '%' and fariqi>'2004-5-5'

用時(shí):7秒,另外:掃描計(jì)數(shù) 4,邏輯讀 7155 次,物理讀 0 次,預(yù)讀 0 次。

8union并不絕對(duì)比or的執(zhí)行效率高

我們前面已經(jīng)談到了在where子句中使用or會(huì)引起全表掃描,一般的,我所見過的資料都是推薦這里用union來代替or。事實(shí)證明,這種說法對(duì)于大部分都是適用的。

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-9-16' or gid>9990000

用時(shí):68秒。掃描計(jì)數(shù) 1,邏輯讀 404008 次,物理讀 283 次,預(yù)讀 392163 次。

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-9-16'

union

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where gid>9990000

用時(shí):9秒。掃描計(jì)數(shù) 8,邏輯讀 67489 次,物理讀 216 次,預(yù)讀 7499 次。

看來,用union在通常情況下比用or的效率要高的多。

但經(jīng)過試驗(yàn),筆者發(fā)現(xiàn)如果or兩邊的查詢列是一樣的話,那么用union則反倒和用or的執(zhí)行速度差很多,雖然這里union掃描的是索引,而or掃描的是全表。

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-9-16' or fariqi='2004-2-5'

用時(shí):6423毫秒。掃描計(jì)數(shù) 2,邏輯讀 14726 次,物理讀 1 次,預(yù)讀 7176 次。

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-9-16'

union

select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi='2004-2-5'

用時(shí):11640毫秒。掃描計(jì)數(shù) 8,邏輯讀 14806 次,物理讀 108 次,預(yù)讀 1144 次。

9、字段提取要按照“需多少、提多少”的原則,避免“select *

我們來做一個(gè)試驗(yàn):

select top 10000 gid,fariqi,reader,title from tgongwen order by gid desc

用時(shí):4673毫秒

select top 10000 gid,fariqi,title from tgongwen order by gid desc

用時(shí):1376毫秒

select top 10000 gid,fariqi from tgongwen order by gid desc

用時(shí):80毫秒

由此看來,我們每少提取一個(gè)字段,數(shù)據(jù)的提取速度就會(huì)有相應(yīng)的提升。提升的速度還要看您舍棄的字段的大小來判斷。

10count(*)不比count(字段)

某些資料上說:用*會(huì)統(tǒng)計(jì)所有列,顯然要比一個(gè)世界的列名效率低。這種說法其實(shí)是沒有根據(jù)的。我們來看:

select count(*) from Tgongwen

用時(shí):1500毫秒

select count(gid) from Tgongwen

用時(shí):1483毫秒

select count(fariqi) from Tgongwen

用時(shí):3140毫秒

select count(title) from Tgongwen

用時(shí):52050毫秒

從以上可以看出,如果用count(*)和用count(主鍵)的速度是相當(dāng)?shù)模?/SPAN>count(*)卻比其他任何除主鍵以外的字段匯總速度要快,而且字段越長(zhǎng),匯總的速度就越慢。我想,如果用count(*) SQL SERVER可能會(huì)自動(dòng)查找最小字段來匯總的。當(dāng)然,如果您直接寫count(主鍵)將會(huì)來的更直接些。

11order by按聚集索引列排序效率最高

我們來看:(gid是主鍵,fariqi是聚合索引列)

select top 10000 gid,fariqi,reader,title from tgongwen

用時(shí):196 毫秒。 掃描計(jì)數(shù) 1,邏輯讀 289 次,物理讀 1 次,預(yù)讀 1527 次。

select top 10000 gid,fariqi,reader,title from tgongwen order by gid asc

用時(shí):4720毫秒。 掃描計(jì)數(shù) 1,邏輯讀 41956 次,物理讀 0 次,預(yù)讀 1287 次。

select top 10000 gid,fariqi,reader,title from tgongwen order by gid desc

用時(shí):4736毫秒。 掃描計(jì)數(shù) 1,邏輯讀 55350 次,物理讀 10 次,預(yù)讀 775 次。

select top 10000 gid,fariqi,reader,title from tgongwen order by fariqi asc

用時(shí):173毫秒。 掃描計(jì)數(shù) 1,邏輯讀 290 次,物理讀 0 次,預(yù)讀 0 次。

select top 10000 gid,fariqi,reader,title from tgongwen order by fariqi desc

用時(shí):156毫秒。 掃描計(jì)數(shù) 1,邏輯讀 289 次,物理讀 0 次,預(yù)讀 0 次。

從以上我們可以看出,不排序的速度以及邏輯讀次數(shù)都是和“order by 聚集索引列” 的速度是相當(dāng)?shù)模@些都比“order by 非聚集索引列”的查詢速度是快得多的。

同時(shí),按照某個(gè)字段進(jìn)行排序的時(shí)候,無論是正序還是倒序,速度是基本相當(dāng)?shù)摹?/SPAN>

12、高效的TOP

事實(shí)上,在查詢和提取超大容量的數(shù)據(jù)集時(shí),影響數(shù)據(jù)庫(kù)響應(yīng)時(shí)間的最大因素不是數(shù)據(jù)查找,而是物理的I/0操作。如:

select top 10 * from (

select top 10000 gid,fariqi,title from tgongwen

where neibuyonghu='辦公室'

order by gid desc) as a

order by gid asc

這條語句,從理論上講,整條語句的執(zhí)行時(shí)間應(yīng)該比子句的執(zhí)行時(shí)間長(zhǎng),但事實(shí)相反。因?yàn)椋泳鋱?zhí)行后返回的是10000條記錄,而整條語句僅返回10條語句,所以影響數(shù)據(jù)庫(kù)響應(yīng)時(shí)間最大的因素是物理I/O操作。而限制物理I/O操作此處的最有效方法之一就是使用TOP關(guān)鍵詞了。TOP關(guān)鍵詞是SQL SERVER中經(jīng)過系統(tǒng)優(yōu)化過的一個(gè)用來提取前幾條或前幾個(gè)百分比數(shù)據(jù)的詞。經(jīng)筆者在實(shí)踐中的應(yīng)用,發(fā)現(xiàn)TOP確實(shí)很好用,效率也很高。但這個(gè)詞在另外一個(gè)大型數(shù)據(jù)庫(kù)ORACLE中卻沒有,這不能說不是一個(gè)遺憾,雖然在ORACLE中可以用其他方法(如:rownumber)來解決。在以后的關(guān)于“實(shí)現(xiàn)千萬級(jí)數(shù)據(jù)的分頁顯示存儲(chǔ)過程”的討論中,我們就將用到TOP這個(gè)關(guān)鍵詞。

 

到此為止,我們上面討論了如何實(shí)現(xiàn)從大容量的數(shù)據(jù)庫(kù)中快速地查詢出您所需要的數(shù)據(jù)方法。當(dāng)然,我們介紹的這些方法都是“軟”方法,在實(shí)踐中,我們還要考慮各種“硬”因素,如:網(wǎng)絡(luò)性能、服務(wù)器的性能、操作系統(tǒng)的性能,甚至網(wǎng)卡、交換機(jī)等。

 

三、實(shí)現(xiàn)小數(shù)據(jù)量和海量數(shù)據(jù)的通用分頁顯示存儲(chǔ)過程

建立一個(gè)web 應(yīng)用,分頁瀏覽功能必不可少。這個(gè)問題是數(shù)據(jù)庫(kù)處理中十分常見的問題。經(jīng)典的數(shù)據(jù)分頁方法是:ADO 紀(jì)錄集分頁法,也就是利用ADO自帶的分頁功能(利用游標(biāo))來實(shí)現(xiàn)分頁。但這種分頁方法僅適用于較小數(shù)據(jù)量的情形,因?yàn)橛螛?biāo)本身有缺點(diǎn):游標(biāo)是存放在內(nèi)存中,很費(fèi)內(nèi)存。游標(biāo)一建立,就將相關(guān)的記錄鎖住,直到取消游標(biāo)。游標(biāo)提供了對(duì)特定集合中逐行掃描的手段,一般使用游標(biāo)來逐行遍歷數(shù)據(jù),根據(jù)取出數(shù)據(jù)條件的不同進(jìn)行不同的操作。而對(duì)于多表和大表中定義的游標(biāo)(大的數(shù)據(jù)集合)循環(huán)很容易使程序進(jìn)入一個(gè)漫長(zhǎng)的等待甚至死機(jī)。

更重要的是,對(duì)于非常大的數(shù)據(jù)模型而言,分頁檢索時(shí),如果按照傳統(tǒng)的每次都加載整個(gè)數(shù)據(jù)源的方法是非常浪費(fèi)資源的。現(xiàn)在流行的分頁方法一般是檢索頁面大小的塊區(qū)的數(shù)據(jù),而非檢索所有的數(shù)據(jù),然后單步執(zhí)行當(dāng)前行。

    最早較好地實(shí)現(xiàn)這種根據(jù)頁面大小和頁碼來提取數(shù)據(jù)的方法大概就是“俄羅斯存儲(chǔ)過程”。這個(gè)存儲(chǔ)過程用了游標(biāo),由于游標(biāo)的局限性,所以這個(gè)方法并沒有得到大家的普遍認(rèn)可。

后來,網(wǎng)上有人改造了此存儲(chǔ)過程,下面的存儲(chǔ)過程就是結(jié)合我們的辦公自動(dòng)化實(shí)例寫的分頁存儲(chǔ)過程:

CREATE procedure pagination1
(@pagesize int,  --頁面大小,如每頁存儲(chǔ)20條記錄
@pageindex int   --當(dāng)前頁碼
)
as
set nocount on
begin
declare @indextable table(id int identity(1,1),nid int)  --定義表變量
declare @PageLowerBound int  --定義此頁的底碼
declare @PageUpperBound int  --定義此頁的頂碼
set @PageLowerBound=(@pageindex-1)*@pagesize
set @PageUpperBound=@PageLowerBound+@pagesize
set rowcount @PageUpperBound
insert into @indextable(nid) select gid from TGongwen where fariqi >dateadd(day,-365,getdate()) order by fariqi desc
select O.gid,O.mid,O.title,O.fadanwei,O.fariqi from TGongwen O,@indextable t where O.gid=t.nid
and t.id>@PageLowerBound and t.id=@PageUpperBound order by t.id
end
set nocount off

以上存儲(chǔ)過程運(yùn)用了SQL SERVER的最新技術(shù)――表變量。應(yīng)該說這個(gè)存儲(chǔ)過程也是一個(gè)非常優(yōu)秀的分頁存儲(chǔ)過程。當(dāng)然,在這個(gè)過程中,您也可以把其中的表變量寫成臨時(shí)表:CREATE TABLE #Temp。但很明顯,在SQL SERVER中,用臨時(shí)表是沒有用表變量快的。所以筆者剛開始使用這個(gè)存儲(chǔ)過程時(shí),感覺非常的不錯(cuò),速度也比原來的ADO的好。但后來,我又發(fā)現(xiàn)了比此方法更好的方法。

筆者曾在網(wǎng)上看到了一篇小短文《從數(shù)據(jù)表中取出第n條到第m條的記錄的方法》,全文如下:

publish 表中取出第 n 條到第 m 條的記錄:

 

 

SELECT TOP m-n+1 * 
FROM publish 
WHERE (id NOT IN 
    (SELECT TOP n-1 id 
     FROM publish)) 

id publish 表的關(guān)鍵字

我當(dāng)時(shí)看到這篇文章的時(shí)候,真的是精神為之一振,覺得思路非常得好。等到后來,我在作辦公自動(dòng)化系統(tǒng)(ASP.NET+ C#SQL SERVER)的時(shí)候,忽然想起了這篇文章,我想如果把這個(gè)語句改造一下,這就可能是一個(gè)非常好的分頁存儲(chǔ)過程。于是我就滿網(wǎng)上找這篇文章,沒想到,文章還沒找到,卻找到了一篇根據(jù)此語句寫的一個(gè)分頁存儲(chǔ)過程,這個(gè)存儲(chǔ)過程也是目前較為流行的一種分頁存儲(chǔ)過程,我很后悔沒有爭(zhēng)先把這段文字改造成存儲(chǔ)過程:

CREATE PROCEDURE pagination2
(
 @SQL nVARCHAR(4000),    --不帶排序語句的SQL語句
 @Page int,              --頁碼
 @RecsPerPage int,       --每頁容納的記錄數(shù)
 @ID VARCHAR(255),       --需要排序的不重復(fù)的ID號(hào)
 @Sort VARCHAR(255)      --排序字段及規(guī)則
)
AS
DECLARE @Str nVARCHAR(4000)
SET @Str='SELECT   TOP '+CAST(@RecsPerPage AS VARCHAR(20))+' * FROM ('+@SQL+') T WHERE T.'+@ID+'NOT IN 
(SELECT   TOP '+CAST((@RecsPerPage*(@Page-1)) AS VARCHAR(20))+' '+@ID+' FROM ('+@SQL+') T9 ORDER BY '+@Sort+'ORDER BY '+@Sort
PRINT @Str
EXEC sp_ExecuteSql @Str
GO

其實(shí),以上語句可以簡(jiǎn)化為:

SELECT TOP 頁大小 *
FROM Table1
WHERE (ID NOT IN
          (SELECT TOP 頁大小*頁數(shù) id
         FROM 表
         ORDER BY id))
ORDER BY ID

但這個(gè)存儲(chǔ)過程有一個(gè)致命的缺點(diǎn),就是它含有NOT IN字樣。雖然我可以把它改造為:

SELECT TOP 頁大小 *
FROM Table1
WHERE not exists
(select * from (select top (頁大小*頁數(shù)) * from table1 order by id) b where b.id=a.id )
order by id

即,用not exists來代替not in,但我們前面已經(jīng)談過了,二者的執(zhí)行效率實(shí)際上是沒有區(qū)別的。

既便如此,用TOP 結(jié)合NOT IN的這個(gè)方法還是比用游標(biāo)要來得快一些。

雖然用not exists并不能挽救上個(gè)存儲(chǔ)過程的效率,但使用SQL SERVER中的TOP關(guān)鍵字卻是一個(gè)非常明智的選擇。因?yàn)榉猪搩?yōu)化的最終目的就是避免產(chǎn)生過大的記錄集,而我們?cè)谇懊嬉惨呀?jīng)提到了TOP的優(yōu)勢(shì),通過TOP 即可實(shí)現(xiàn)對(duì)數(shù)據(jù)量的控制。

在分頁算法中,影響我們查詢速度的關(guān)鍵因素有兩點(diǎn):TOPNOT INTOP可以提高我們的查詢速度,而NOT IN會(huì)減慢我們的查詢速度,所以要提高我們整個(gè)分頁算法的速度,就要徹底改造NOT IN,同其他方法來替代它。

我們知道,幾乎任何字段,我們都可以通過max(字段)min(字段)來提取某個(gè)字段中的最大或最小值,所以如果這個(gè)字段不重復(fù),那么就可以利用這些不重復(fù)的字段的maxmin作為分水嶺,使其成為分頁算法中分開每頁的參照物。在這里,我們可以用操作符“>”或“”號(hào)來完成這個(gè)使命,使查詢語句符合SARG形式。如:

Select top 10 * from table1 where id>200

于是就有了如下分頁方案:

select top 頁大小 *
from table1 
where id>
      (select max (id) from 
      (select top ((頁碼-1)*頁大小) id from table1 order by id) as T
       )     
  order by id

在選擇即不重復(fù)值,又容易分辨大小的列時(shí),我們通常會(huì)選擇主鍵。下表列出了筆者用有著1000萬數(shù)據(jù)的辦公自動(dòng)化系統(tǒng)中的表,在以GIDGID是主鍵,但并不是聚集索引。)為排序列、提取gid,fariqi,title字段,分別以第11010050010001萬、10萬、25萬、50萬頁為例,測(cè)試以上三種分頁方案的執(zhí)行速度:(單位:毫秒)

     方案1     方案2     方案3

1     60    30    76

10    46    16    63

100 1076       720 130

500 540 12943     83

1000       17110      470 250

1 24796     4500       140

10      38326     42283     1553

25      28140     128720    2330

50      121686    127846    7168

從上表中,我們可以看出,三種存儲(chǔ)過程在執(zhí)行100頁以下的分頁命令時(shí),都是可以信任的,速度都很好。但第一種方案在執(zhí)行分頁1000頁以上后,速度就降了下來。第二種方案大約是在執(zhí)行分頁1萬頁以上后速度開始降了下來。而第三種方案卻始終沒有大的降勢(shì),后勁仍然很足。

在確定了第三種分頁方案后,我們可以據(jù)此寫一個(gè)存儲(chǔ)過程。大家知道SQL SERVER的存儲(chǔ)過程是事先編譯好的SQL語句,它的執(zhí)行效率要比通過WEB頁面?zhèn)鱽淼?/SPAN>SQL語句的執(zhí)行效率要高。下面的存儲(chǔ)過程不僅含有分頁方案,還會(huì)根據(jù)頁面?zhèn)鱽淼膮?shù)來確定是否進(jìn)行數(shù)據(jù)總數(shù)統(tǒng)計(jì)。

-- 獲取指定頁的數(shù)據(jù)

CREATE PROCEDURE pagination3
@tblName   varchar(255),       -- 表名
@strGetFields varchar(1000) = '*',  -- 需要返回的列 
@fldName varchar(255)='',      -- 排序的字段名
@PageSize   int = 10,          -- 頁尺寸
@PageIndex  int = 1,           -- 頁碼
@doCount  bit = 0,   -- 返回記錄總數(shù), 非 0 值則返回
@OrderType bit = 0,  -- 設(shè)置排序類型, 非 0 值則降序
@strWhere  varchar(1500) = ''  -- 查詢條件 (注意: 不要加 where)
AS
declare @strSQL   varchar(5000)       -- 主語句
declare @strTmp   varchar(110)        -- 臨時(shí)變量
declare @strOrder varchar(400)        -- 排序類型

if @doCount != 0
  begin
    if @strWhere !=''
    set @strSQL = "select count(*) as Total from [" + @tblName + "] where "+@strWhere
    else
    set @strSQL = "select count(*) as Total from [" + @tblName + "]"
end  
--以上代碼的意思是如果@doCount傳遞過來的不是0,就執(zhí)行總數(shù)統(tǒng)計(jì)。以下的所有代碼都是@doCount為0的情況
else
begin

if @OrderType != 0
begin
    set @strTmp = "(select min"
set @strOrder = " order by [" + @fldName +"] desc"
--如果@OrderType不是0,就執(zhí)行降序,這句很重要!
end
else
begin
    set @strTmp = ">(select max"
    set @strOrder = " order by [" + @fldName +"] asc"
end

if @PageIndex = 1
begin
    if @strWhere != ''   
    set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ "  from [" + @tblName + "] where " + @strWhere + " " + @strOrder
     else
     set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ "  from ["+ @tblName + "] "+ @strOrder
--如果是第一頁就執(zhí)行以上代碼,這樣會(huì)加快執(zhí)行速度
end
else
begin
--以下代碼賦予了@strSQL以真正執(zhí)行的SQL代碼
set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ "  from ["
    + @tblName + "] where [" + @fldName + "]" + @strTmp + "(["+ @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["+ @fldName + "] from [" + @tblName + "]" + @strOrder + ") as tblTmp)"+ @strOrder

if @strWhere != ''
    set @strSQL = "select top " + str(@PageSize) +" "+@strGetFields+ "  from ["
        + @tblName + "] where [" + @fldName + "]" + @strTmp + "(["
        + @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
        + @fldName + "] from [" + @tblName + "] where " + @strWhere + " "
        + @strOrder + ") as tblTmp) and " + @strWhere + " " + @strOrder
end 
end   
exec (@strSQL)
GO

上面的這個(gè)存儲(chǔ)過程是一個(gè)通用的存儲(chǔ)過程,其注釋已寫在其中了。

在大數(shù)據(jù)量的情況下,特別是在查詢最后幾頁的時(shí)候,查詢時(shí)間一般不會(huì)超過9秒;而用其他存儲(chǔ)過程,在實(shí)踐中就會(huì)導(dǎo)致超時(shí),所以這個(gè)存儲(chǔ)過程非常適用于大容量數(shù)據(jù)庫(kù)的查詢。

筆者希望能夠通過對(duì)以上存儲(chǔ)過程的解析,能給大家?guī)硪欢ǖ膯⑹荆⒔o工作帶來一定的效率提升,同時(shí)希望同行提出更優(yōu)秀的實(shí)時(shí)數(shù)據(jù)分頁算法。

 

四、聚集索引的重要性和如何選擇聚集索引

在上一節(jié)的標(biāo)題中,筆者寫的是:實(shí)現(xiàn)小數(shù)據(jù)量和海量數(shù)據(jù)的通用分頁顯示存儲(chǔ)過程。這是因?yàn)樵趯⒈敬鎯?chǔ)過程應(yīng)用于“辦公自動(dòng)化”系統(tǒng)的實(shí)踐中時(shí),筆者發(fā)現(xiàn)這第三種存儲(chǔ)過程在小數(shù)據(jù)量的情況下,有如下現(xiàn)象:

1、分頁速度一般維持在1秒和3秒之間。

2、在查詢最后一頁時(shí),速度一般為5秒至8秒,哪怕分頁總數(shù)只有3頁或30萬頁。

雖然在超大容量情況下,這個(gè)分頁的實(shí)現(xiàn)過程是很快的,但在分前幾頁時(shí),這個(gè)13秒的速度比起第一種甚至沒有經(jīng)過優(yōu)化的分頁方法速度還要慢,借用戶的話說就是“還沒有ACCESS數(shù)據(jù)庫(kù)速度快”,這個(gè)認(rèn)識(shí)足以導(dǎo)致用戶放棄使用您開發(fā)的系統(tǒng)。

筆者就此分析了一下,原來產(chǎn)生這種現(xiàn)象的癥結(jié)是如此的簡(jiǎn)單,但又如此的重要:排序的字段不是聚集索引!

本篇文章的題目是:“查詢優(yōu)化及分頁算法方案”。筆者只所以把“查詢優(yōu)化”和“分頁算法”這兩個(gè)聯(lián)系不是很大的論題放在一起,就是因?yàn)槎叨夹枰粋€(gè)非常重要的東西――聚集索引。

在前面的討論中我們已經(jīng)提到了,聚集索引有兩個(gè)最大的優(yōu)勢(shì):

1、以最快的速度縮小查詢范圍。

2、以最快的速度進(jìn)行字段排序。

1條多用在查詢優(yōu)化時(shí),而第2條多用在進(jìn)行分頁時(shí)的數(shù)據(jù)排序。

而聚集索引在每個(gè)表內(nèi)又只能建立一個(gè),這使得聚集索引顯得更加的重要。聚集索引的挑選可以說是實(shí)現(xiàn)“查詢優(yōu)化”和“高效分頁”的最關(guān)鍵因素。

但要既使聚集索引列既符合查詢列的需要,又符合排序列的需要,這通常是一個(gè)矛盾。

筆者前面“索引”的討論中,將fariqi,即用戶發(fā)文日期作為了聚集索引的起始列,日期的精確度為“日”。這種作法的優(yōu)點(diǎn),前面已經(jīng)提到了,在進(jìn)行劃時(shí)間段的快速查詢中,比用ID主鍵列有很大的優(yōu)勢(shì)。

但在分頁時(shí),由于這個(gè)聚集索引列存在著重復(fù)記錄,所以無法使用maxmin來最為分頁的參照物,進(jìn)而無法實(shí)現(xiàn)更為高效的排序。而如果將ID主鍵列作為聚集索引,那么聚集索引除了用以排序之外,沒有任何用處,實(shí)際上是浪費(fèi)了聚集索引這個(gè)寶貴的資源。

為解決這個(gè)矛盾,筆者后來又添加了一個(gè)日期列,其默認(rèn)值為getdate()。用戶在寫入記錄時(shí),這個(gè)列自動(dòng)寫入當(dāng)時(shí)的時(shí)間,時(shí)間精確到毫秒。即使這樣,為了避免可能性很小的重合,還要在此列上創(chuàng)建UNIQUE約束。將此日期列作為聚集索引列。

有了這個(gè)時(shí)間型聚集索引列之后,用戶就既可以用這個(gè)列查找用戶在插入數(shù)據(jù)時(shí)的某個(gè)時(shí)間段的查詢,又可以作為唯一列來實(shí)現(xiàn)maxmin,成為分頁算法的參照物。

經(jīng)過這樣的優(yōu)化,筆者發(fā)現(xiàn),無論是大數(shù)據(jù)量的情況下還是小數(shù)據(jù)量的情況下,分頁速度一般都是幾十毫秒,甚至0毫秒。而用日期段縮小范圍的查詢速度比原來也沒有任何遲鈍。

聚集索引是如此的重要和珍貴,所以筆者總結(jié)了一下,一定要將聚集索引建立在:

1、您最頻繁使用的、用以縮小查詢范圍的字段上;

2、您最頻繁使用的、需要排序的字段上。

這個(gè)如果是我在csdn里看到的那個(gè)的話,那么這里有幾個(gè)地方說的是有問題的。
比如
“主鍵就是聚集索引
這種想法筆者認(rèn)為是極端錯(cuò)誤的,是對(duì)聚集索引的一種浪費(fèi)。雖然SQL SERVER默認(rèn)是在主鍵上建立聚集索引的。”
我覺得應(yīng)該給主鍵加上聚集索引。

他的測(cè)試數(shù)據(jù)也有問題,同一天內(nèi)的記錄居然有25萬條,2004年5月5日的竟然達(dá)到了900萬條記錄。
這樣的測(cè)試數(shù)據(jù)就導(dǎo)致了測(cè)試結(jié)果的普遍性。
也就是說他的測(cè)試產(chǎn)生的結(jié)論可能只適合1000萬條記錄、不平均分布的情況,卻不適合幾十萬條記錄、平均分布的情況。

標(biāo)簽:合肥 澳門 嘉興 晉城 延邊 日照 保定 三明

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《海量數(shù)據(jù)庫(kù)查詢語句》,本文關(guān)鍵詞  海量,數(shù)據(jù)庫(kù),查詢,語句,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《海量數(shù)據(jù)庫(kù)查詢語句》相關(guān)的同類信息!
  • 本頁收集關(guān)于海量數(shù)據(jù)庫(kù)查詢語句的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 建湖县液压机械有限公司| 合肥逸飞包装机械有限公司| 濮阳市名利石化机械设备制造有限公司 | 山东永华机械有限公司| 郑州市长城重工机械有限公司| 浙江顺得机械有限公司| 新疆 机械有限公司| 宁江精密机械有限公司| 广州工程机械有限公司| 力源液压机械有限公司| 昆山施耐特机械有限公司| 宜兴市华鼎机械有限公司| 昆玉钢铁有限公司招聘| 绵阳机械制造有限公司| 南通中远重工有限公司| 碎得机械北京有限公司| 诺威起重设备苏州有限公司| 文水海威钢铁有限公司| 常州泽威输送机械有限公司| 三星机械制造有限公司| 艺达精密机械有限公司| 保定 机械有限公司| 东莞市鸿铭机械有限公司| 广东仕诚塑料机械有限公司| 兰溪永丰机械有限公司| 山东瑞浩重型机械有限公司| 诸暨市 机械有限公司| 上海卓越机械有限公司| 益丰泰机械有限公司| 重庆庆达机械有限公司| 上海诚达机械有限公司| 上海宝峨机械有限公司| 温州锐光机械有限公司| 温州韦盛机械有限公司| 西安中天机械有限公司| 杭州 机械有限公司| 浙江宇丰机械有限公司| 苏州乐嘉机械有限公司| 绍兴金昊机械制造有限公司| 南通盛仕达精密机械有限公司| 中山 机械有限公司| 山东起重设备有限公司| 山东岳工机械有限公司| 上海众德机械有限公司| 华天机械制造有限公司| 南通图海机械有限公司| 益阳中源钢铁有限公司| 长沙起重机厂有限公司| 大阳通用机械有限公司| 南通申通机械有限公司| 上海毅锴机械有限公司| 唐山神州机械有限公司| 宇进注塑机械有限公司| 全氏食品机械(上海)有限公司| 东莞市金峥机械有限公司 | 天津天重江天重工有限公司| 上海豪德机械有限公司| 张家港长力机械有限公司| 杭州鼎升机械有限公司| 上海全驰机械有限公司| 广东巨风机械制造有限公司| 北京复盛机械有限公司| 新乡 筛分机械有限公司| 温州立胜印刷包装机械有限公司| 国机重工洛阳有限公司| 台州博州机械有限公司| 广州东升机械有限公司| 宝鸡石油机械有限公司| 新乡市金原起重机械有限公司| 江苏润山机械有限公司| 新乡市东源机械有限公司| 杭州龙云水利机械制造有限公司 | 杭州铁正机械有限公司| 广州文穗塑料机械有限公司| 乐星机械无锡有限公司| 浙江顶峰机械有限公司| 沁阳宏达钢铁有限公司| 河北大恒重型机械有限公司| 福州机械制造有限公司| 天津市三鼎包装机械有限公司 | 河北晓进机械制造有限公司| 太仓鸿安机械有限公司| 河北永明地质工程机械有限公司| 江门 机械 有限公司| 佛山市晶菱玻璃机械有限公司| 太原通泽重工有限公司| 柳州富达机械有限公司| 浙江 料机械有限公司| 湖北铁正机械有限公司| 杭州定江机械有限公司| 盐城中热机械有限公司| 海南建设工程机械施工有限公司| 佛山市海裕机械有限公司| 青州市晨光机械有限公司| 江苏科力机械有限公司| 扬州诺亚机械有限公司| 湖北华伟石化机械设备制造有限公司 | 苏州昶智精密机械有限公司| 柳州瑞利机械有限公司| 鸿源机械制造有限公司| 工机械制造有限公司| 诸城市铭威食品机械有限公司 | 山东华雄机械有限公司| 合肥中通抛光机械有限公司| 东莞市鸿铭机械有限公司| 舟山荣德机械有限公司| 重庆华世丹机械制造有限公司| 泰钢钢铁贸易有限公司| 郑州双狮粮油机械有限公司| 江苏梅花机械有限公司| 东莞市台旺机械有限公司| 上海凯机械有限公司| 临沂大阳通用机械有限公司| 江苏千里机械有限公司| 安阳钢铁贸易有限公司| 潍坊元鸣机械有限公司| 唐山机械设备有限公司| 广州市包装机械有限公司| 创宝包装机械有限公司| 上海科熙起重设备有限公司 | 青岛精密机械有限公司| 江苏泰美环保机械有限公司| 山东兴田机械有限公司| 宁波液压机械有限公司| 常州市豪乐机械有限公司| 淄博翔鹏机械有限公司| 济宁机械制造有限公司| 富杰精密机械有限公司| 武汉创联机械有限公司| 济宁青科机械有限公司| 东莞市宝腾机械有限公司| 陕西重型机械制造有限公司 | 金凯达机械有限公司| 辽宁机械制造有限公司| 安阳永兴钢铁有限公司| 江阴惠尔信机械有限公司| 中航国际钢铁贸易有限公司| 湖州二轻机械有限公司| 安徽中晨机械有限公司| 山东莱州机械有限公司| 徐州明文机械有限公司| 东莞市金联吹塑机械有限公司 | 山西重工机械有限公司| 沈阳冶金机械有限公司| 全氏食品机械(上海)有限公司| 昆山 机械有限公司| 山东华屹重工有限公司| 青岛晟森机械有限公司| 上海高德机械有限公司| 山西太行钢铁有限公司| 老挝第一钢铁有限公司| 重庆旺田机械有限公司| 南阳 机械制造有限公司| 湖州核汇机械有限公司| 东莞钰兴机械有限公司| 养殖有限公司起名大全| 湖南天雁机械责任有限公司| 重工机械制造有限公司| 南京精密机械有限公司| 河南重工机械有限公司| 桐乡 机械有限公司| 中海福陆重工有限公司| 杭州一鼎传动机械有限公司| 浙江临海机械有限公司| 淮安液压机械有限公司| 聚力特机械有限公司| 沈阳水泥机械有限公司| 山推抚起机械有限公司| 温州镇田机械有限公司| 浙江科鑫重工有限公司| 金旺机械设备有限公司| 孝感金达钢铁有限公司| 中山市 机械有限公司| 苏州盈合机械有限公司| 东莞鸿铭机械有限公司| 江苏舜工机械有限公司| 沈阳沈飞航宇机械制造有限公司| 南通贝思特机械工程有限公司| 东莞市嘉鲁特注塑机械有限公司| 济南龙安机械有限公司| 潍坊川泰机械有限公司| 北京骏马机械有限公司| 菏泽瑞康机械有限公司| 河北机械设备有限公司| 南通中远重工有限公司| 江阴市科盛机械有限公司| 绍兴金江机械有限公司| 洛阳重工机械有限公司| 南京机械电子有限公司| 嘉兴 机械有限公司| 汕头市伟力塑料机械厂有限公司| 苏州奥天诚机械有限公司| 山东山鼎工程机械有限公司| 苏州鸿安机械有限公司| 常州市工程机械有限公司| 机械生产制造有限公司| 浙江麒龙起重机械有限公司| 无锡裕达机械有限公司| 浙江志高机械有限公司| 莆田 机械有限公司| 天津千百顺钢铁贸易有限公司| 青岛日佳机械有限公司| 临沂盛德机械有限公司| 东方机械制造有限公司| 杭州丰波机械有限公司| 常德三一机械有限公司| 上海 乐 机械有限公司| 苏州艾卓精密机械有限公司| 抚顺石油机械有限公司| 烟台金鹏矿业机械有限公司| 自动化机械 上海有限公司| 湖南一田农业机械有限公司| 南京凯驰机械有限公司| 浙江欣炜机械有限公司| 江苏冠宇机械设备制造有限公司| 山东科恳机械制造有限公司| 德阳川广机械有限公司| 锦机械设备有限公司| 重庆川凯机械有限公司| 国机重工洛阳有限公司| 食品机械设备有限公司| 浙江四和机械有限公司| 沈阳 机械制造有限公司| 山东欧劲工程机械有限公司| 上海 鑫机械设备有限公司| 重庆维庆液压机械有限公司| 浙江欣炜机械有限公司| 山东瑞华机械有限公司| 天津宏大纺织机械有限公司| 焦作巨航粮油机械有限公司| 湖北襄玉机械有限公司| 东莞 机械有限公司| 泰安正阳机械有限公司| 济宁恒远机械有限公司| 西安金力特机械设备有限公司 | 济南大鹏机械设备有限公司| 北京起重设备有限公司| 宁波盛技机械有限公司| 成都欧曼机械有限公司| 安徽建筑机械有限公司| 上海傣纬机械设备有限公司| 卡麦龙机械有限公司| 无锡工源机械有限公司| 天津起重设备有限公司| 江苏力源液压机械有限公司| 江阴兴澄特种钢铁有限公司地址| 陕西重型机械制造有限公司 | 佛山市康思达液压机械有限公司| 济南森华精密机械有限公司| 鑫成机械设备有限公司| 机械设备有限公司官网| 广州惠德机械有限公司| 郑州亚美机械制造有限公司| 济南 机械设备有限公司| 南京恒昌包装机械有限公司| 合肥至信机械有限公司| 机械有限公司 招聘| 安徽机械制造有限公司| 青岛佳友包装机械有限公司| 上海西马特机械制造有限公司 | 东莞市包装机械有限公司| 安徽博行机械有限公司| 台山市机械厂有限公司| 佛山市海裕机械有限公司| 西安星火包装机械有限公司| 特斯克机械有限公司| 天津包装机械有限公司| 浙江顶峰机械有限公司| 四川宏华友信石油机械有限公司 | 机械设备有限公司官网| 安特精密机械有限公司| 晋城福盛钢铁有限公司| 莱州三和机械有限公司| 昆山锦沪机械有限公司| 重庆驰骋机械有限公司| 广州大圆机械设备有限公司| 合肥至信机械有限公司| 溧阳布勒机械有限公司| 无锡布勒机械制造有限公司招聘| 纸箱机械 有限公司| 安徽好运机械有限公司| 沈阳顺达重矿机械制造有限公司 | 南京恩梯恩精密机械有限公司| 常州工程机械有限公司| 机械有限公司 张家港| 宁波液压机械有限公司| 合肥工程机械有限公司| 河南奥创机械设备有限公司| 东莞市鼎祥通用机械设备有限公司| 深圳起点云有限公司| 苏州博扬机械有限公司| 宁波中能连通机械有限公司| 玻璃设备机械有限公司| 宁波佳利来机械制造有限公司| 安瑞科气体机械有限公司| 盐山宏润重工有限公司| 广东力丰机械制造有限公司 | 哈尔滨 机械 有限公司| 苏州市江南石化机械有限公司| 张家港重工有限公司| 昌乐 机械 有限公司| 重庆精密机械有限公司| 成都液压机械有限公司| 重庆江增船舶重工有限公司| 泰钢钢铁贸易有限公司| 盐山宏润重工有限公司| 上海东泷重型机械有限公司| 江苏迈安德食品机械有限公司| 苏州德派机械有限公司| 力顺源机械有限公司| 开封茂盛机械有限公司| 江苏盐城机械有限公司| 山东浩信机械有限公司| 深圳恒盛力包装机械有限公司| 沂南中天机械有限公司| 徐州明文机械有限公司| 和和机械(张家港)有限公司| 藏不起服饰有限公司| 西安亿起来贸易有限公司| 温州贝诺机械有限公司| 澳太机械制造有限公司| 山东省机械施工有限公司| 湖南天拓重工有限公司| 德蒙压缩机械有限公司| 中山机械设备有限公司| 广东 钢铁 有限公司| 矿山机械设备有限公司| 珠海市机械设备有限公司| 河北中伟机械有限公司| 大连军峰机械有限公司| 常州机械设备有限公司| 徐州荣阳钢铁有限公司| 兴澄特种钢铁有限公司| 常州市菲德机械部件有限公司| 山东首钢钢铁贸易有限公司| 鑫盛机械制造有限公司| 亚泰重工机械有限公司| 华盛机械制造有限公司| 浙江宏华机械塑胶有限公司 | 江苏苏东机械有限公司| 科倍隆南京机械有限公司| 江阴凯迈机械有限公司| 如东通用机械有限公司| 邯郸包装机械有限公司| 江阴江达机械装备有限公司 | 山西翔天钢铁有限公司| 江苏汉鼎机械有限公司| 东莞市佐臣自动化机械有限公司 | 河北德欧机械有限公司| 上海永德食品机械有限公司| 常州玫尔机械有限公司| 华瑞丰机械有限公司| 瑞安市天晟包装机械有限公司 | 江阴起重机械有限公司| 郑州新水工机械有限公司| 东莞市腾机械有限公司| 重庆文安机械有限公司| 上海昱钢包装机械有限公司 | 徐州博丰钢铁有限公司| 昆山市贝纳特机械设备有限公司 | 四川诚德机械有限公司| 南京贝隆齐机械有限公司| 广东正力精密机械有限公司| 广州东昻机械有限公司| 临沂机械设备有限公司| 河南一重起重机有限公司| 青州矿砂机械有限公司| 苏州德伊捷自动化机械有限公司| 湖州市湖州机械有限公司| 佛山市信虹精密机械有限公司| 无锡双象橡塑机械有限公司| 浙江兄弟包装机械有限公司| 诚辉机械制造有限公司| 旭海机械设备有限公司| 济南金胜星机械设备有限公司 | 上海长空机械有限公司| 东莞市东永源机械有限公司| 江阴精力机械有限公司| 佛山顺德区机械有限公司| 杭州永创机械有限公司| 长沙建鑫机械有限公司| 四川开拓建筑机械租赁有限公司| 远大机械制造有限公司| 济宁萨奥机械有限公司| 徐州徐工随车起重机有限公司| 派菲奥机械有限公司| 佛山市液压机械有限公司| 广州西力机械有限公司| 洛阳中冶重工机械有限公司| 珠海康信精密机械有限公司| 河北工程机械有限公司| 佛山机械设备有限公司| 昆山来运机械设备有限公司 | 河南泰兴粮油机械设备有限公司| 上海升立机械制造有限公司| 江苏甲钢钢铁有限公司| 佛山市创宝包装机械有限公司| 山东机械设备有限公司怎么样| 成都大华路面机械有限公司| 浙江建达机械有限公司| 佛山市奥索包装机械有限公司| 机械有限公司 机械手| 上海龙工机械有限公司| 抚顺新钢铁有限公司| 江苏双友重型机械有限公司| 昆山工业机械有限公司| 机械设备出口有限公司| 三菱重工空调有限公司| 连云港亚新钢铁有限公司| 苏州柯瑞机械有限公司| 安阳钢铁贸易有限公司| 四川建筑机械有限公司| 上海隆康机械设备有限公司| 山东瑞华机械有限公司| 河南大方起重机有限公司| 上海众德机械有限公司| 鑫磊机械制造有限公司| 上海帆铭机械有限公司| 青岛义龙包装机械有限公司| 广东科杰机械自动化有限公司 | 浙江勇力机械有限公司| 山东起重机有限公司| 无锡腾力机械有限公司| 南牧机械设备有限公司| 包装机械制造有限公司| 杭州机械设备制造有限公司| 镇江机械制造有限公司| 威士重工机械有限公司| 北京盛美食品机械有限公司| 盐城联鑫钢铁有限公司| 摩德娜机械有限公司| 沃得农业机械有限公司| 深圳市康铖机械设备有限公司| 浙江鼎业机械设备有限公司| 龙腾机械制造有限公司| 山东闽源钢铁有限公司| 江阴市礼联机械有限公司| 新乡市欧霖佳机械有限公司| 天烨机械工程有限公司| 杭重工程机械有限公司| 宝钢湛江钢铁有限公司| 上海安展机械设备有限公司| 汉智数控机械有限公司| 上海造纸机械有限公司| 柳州商泰机械有限公司| 江苏韩通船舶重工有限公司| 大连 机械有限公司| 台州宏汇机械有限公司| 上海博强机械有限公司| 深圳市塑胶机械有限公司| 昆山日日先精密机械有限公司| 芜湖富鑫钢铁有限公司| 浙江山海机械有限公司| 武汉包装机械有限公司| 南通路捷机械有限公司| 上海捷赛机械有限公司| 永兴机械设备有限公司| 山东精诺机械有限公司| 山东山建机械有限公司| 广西玉柴动力机械有限公司| 济南弘川包装机械有限公司| 广州通泽机械有限公司| 河南泰兴粮油机械设备有限公司 | 勃农兴达机械有限公司| 上海沁艾机械设备有限公司| 杭州诺迈机械有限公司| 登福机械(上海)有限公司| 南京元盛机械设备有限公司| 东莞元渝机械有限公司| 山东大丰机械有限公司| 天津机械制造有限公司| 南昌矿山机械有限公司| 广州市通风机械设备有限公司| 河南省机械有限公司| 南京三友机械有限公司| 山东六丰机械工业有限公司| 齐齐哈尔机械有限公司| 河北展利机械有限公司| 三益精密机械有限公司| 广州 机械有限公司| 曲阜润丰机械有限公司| 机械配件苏州有限公司| 无锡邦得机械有限公司| 上海轩世机械有限公司| 三明 机械有限公司| 上海雄风起重设备厂有限公司| 山东港中钢铁有限公司| 沈阳祺盛机械有限公司| 哈尔滨工程机械有限公司| 艾珍机械设备制造有限公司| 大连卓远重工有限公司| 山推工程机械有限公司| 莱州行星机械有限公司| 新乡市欧霖佳机械有限公司| 青岛希世可机械有限公司| 东莞胜通机械有限公司| 秦皇岛秦冶重工有限公司| 深圳市铭利达精密机械有限公司| 河北清大环保机械有限公司| 四川开拓建筑机械租赁有限公司| 盐城中热机械有限公司| 汽车销售有限公司起名| 肇庆市机械有限公司| 宁波博纳机械有限公司| 宝力机械有限公司招聘| 新源重工机械有限公司| 新乡市利尔机械有限公司| 高博起重设备有限公司| 阜新恒泰机械有限公司| 温州天马食品包装机械制造有限公司| 苏州同大机械有限公司| 温州惠利机械有限公司| 河南江河机械有限公司| 美心翼申机械有限公司| 上海诺 机械有限公司| 浙江双联机械有限公司| 宁波塑料机械有限公司| 玛连尼 法亚机械有限公司| 龙口旭鑫机械有限公司| 常州华机械有限公司| 机械进出口有限公司招聘| 杭州贝克机械有限公司| 广州普耐柯数控机械有限公司| 佛山市南海鼎工包装机械有限公司| 苏州升降机械有限公司| 苏州博机械有限公司| 江苏环保机械有限公司| 曲阜机械制造有限公司| 济宁萨奥机械有限公司| 新乡市东振机械制造有限公司| 江苏红旗印染机械有限公司| 天津天丰钢铁有限公司| 裕民机械工业有限公司| 大连连美机械有限公司| 金纬机械溧阳有限公司| 杭州联德机械有限公司| 青岛春风机械有限公司| 业精机械制造有限公司| 浙江仁工机械有限公司| 三菱重工上海有限公司| 邢台凌远机械制造有限公司| 河南矿山起重机有限公司销售电话| 佛山市松川包装机械有限公司| 常州斯太尔动力机械有限公司 | 动机械设备有限公司| 济南 升降机械有限公司| 宁波必沃纺织机械有限公司| 东莞市三米通用机械有限公司| 山东润通机械制造有限公司| 上海嘉倍德塑胶机械有限公司 | 苏州机械设备有限公司| 柳州欧维姆机械有限公司| 聊城 机械有限公司| 山东骏腾起重设备有限公司| 上海上丰机械有限公司| 杭州力士机械有限公司| 勤堡精密机械有限公司| 陕西鑫辉钢铁有限公司| 太原重工轨道交通设备有限公司 | 青岛力克川液压机械有限公司| 湛江市机械有限公司| 河南泰兴粮油机械设备有限公司| 川崎精密机械苏州有限公司| 台州瑞达机械有限公司| 液压机械制造有限公司| 沈阳沈飞航宇机械制造有限公司| 东莞市新望包装机械有限公司| 上海涟恒精密机械有限公司| 机械设计 有限公司| 淄博晟峰机械有限公司| 苏州杰威尔精密机械有限公司 | 东莞宏彰机械有限公司| 唐山盛财钢铁有限公司| 郑州机械制造有限公司| 江苏苏东化工机械有限公司| 成都万欣邦达机械制造有限公司| 临沂美联重工有限公司| 中山机械设备有限公司| 江苏宏博机械制造有限公司| 武汉钢铁有限公司官网| 浙江顺得机械有限公司| 南京创力传动机械有限公司| 沈阳小松工程机械有限公司| 苏州勤堡精密机械有限公司 | 山东萨丁重工有限公司| 广州市力净洗涤机械有限公司| 海狮洗涤机械有限公司| 东莞市鑫国丰机械有限公司 | 江西晟浔机械有限公司| 江苏韩通船舶重工有限公司| 环球工业机械有限公司| 宁波市北仑机械制造有限公司| 深圳市创能机械有限公司| 青岛洪珠农业机械有限公司| 曲阜广鑫机械有限公司| 江阴市药化机械有限公司| 常州倍安特动力机械有限公司| 福州机械制造有限公司| 广州科光机械有限公司| 机械自动化有限公司| 渤海重工管道有限公司| 东莞市途锐机械有限公司| 江苏红旗印染机械有限公司| 大连地拓重工有限公司怎么样| 河南千里机械有限公司| 浙江双畅起重机械有限公司| 深圳市环球同创机械有限公司| 秦皇岛秦冶重工有限公司| 东莞市泽源机械有限公司| 浙江网路崛起有限公司| 青岛迪凯机械设备有限公司| 邢台振成机械有限公司| 无锡市锡恒机械有限公司| 安溪永兴机械有限公司| 深圳市鑫宏伟机械设备有限公司| 昆明机械设备有限公司| 山东浩信机械有限公司| 上海乾承机械设备有限公司| 江阴兴澄特种钢铁有限公司地址| 河南昌申钢铁有限公司| 长沙中南福鼎机械设备有限公司| 机械设备工程有限公司| 南阳机械制造有限公司| 武汉泛洲机械制造有限公司| 郑州长城机械有限公司| 北仑旭升机械有限公司| 深圳市精密机械有限公司| 宁波佳尔灵气动机械有限公司 | 苏州亿泛精密机械有限公司| 海南建设工程机械施工有限公司| 禹城市华普机械设备有限公司| 上海冠龙机械有限公司| 江苏江成机械有限公司| 浙江风驰机械有限公司| 苏州精锐精密机械有限公司| 江阴西城钢铁有限公司| 广州卓远机械有限公司| 徐州永欣重工有限公司| 上海小虎机械有限公司| 嘉泰数控机械有限公司| 浙江建机起重机械有限公司| 杭州双林机械有限公司| 安徽佶龙机械有限公司| 湖南中联陶瓷机械有限公司| 上海宝锻机械制造有限公司| 南京重霸起重设备有限公司| 青岛华雷重工设备有限公司| 广东海天机械有限公司| 昆山乙盛机械工业有限公司电话| 安丘机械制造有限公司| 襄阳亚舟重型工程机械有限公司 | 上海舒平精工机械有限公司| 新麦机械有限公司官网| 天津市仁翼钢铁有限公司| 青岛银象机械有限公司| 安徽唐兴机械装备有限公司| 湖北天和机械有限公司| 浙江名博机械有限公司| 动力机械制造有限公司| 宜春江特机械传动有限公司| 辽宁中原机械有限公司| 台州万洲机械有限公司| 苏州首达机械有限公司| 乙盛机械工业有限公司| 镇江机械制造有限公司| 安丰钢铁有限公司地址| 江苏苏东机械有限公司| 宣城 机械 有限公司| 天工机械制造有限公司| 武义海拓机械有限公司| 张家港市亿利机械有限公司 | 扬州精辉试验机械有限公司 | 江苏贸隆机械制造有限公司| 俊杰机械深圳有限公司| 杭州贝克机械有限公司| 廊坊 包装机械有限公司| 张家港市港达机械有限公司| 上海善佳机械设备有限公司 | 盐城万富隆机械制造有限公司 | 新科起重机有限公司| 沃洲机械制造有限公司| 豪利机械苏州有限公司| 昆明机械制造有限公司| 苏州鼎木机械设备有限公司| 浙江 料机械有限公司| 工程有限公司起名大全| 太仓机械设备有限公司| 安徽联塔盛通机械制造有限公司| 山东瑞浩重型机械有限公司| 常州铁本钢铁有限公司| 沈阳重工机械有限公司| 山东愚公工程机械有限公司| 青岛金福鑫塑料机械有限公司| 尤工机械设备有限公司| 扬州恒佳机械有限公司| 江苏永康机械有限公司| 深圳起点云有限公司| 青岛青工机械有限公司| 大连液力机械有限公司| 苏州雁达机械有限公司| 广东省重工建筑设计院有限公司| 温州中环机械设备有限公司| 曲阜润丰机械有限公司| 无锡东晨机械有限公司| 山东瑞华工程机械有限公司| 广西玉柴重工有限公司| 江苏腾通包装机械有限公司| 锋机械设备有限公司| 苏州工业园区嘉宝精密机械有限公司| 温岭永进机械有限公司| 海精密机械有限公司| 永红铸造机械有限公司| 扬州精密机械有限公司| 广东长征机械有限公司| 扬州市天发试验机械有限公司 | 中核华兴达丰工程机械有限公司| 日照瑞荣机械有限公司| 郑州龙阳重型机械设备有限公司 | 徐州徐工施维英机械有限公司 | 大同机械 有限公司| 济南大鹏机械设备有限公司| 湖北粮食机械有限公司| 珠海飞马传动机械有限公司| 苏州洁宝机械有限公司| 汕头 机械有限公司招聘| 保东农业机械有限公司| 河南龙工机械制造有限公司| 北默压缩机械有限公司| 辽宁天亿机械有限公司| 浙江仁工机械有限公司| 江阴力达机械有限公司| 常州市禾昌机械有限公司| 成都液压机械有限公司| 江苏同力机械有限公司| 新乡天丰机械有限公司| 郑州双狮粮油机械有限公司| 福建 机械有限公司| 杭州起重机械有限公司| 河南机械设备有限公司| 宝鸡万工机械制造有限公司| 东莞 机械有限公司| 北京中车重工机械有限公司| 重庆海松机械有限公司| 新乡市豫新起重机械有限公司 | 沈阳世润重工有限公司| 江苏联顺机械有限公司| 东莞市浈颖机械设备有限公司| 中核华兴机械化工程有限公司| 太仓越华精密机械配件有限公司| 五洋纺织机械有限公司| 佛山机械制造有限公司| 沁阳宏达钢铁有限公司| 山东运泰机械有限公司| 金鹰重型工程机械有限公司| 河南省中原起重机械有限公司 | 天津钢管钢铁贸易有限公司| 常州市禾昌机械有限公司| 玉环县机械有限公司| 浙江鸿森机械有限公司| 河北荣信钢铁有限公司| 宁波星峰机械有限公司| 宁波北仑机械有限公司| 青岛鳌福机械有限公司| 宁波甬龙机械有限公司| 苏州宏呈祥机械有限公司| 日照立盈机械有限公司| 上海宁金钢铁有限公司| 柳州高华机械有限公司| 杭州引春机械有限公司| 烟台市石油机械有限公司| 无锡南机械有限公司| 威海 机械有限公司| 广州工程机械有限公司| 温州 轻工机械有限公司| 海宁市腾达机械有限公司| 浙江希望机械有限公司| 重庆志成机械有限公司| 江苏大津重工有限公司| 上海铮潼起重机电设备有限公司 | 昆山 环保机械有限公司| 青岛中华宇塑料机械有限公司| 天阳机械制造有限公司| 杭州星宏机械有限公司| 青岛中华宇塑料机械有限公司| 卓郎纺织机械有限公司| 中山市凌宇机械有限公司| 徐工建机机械有限公司| 武汉环卫机械有限公司| 东莞市泽源机械有限公司| 山推重工机械有限公司| 福州 机械制造有限公司| 玉环县三和机械制造有限公司 | 广西柳工机械有限公司| 农友机械设备有限公司| 杭州丰波机械有限公司| 浙江迅定钢铁有限公司| 诚辉机械制造有限公司| 天津华信机械有限公司| 河南豫工机械有限公司| 哈尔滨机械制造有限公司| 常州纺织机械有限公司| 山东鲁成起重机械有限公司 | 山东鲁成起重机械有限公司| 山东逸通机械有限公司| 山东华伟重工机械有限公司| 河南茂盛机械制造有限公司| 厦门大禾机械有限公司| 机械配件苏州有限公司| 重庆川凯机械有限公司| 唐山机械设备有限公司| 重庆有限公司 机械| 佛山创宝包装机械有限公司 | 陕西 机械有限公司怎么样| 余姚 机械 有限公司| 山东卡特重工有限公司| 山东起重设备有限公司| 上海阿泰瑞克重工有限公司| 广东力丰机械制造有限公司 | 北京机械制造有限公司| 肥城云宇机械有限公司| 上海一达机械有限公司| 佛山市炬盈包装机械有限公司| 上海定盛机械有限公司| 江阴市礼联机械有限公司| 昆山翔固机械有限公司| 东莞包装机械有限公司| 无锡市机械有限公司| 宁波昌扬机械工业有限公司| 温州市凯驰包装机械有限公司| 惠州市机械有限公司| 临沂金立机械有限公司| 南京佳盛机械设备有限公司| 旭能机械制造有限公司| 济南四通机械有限公司| 秦皇岛国阳钢铁有限公司| 宏鑫机械设备有限公司| 浙江起步儿童用品有限公司| 宁波精密机械有限公司| 泉州机械设备有限公司| 海华机械制造有限公司| 泉州工程机械有限公司| 河北敬业钢铁有限公司地址| 瑞特精密机械有限公司| 上海东芝机械有限公司| 寿光 机械有限公司| 河南龙工机械制造有限公司| 上海成套机械有限公司| 宁波兴波机械有限公司| 山东神力起重机械有限公司 | 宁波塑料机械有限公司| 铁建重工包头有限公司| 山东润通机械制造有限公司| 四川凌峰航空液压机械有限公司| 宁波华骏机械有限公司| 曼透平机械有限公司| 新乡市威远机械有限公司| 信息工程有限公司起名| 东莞塑胶机械有限公司| 山东泰瑞汽车机械电器有限公司| 咸阳机械制造有限公司| 东莞市固达机械制造有限公司 | 常熟神马机械有限公司| 北京余特包装机械有限公司| 宁波威恩精密机械有限公司| 苏州德扬数控机械有限公司| 宁波市鸿博机械制造有限公司| 厦门厦工机械有限公司| 东莞市三米通用机械有限公司 | 重庆驰骋机械有限公司| 重庆文安机械有限公司| 青岛鲁耕农业机械有限公司| 昆山乙盛机械工业有限公司电话| 威海盛世机械有限公司| 宣城市 机械 有限公司| 无锡万华机械有限公司| 洛阳起重机厂有限公司| 青岛三益塑料机械有限公司 | 宁波利豪机械有限公司| 济宁金牛重工有限公司| 威海化工机械有限公司招聘| 河南鼎科机械有限公司| 北京盛美食品机械有限公司| 台州市鲨鱼食品机械有限公司| 江阴新迪机械有限公司| 申耀机械工业有限公司| 苏州拓博机械有限公司| 广州新成机械技术有限公司 | 济南真诺机械有限公司| 爱科农业机械有限公司| 上海塑胶机械有限公司| 翼虎动力机械有限公司| 上海西马特机械制造有限公司| 中科包装机械有限公司| 青岛工程机械有限公司| 禹州市机械有限公司| 青岛科泰重工机械有限公司| 深圳市美鹏机械设备有限公司| 粤北联合钢铁有限公司| 天赛塑胶机械有限公司| 青州市晨光机械有限公司| 威马农业机械有限公司| 上海起重运输机械厂有限公司| 杭州驰耐传动机械有限公司| 江阴派格机械设备有限公司| 佛山市宝陶机械设备有限公司 | 宝鸡市机械有限公司| 太平洋机械有限公司| 上海磊友成套机械设备有限公司 | 力士德机械有限公司| 州东方机械有限公司| 机械有限公司 招聘| 无锡真木机械有限公司| 重庆比德机械有限公司| 宁波 机械有限公司| 长沙众宇机械有限公司| 德瑞机械设备有限公司| 东莞名震机械制造有限公司| 东莞通盛机械有限公司| 东莞市机械有限公司| 唐山丰润区钢铁有限公司| 湖北日朗机械制造有限公司| 上海紫永机械有限公司| 东营市机械有限公司| 广东食品机械有限公司| 孝感金达钢铁有限公司| 佛山建邦机械有限公司| 金属制品有限公司起名| 兰州 机械 有限公司| 上海久浩机械有限公司| 张家港海狮洗涤机械有限公司| 江苏液压机械有限公司| 富伟精密机械有限公司| 博凯机械上海有限公司| 上海力净洗涤机械制造有限公司| 莱州华汽机械有限公司| 集瑞联合重工有限公司| 安宁市永昌钢铁有限公司| 广东力特工程机械有限公司| 上海捷如重工机电设备有限公司 | 上海盟申机械设备有限公司| 江苏雨花钢铁有限公司| 佛山精密机械有限公司| 温岭市大众精密机械有限公司| 东莞市全永机械制造有限公司| 广州惠德机械有限公司| 上海德机械设备有限公司| 上海展仕机械设备有限公司| 张家港重工有限公司| 浙江自力机械有限公司| 顺德富华工程机械制造有限公司| 广东穗华机械设备有限公司| 咸阳联合机械有限公司| 天津润机械有限公司| 苏州孚杰机械有限公司| 江苏双箭输送机械有限公司| 温州机械制造有限公司| 苏州市丰科精密机械有限公司| 浙江传动机械有限公司| 杭州方圆塑料机械有限公司| 浙江中兴机械制造有限公司| 佛山市松川机械设备有限公司| 唐山文丰钢铁有限公司| 成都欧曼机械有限公司| 朗威电子机械有限公司| 台州通宇变速机械有限公司| 昆山 精密机械有限公司| 天宇机械制造有限公司| 天津云飞机械有限公司| 临海市机械有限公司| 山东通佳机械有限公司| 温州正信机械有限公司| 粤北联合钢铁有限公司| 工程的机械设备有限公司| 河北燕兴机械有限公司| 常州凯发动力机械有限公司| 东莞市数控机械有限公司| 东莞启益电器机械有限公司| 上海陆达包装机械制造有限公司| 北京欧力源机械有限公司| 广西徐重机械有限公司| 扬州华粮机械有限公司| 浙江金华机械有限公司| 浙江君鸿机械有限公司| 台州瑞进机械有限公司| 湖北江汉重工有限公司| 苏州君驰联动机械有限公司 | 宁波人和机械轴承有限公司| 江阴市华科机械设备有限公司 | 江苏机械制造有限公司| 山西建龙钢铁有限公司| 北京机械制造有限公司| 无锡力马化工机械有限公司| 佛山机械设备有限公司| 天津 津工机械有限公司| 夹江水工机械有限公司| 章丘大成机械有限公司| 浙江华业塑料机械有限公司| 宁波友杰机械有限公司| 东莞鸿铭机械有限公司|