我正在使用C#來填充數據庫表(SQL Server 2005或2008)。我希望數據庫表的大小盡可能小,因爲Godaddy只允許200 MB大小的數據庫,我想從中獲得最大收益。我是否應該在插入字符串數據時壓縮字符串數據,還是有更好的方式通過某種形式的壓縮來保持數據庫的大小?在放入數據庫之前壓縮字符串有幫助嗎?
5
A
回答
15
2
也要考慮一下當字符串進入數據庫後需要做什麼。任何需要qu??如果是這樣,壓縮可能會使這很難/昂貴。
+0
我可能需要查詢未來的壓縮數據,所以在這種情況下壓縮可能不是一個好主意。 – rossboss 2011-06-09 16:28:34
0
在大多數情況下,它有利於壓縮字符串數據。你最好做到以下幾點:
- 瞭解數據壓縮https://msdn.microsoft.com/en-us/library/cc280449.aspx
- 構建戰略和規劃https://msdn.microsoft.com/en-us/library/dd894051(v=sql.100).aspx
- 做動作
對於第3步。我使用下面的T-SQL腳本壓縮數據庫(您可以添加修改)
/*
Description: This stored procedure can compress a database or list out estimations for the savings from possible compression.
Create the stored procedure on database level.
Call:
USE AdventureWorksDW2014;
GO
EXEC dbo.sp_compress_database
@dbname = 'AdventureWorksDW2014', -- Database to compress
@compression_type = 'PAGE', -- Compression type: PAGE, ROW or NONE
@mode = 1; -- Mode can be: 1 -> compression and 0 -> estimation for compression
Author: Igor Micev
Date: 2012-10-25
*/
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
ALTER PROCEDURE [dbo].[sp_compress_database]
(
@dbname NVARCHAR(100),@compression_type VARCHAR(10),@mode BIT
)
AS
BEGIN
SET NOCOUNT ON;
IF OBJECT_ID('tempdb..#tables_for_compression') IS NOT NULL DROP TABLE #tables_for_compression;
CREATE TABLE #tables_for_compression
(
[id] INT IDENTITY(1,1) NOT NULL PRIMARY KEY,[object_name] VARCHAR(100),[schema_name] VARCHAR(20),[index_id] INT,[partition_number] INT,[size_before_compression_KB] INT,[size_after_compression_KB] INT,[sample_size_before_compression_KB] INT,[sample_size_after_compression_KB] INT
);
IF @compression_type NOT IN('PAGE','ROW','NONE')
BEGIN
RAISERROR('Compression type is not valid.',16,1);
RETURN;
END;
DECLARE @dynamic_cmd NVARCHAR(1000);
DECLARE @tbl NVARCHAR(100);
DECLARE @schema NVARCHAR(20);
DECLARE tbl_cursor CURSOR FOR SELECT isc.TABLE_NAME,isc.TABLE_SCHEMA
FROM INFORMATION_SCHEMA.TABLES AS isc
WHERE [email protected] AND isc.TABLE_TYPE='BASE TABLE';
OPEN tbl_cursor;
FETCH NEXT FROM tbl_cursor INTO @tbl,@schema;
--Examine the clustered indexes
WHILE @@fetch_status=0
BEGIN
IF @mode=1
BEGIN
SET @dynamic_cmd='USE ['[email protected]+'] ALTER TABLE ['[email protected]+'].['[email protected]+']
REBUILD PARTITION = ALL WITH (ONLINE = ON, DATA_COMPRESSION = '[email protected]_type+')';
END;
BEGIN TRY
IF @mode=0
BEGIN
SET @dynamic_cmd='EXEC sp_estimate_data_compression_savings '''[email protected]+''', '''[email protected]+''', NULL, NULL,'''[email protected]_type+'''';
INSERT INTO #tables_for_compression([object_name],[schema_name],index_id,partition_number,size_before_compression_KB,size_after_compression_KB,sample_size_before_compression_KB,sample_size_after_compression_KB)
EXEC sp_executesql @dynamic_cmd;
END;
IF @mode=1
BEGIN
EXEC sp_executesql @dynamic_cmd;
PRINT @schema+'.'[email protected]+' was compressed.';
END;
END TRY
BEGIN CATCH
PRINT 'Failed command: '[email protected]_cmd;
END CATCH;
FETCH NEXT FROM tbl_cursor INTO @tbl,@schema;
END;
CLOSE tbl_cursor;
DEALLOCATE tbl_cursor;
--Examine the nonclustered indexes. Exclude XML type indexes.
IF @mode=1
BEGIN
DECLARE @ind_name NVARCHAR(100);
DECLARE ncix CURSOR FOR SELECT ss.name AS [schema],OBJECT_NAME(ddips.object_id) AS table_name,si.name AS index_name
FROM sys.dm_db_index_physical_stats(DB_ID(),NULL,NULL,NULL,'SAMPLED') AS ddips
JOIN sys.indexes AS si ON ddips.index_id=si.index_id AND ddips.object_id=si.object_id
JOIN sys.tables AS st ON ddips.object_id=st.object_id
JOIN sys.schemas AS ss ON st.schema_id=ss.schema_id
WHERE si.index_id>1 AND si.[type]=2 AND ddips.page_count>64;
--Nonclustered indexes with more than 64 pages
OPEN ncix;
FETCH NEXT FROM ncix INTO @schema,@tbl,@ind_name;
WHILE(@@fetch_status=0)
BEGIN
SET @dynamic_cmd='ALTER INDEX '[email protected]_name+' ON '[email protected]+'.'[email protected]+'
REBUILD WITH (ONLINE = ON, DATA_COMPRESSION = '[email protected]_type+')';
BEGIN TRY
EXEC sp_executesql @dynamic_cmd;
PRINT 'Index '[email protected]_name+' was compressed.';
END TRY
BEGIN CATCH
PRINT 'Index '[email protected]_name+' cannot be compressed. Err.Msg: '[email protected]@error;
END CATCH
FETCH NEXT FROM ncix INTO @schema,@tbl,@ind_name;
END;
CLOSE ncix;
DEALLOCATE ncix;
END
IF @mode=0
SELECT *
FROM #tables_for_compression;
IF OBJECT_ID('tempdb..#tables_for_compression') IS NOT NULL DROP TABLE #tables_for_compression;
END
相關問題
- 1. 在將字符串放入redis之前壓縮字符串 - 是否有意義?
- 2. tar有幫助壓縮嗎?
- 3. 我應該在mongodump/mongorestore之前壓縮MongoDB數據庫嗎?
- 4. 在將圖像插入數據庫之前壓縮圖像
- 5. Android縮放圖庫幫助
- 6. 在java中的字符串數據的壓縮和解壓縮
- 7. 在anova之前縮放嗎?
- 8. 在發送之前壓縮數據
- 9. 字符串比DotNetZip或LZMA有更好的壓縮庫嗎?
- 10. PHP在插入數據庫之前更改字符串
- 11. 在插入數據庫之前將字符串轉換爲位
- 12. Java字符串數據壓縮
- 13. 在不同的數據庫中壓縮字符串
- 14. 壓縮字符串
- 15. 在下載之前壓縮數據會更好嗎?
- 16. 如何在插入LMDB數據集之前壓縮numpy數組?
- 17. 數據庫插入幫助?
- 18. JavaScript字符串壓縮+ PHP解壓縮
- 19. 壓縮和解壓字符串減縮
- 20. 解壓縮壓縮字符串
- 21. 壓縮字符串,然後解壓縮字符串?
- 22. 在將文本存儲到數據庫之前壓縮文本
- 23. 將字符串發送到服務器之前進行壓縮
- 24. 僱用,以字符串壓縮減小數據庫大小
- 25. 在寫入文件之前壓縮XML
- 26. 在Java中壓縮和解壓縮參數字符串
- 27. 壓縮一個字符串並將其作爲字符串存儲在數據庫中供以後解壓
- 28. PHP數據庫表查詢幫助請求 - 字符串變量
- 29. 壓縮數據庫
- 30. 在提交到存儲庫之前解壓壓縮的數據文件
我知道這不是一個回答你的問題,但我可以給的最好的建議是下車GoDaddy或推薦給你的客戶/僱主他們下車GoDaddy。他們有可怕的價格過高的託管服務,因爲你得到的東西很少。 – 2011-06-09 13:04:19
我從來沒有能夠FTP大於50MB的文件到GoDaddy沒有他們的FTP服務出局,他們沒有提供可以連接在服務器上的多個部分的實用程序。 – Tim 2011-06-09 13:23:58
嗯。這裏的人們實際上編輯問題很酷。我以爲只有在犯規或不合格的語言纔會發生。謝謝宋。 – rossboss 2011-06-09 16:30:35