當(dāng)使用sql語句進(jìn)行查詢時(shí),查詢的結(jié)果是存放在一個(gè)后綴名為tmp的一個(gè)臨時(shí)文件中。當(dāng)查詢的時(shí)候,該文件存放查詢的結(jié)果,當(dāng)關(guān)閉該查詢的時(shí)候,該臨時(shí)文件會自動刪除,所以在我們進(jìn)行查詢的時(shí)候,是感覺不到該文件的存在。
一、tmp文件存在于什么地方
對于windows系統(tǒng),都有一個(gè)系統(tǒng)環(huán)境變量,這個(gè)變量可以通過
右擊我的電腦——屬性——高級——環(huán)境變量可以查看。
Tmp臨時(shí)文件就存在于temp文件夾下面。
二、tmp文件的格式
對于tmp文件,里面存放的查詢結(jié)果,那么對于查詢結(jié)果在tmp文件中的存儲是按照
一定格式來進(jìn)行存儲的,存儲的格式為:
對于每一列,分成兩部分:
第一部分:標(biāo)示該列的長度,當(dāng)字符的長度大于255時(shí),使用5個(gè)字節(jié)來存放。
第二部分:該列的數(shù)據(jù)。對于字符型數(shù)據(jù),是轉(zhuǎn)化為uniocode來進(jìn)行存儲的。
select 1,cast(1 as bigint),'ab',getdate() 查詢生成的tmp文件為(16進(jìn)制) 04 01 00 00 00 08 01 00 00 00 00 00 00 00 04 61 00 62 00 08 60 73 c2 02 7a 7b cb 08 其中04 01 00 00 00為第一個(gè)1 08 01 00 00 00 00 00 00 00為第二個(gè)bigint類型的1 04 61 00 62 00 為’ab’ 08 60 73 c2 02 7a 7b cb 08 為getdate() |
例如:對于這樣一張表:
使用select * from tb 形成的tmp文件格式為:
id列的數(shù)據(jù)長度 | id列的數(shù)據(jù) | dtcol列的數(shù)據(jù)長度 | dtcol列的數(shù)據(jù) | charcol的數(shù)據(jù)長度 | charcol的數(shù)據(jù) | maxcol列的數(shù)據(jù)長度 | maxcol的數(shù)據(jù) |
其中charcol與maxcol都是轉(zhuǎn)換為unicode來進(jìn)行存儲的。
對于tmp文件的查看,可以通過記事本來查看,但是只能看到字符,對于數(shù)字、日期看到的是亂碼,可以使用UE來查看tmp文件的二進(jìn)制數(shù)據(jù)。
三、向該表中插入100W數(shù)據(jù)
declare @i int @dt datetime select @i=0,@dt=' while @i<1000000 begin insert into testdata(dtcol,charcol,maxcol) values(@dt+@i,replicate(char(rand()*26+65),100),replicate(newid(),100)) set @i=@i+1 end |
四、tmp文件對查詢的影響
在知道了tmp文件的格式之后,那么對于tmp文件的大小一般是能估算出來的,以上
述表為例,一行在tmp文件中的大小為:1+8+1+8+1+200+5+7200=7424B,100W的數(shù)據(jù)大約是7424*100WB,tmp文件的大小為7,250,000KB左右。
1、當(dāng)表中的數(shù)據(jù)比較多的話,尤其是字符類型的數(shù)據(jù)占多數(shù)的時(shí)候,就需要注意這個(gè)tmp文件了。如果temp文件夾所在的磁盤空間不富裕的話,那么tmp會占用剩余的磁盤空間,還不夠的話,那么系統(tǒng)會提示空間不夠,并且會終止本次查詢。
2、temp文件夾所在的磁盤的磁盤格式最好為NTFS,因?yàn)镕AT32格式最大的文件大小為4G,當(dāng)tmp文件的大小超過4G時(shí),那么是不會產(chǎn)生新的tmp文件的,那么系統(tǒng)也會提示空間不夠,并且終止本次查詢。(空間不夠未必是磁盤空間不夠,而是因?yàn)閠mp文件已經(jīng)達(dá)到最大容量4G)
綜上所述:temp文件夾應(yīng)該放在磁盤空間充足的,并且分區(qū)格式為ntfs格式的分區(qū)上。