重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
sql sever中照片用image數據類型。
目前創新互聯已為上千家的企業提供了網站建設、域名、雅安服務器托管、網站托管、企業網站設計、鹽邊網站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協力一起成長,共同發展。
sql sever數據庫中的Image數據類型可以進行數據圖片的存儲。保存的是二進制字節,所以寫入sql sever數據庫Image數據類型時,sql sever數據庫自動將圖片轉換成二進制字節后存入。讀取的時候,將二進制再轉換成圖片從sql sever數據庫中輸出顯示到頁面或者程序中。
擴展資料:
如果SQL Server是缺省安裝時, IMAGE類型字段是有長度限制,用來存儲圖片大小不超過2g的圖片。缺點是占用了很大的數據存儲空間。但是對于之前的存儲物理路徑來說讀取圖片和存儲圖片方便了很多。
一般開發中,照片等二進制的文件并不保存在數據庫中。而是保存在服務器的特定目錄中,然后在數據庫中記錄一下這個具體路徑和文件名。
毫無疑問,給表添加索引是有好處的,你要做的大部分工作就是維護索引,在數據更改期間索引可能產生碎片,所以一些維護是必要的。碎片可能是你查詢產生性能問題的來源。
那么到底什么是索引碎片呢?索引碎片實際上有2種形式:外部碎片和內部碎片。不管哪種碎片基本上都會影響索引內頁的使用。這也許是因為頁的邏輯順序錯誤(即外部碎片)或每頁存儲的數據量少于數據頁的容量(內部錯誤)。無論索引產生了哪種類型的碎片,你都會因為它而面臨查詢的性能問題。
外部碎片
當 索引頁不在邏輯順序上時就會產生外部碎片。索引創建時,索引鍵按照邏輯順序放在一組索引頁上。當新數據插入索引時,新的鍵可能放在存在的鍵之間。為了讓新 的鍵按照正確的順序插入,可能會創建新的索引頁來存儲需要移動的那些存在的鍵。這些新的索引頁通常物理上不會和那些被移動的鍵原來所在的頁相鄰。創建新頁 的過程會引起索引頁偏離邏輯順序。
下面的例子將比實際的言論更加清晰的解釋這個概念。
假定在任何另外的數據插入你的表之前存在索引上的結構如下
(注:下面圖片里應該是7和8,原文里是6和8):
INSERT語句往索引里添加新的數據,假定添加的是5。INSERT將引起新頁創建,為了給5在原來的頁上留出空間,7和8被移到了新頁上。這個創建將引起索引頁偏離邏輯順序。
在有特定搜索或者返回無序結果集的查詢的情況下,偏離順序的索引頁不會引起問題。對于返回有序結果集的查詢,搜索那些無序的索引頁需要進行額外的處理。有序結果集的例子如查詢返回4到10之間的記錄。為了返回7和8,查詢不得不進行額外的頁切換。雖然一個額外的頁切換在一個長時間運行里是無關緊要的,然而想象一下一個有好幾百頁偏離順序的非常大的表的情形。
內部碎片
當索引頁沒有用到最大量時就產生了內部碎片。雖然在一個有頻繁數據插入的應用程序里這也許有幫助,然而設置一個fill factor(填充因子)會在索引頁上留下空間,服務器內部碎片會導致索引尺寸增加,從而在返回需要的數據時要執行額外的讀操作。這些額外的讀操作會降低查詢的性能。
怎樣確定索引是否有碎片?
SQLServer提供了一個數據庫命令――DBCC SHOWCONTIG――來確定一個指定的表或索引是否有碎片。
DBCC SHOWCONTIG
數據庫平臺命令,用來顯示指定的表的數據和索引的碎片信息。
DBCC SHOWCONTIG 權限默認授予 sysadmin固定服務器角色或 db_owner 和 db_ddladmin固定數據庫角色的成員以及表的所有者且不可轉讓。
語法(SQLServer2000)
DBCC SHOWCONTIG
[ ( { table_name | table_id| view_name | view_id }
[ , index_name | index_id ]
)
]
[ WITH { ALL_INDEXES
| FAST [ , ALL_INDEXES ]
| TABLERESULTS [ , { ALL_INDEXES } ]
[ , { FAST | ALL_LEVELS } ]
}
]
語法(SQLServer7.0)
DBCC SHOWCONTIG
[ ( table_id [,index_id ]
)
]
示例:
顯示數據庫里所有索引的碎片信息
SET NOCOUNT ON
USE pubs
DBCC SHOWCONTIG WITH ALL_INDEXES
GO
顯示指定表的所有索引的碎片信息
SET NOCOUNT ONUSE pubs
DBCC SHOWCONTIG (authors) WITH ALL_INDEXES
GO
顯示指定索引的碎片信息
SET NOCOUNT ON
USE pubs
DBCC SHOWCONTIG (authors,aunmind)
GO
結果集
DBCC SHOWCONTIG將返回掃描頁數、掃描擴展盤區數、遍歷索引或表的頁時,DBCC 語句從一個擴展盤區移動到其它擴展盤區的次數、每個擴展盤區的頁數、掃描密度(最佳值是指在一切都連續地鏈接的情況下,擴展盤區更改的理想數目)。
DBCC SHOWCONTIG 正在掃描 'authors' 表...
表: 'authors'(1977058079);
索引 ID: 1,數據庫 ID: 5
已執行 TABLE 級別的掃描。
- 掃描頁數.....................................: 1
- 掃描擴展盤區數...............................: 1
- 擴展盤區開關數...............................: 0
- 每個擴展盤區上的平均頁數.....................: 1.0
- 掃描密度[最佳值:實際值]....................: 100.00%[1:1]
- 邏輯掃描碎片.................................: 0.00%
- 擴展盤區掃描碎片.............................: 0.00%
- 每頁上的平均可用字節數.......................: 6010.0
- 平均頁密度(完整)...........................: 25.75%
DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯系。
尋找什么
掃描頁數:如果你知道行的近似尺寸和表或索引里的行數,那么你可以估計出索引里的頁數。看看掃描頁數,如果明顯比你估計的頁數要高,說明存在內部碎片。
掃描擴展盤區數:用掃描頁數除以8,四舍五入到下一個最高值。該值應該和DBCC SHOWCONTIG返回的掃描擴展盤區數一致。如果DBCC SHOWCONTIG返回的數高,說明存在外部碎片。碎片的嚴重程度依賴于剛才顯示的值比估計值高多少。
擴展盤區開關數:該數應該等于掃描擴展盤區數減1。高了則說明有外部碎片。
每個擴展盤區上的平均頁數:該數是掃描頁數除以掃描擴展盤區數,一般是8。小于8說明有外部碎片。
掃描密度[最佳值:實際值]:DBCC SHOWCONTIG返回最有用的一個百分比。這是擴展盤區的最佳值和實際值的比率。該百分比應該盡可能靠近100%。低了則說明有外部碎片。
邏輯掃描碎片:無序頁的百分比。該百分比應該在0%到10%之間,高了則說明有外部碎片。
擴展盤區掃描碎片:無序擴展盤區在掃描索引葉級頁中所占的百分比。該百分比應該是0%,高了則說明有外部碎片。
每頁上的平均可用字節數:所掃描的頁上的平均可用字節數。越高說明有內部碎片,不過在你用這個數字決定是否有內部碎片之前,應該考慮fill factor(填充因子)。
平均頁密度(完整):每頁上的平均可用字節數的百分比的相反數。低的百分比說明有內部碎片。
備注
DBCC SHOWCONTIG實際上僅對那些大表有用。小表顯示的結果根本不符合正常標準,因為他們也許沒有由多于8個的頁面組成。你在查看小表上執行DBCC SHOWCONTIG的結果時應該忽略一些結果。在處理小表時只需關心擴展盤區開關數、邏輯掃描碎片、每頁上的平均可用字節數、平均頁密度(完整)。
DBCC SHOWCONTIG默認輸出的結果是:掃描頁數、掃描擴展盤區數、擴展盤區開關數、每個擴展盤區上的平均頁數、掃描密度[最佳值:實際值]、邏輯掃描碎片、擴展盤區掃描碎片、每頁上的平均可用字節數、平均頁密度(完整)。可以用FAST和TABLERESULTS選項來控制這個輸出結果。
FAST選項指定執行索引的快速掃描,輸出結果是最小的,該選項不讀索引的葉或數據頁且只返回掃描頁數、掃描擴展盤區數、掃描密度[最佳值:實際值]、邏輯掃描碎片。
TABLERESULTS選項將用行集的形式顯示信息,將返回擴展盤區開關數、掃描密度[最佳值:實際值]、邏輯掃描碎片、擴展盤區掃描碎片、每頁上的平均可用字節數、平均頁密度(完整)。
如果既指定FAST選項又指定TABLERESULTS選項,那么將返回對象名、對象ID、索引名、索引ID,頁數、擴展盤區開關數、掃描密度[最佳值:實際值]和邏輯掃描碎片。
ALL_INDEXES選項將顯示指定表和試圖的所有索引的結果,即使指定了一個索引。
ALL_LEVELS選項指定是否為所處理的每個索引的每個級別產生輸出(默認只輸出索引的頁級或表數據級的結果),并且只能與 TABLERESULTS 選項一起使用。
解決碎片問題
一旦你確定表或索引有碎片問題,那么你有4個選擇去解決那些問題:
刪除并重建索引
使用DROP_EXISTING子句重建索引
執行DBCC DBREINDEX
執行DBCC INDEXDEFRAG
盡管每一個技術都能達到你整理索引碎片的最終目的,但各有各的優缺點。
刪除并重建索引
用DROP INDEX和CREATE INDEX或ALTER TABLE來 刪除并重建索引有些缺陷包括在刪除重建期間索引會消失。在索引刪除重建時,對于查詢它不在可用,查詢性能也許會受到明顯的影響,直到重建索引為止。另一個 潛在的缺陷是當都請求索引的時候會引起阻塞,直到重建索引為止。通過其他的處理也能解決阻塞,就是索引被使用的時候不刪除索引。另一個主要的缺陷是在用DROP INDEX和CREATE INDEX重建聚集索引時會引起非聚集索引重建兩次。刪除聚集索引時非聚集索引的行指針會指向數據堆,聚集索引重建時非聚集索引的行指針又會指回聚集索引的行位置。
刪除并重建索引的確有一個好處就是通過重新排序索引頁,使索引頁緊湊并刪除不需要的索引頁來完全重建索引。你也許需要考慮那些內部和外部碎片都很高的情況下才使用,以使那些索引回到它們應該在的位置。
使用DROP_EXISTING子句重建索引
為了避免在重建聚集索引時表上的非聚集索引重建兩次,可以使用帶DROP_EXISTING子句的CREATE INDEX語句。這個子句會保留聚集索引鍵值,以避免非聚集索引重建兩次。和刪除并重建索引一樣,該方法也可能會引起阻塞和索引消失的問題。該方法的另一個缺陷是也強迫你去分別發現和修復表上的每一個索引。 除了和上一個方法一樣的好處之外,該方法的好處是不必重建非聚集索引兩次。這樣可以對那些帶約束的索引提供正確的索引定義以符合約束的要求。 執行DBCC DBREINDEX DBCC DBREINDEX類似于第二種方法,但它物理地重建索引,允許SQLServer給索引分配新頁來減少內部和外部碎片。DBCC DBREINDEX也能動態的重建帶約束的索引,不象第二種方法。 DBCC DBREINDEX的缺陷是會遇到或引起阻塞問題。DBCC DBREINDEX是作為一個事務來運行的,所以如果在完成之前中斷了,那么你會丟失所有已經執行過的碎片。 執行DBCC INDEXDEFRAG DBCC INDEXDEFRAG(在SQLServer2000中可用)按照索引鍵的邏輯順序,通過重新整理索引里存在的葉頁來減少外部碎片,通過壓縮索引頁里的行然后刪除那些由此產生的不需要的頁來減少內部碎片。它不會遇到阻塞問題但它的結果沒有其他幾個方法徹底。這是因為DBCC INDEXDEFRAG跳過了鎖定的頁且不使用任何新頁來重新排序索引。如果索引的碎片數量大的話你也許會發現DBCC INDEXDEFRAG比重建索引花費的時間更長。DBCC INDEXDEFRAG比其他方法的確有好處的是在其他過程訪問索引時也能進行碎片整理,不會引起其他方法的阻塞問題。
你只需要在SQL-SERVER上記錄這些圖片的路徑,前臺是個js插件,用程序控制輸出等量的圖片就可以了。
以下有幾款遷移工具的對比,可以參考,比較推薦DB2DB.
軟件易用性主要是指軟件在導入前的配置是否容易。由于很多軟件設計是面向程序員而非一般的數據庫管理人員、甚至是普通的應用程序實施人員,而這一類人員很多時候并沒有數據源配置經驗。因為一些使用 ODBC 或者 ADO 進行配置的程序往往會讓這類用戶造成困擾(主要是不知道應該選擇什么類型的數據庫驅動程序)。下面讓我們看看四個工具的設計界面:
1、SQLyog
SQLyog?使用的是古老的 ODBC 連接,但對于新一代的程序來說,這種方式的非常的不熟悉并且不容易使用,并且必須要求本機安裝好相應的數據庫的 ODBC 驅動程序(SQL Server 一般自帶好)。
2、Navicat?Premium
NavicatPremium是四個應用工具中設計最不人性化的一個:從上圖怎么也想像不到要點按那個小按鈕來添加一個新的連接,并且這個連接設置不會保存,每次導入時都必須重新設置。NavicatPremium使用的是比 ODBC 稍先進的 ADO 設置方式(199X年代的產物),但使用上依然是針對老一代的程序員。
3、Mss2sql
Mss2sql?是最容易在百度上搜索出來的工具,原因之一是它出現的時間較早。
Mss2sql由于是很有針對性的從 SQLServer 遷移到 MySQL,因為界面使用了操作向導設計,使用非常容易。同時在設置的過程中,有非常多的選項進行細節調整,可以感覺到軟件經過了相當長一段時間的使用漸漸完善出來的。
4、DB2DB
DB2DB?由于是由國人開發,因此無論是界面還是提示信息,都是全程漢字。另外,由于 DB2DB 在功能上很有針對性,因為界面設計一目了然和易使用。和 mss2sql 一樣, DB2DB 提供了非常多的選項供用戶進行選擇和設置。
三、處理速度和內存占用評測
在本評測前,本人的一位資深同事曾經從網上下載了某款遷移軟件,把一個大約2500萬記錄數的數據表轉送到阿里云 MySQL,結果經過了三天三夜(好在其中兩天是星期六和星期日兩個休息日)都未能遷移過來。因此這一次需要對這四個工具的處理速度作一個詳細的測試。
考慮到從 SQL Server 遷移到 MySQL 會出現兩種不同的場景:
從 SQL Server 遷移到本地 MySQL 進行代碼測試和修改;
從 SQL Server 遷移到云端 MySQL 數據庫正式上線使用;
以下為測試過程中的截圖:
1、SQLyog
請點擊輸入圖片描述
2、Navicat Premium
請點擊輸入圖片描述
請點擊輸入圖片描述
注意:我們在測試 Navicat Premium 遷移到 ?MySQL 時發現,對于 SQL Server 的 Money 類型支持不好(不排除還有其它的數據類型支持不好)。Money 類型字段默認的小數位長度為 255,使得無法創建數據表導致整個測試無法成功,需要我們逐張表進行表結構修改才能完成測試過程。
Navicat Premium?的處理速度屬于中等,不算快也不算慢,但 CPU 占用還有內存占用都處于高位水平。不過以現在的電腦硬件水平來說,還是可以接受。但 CPU 占用率太高,將使得數據在導入的過程中,服務器不能用于其它用途。
3、Mss2sql
Mss2sql?并沒有提供計時器,因此我們使用人工計時的方法,整個過程處理完畢大于是 726 秒。Mss2sql 的 CPU 占用率相對其它工具來說較高,但仍屬于可以接受的范圍之內。
4、DB2DB
請點擊輸入圖片描述
DB2DB?同樣遷移 300萬數據時,僅僅使用了 2 分 44 秒,這個速度相當驚人。不過最后的結果出現一個 BUG,就是提示了轉換成功,但后面的進度條卻沒有走完(在后面的數據完整性評測中,我們驗證了數據其實是已經全部處理完畢了)。