2011-06-09 28 views
5

我正在使用C#來填充數據庫表(SQL Server 2005或2008)。我希望數據庫表的大小盡可能小,因爲Godaddy只允許200 MB大小的數據庫,我想從中獲得最大收益。我是否應該在插入字符串數據時壓縮字符串數據,還是有更好的方式通過某種形式的壓縮來保持數據庫的大小?在放入數據庫之前壓縮字符串有幫助嗎?

+0

我知道這不是一個回答你的問題,但我可以給的最好的建議是下車GoDaddy或推薦給你的客戶/僱主他們下車GoDaddy。他們有可怕的價格過高的託管服務,因爲你得到的東西很少。 – 2011-06-09 13:04:19

+0

我從來沒有能夠FTP大於50MB的文件到GoDaddy沒有他們的FTP服務出局,他們沒有提供可以連接在服務器上的多個部分的實用程序。 – Tim 2011-06-09 13:23:58

+0

嗯。這裏的人們實際上編輯問題很酷。我以爲只有在犯規或不合格的語言纔會發生。謝謝宋。 – rossboss 2011-06-09 16:30:35

回答

15

選項D - 什麼也不做。因爲it's done for you

+0

非常感謝丹尼斯。這正是我所尋找的:) – rossboss 2011-06-09 16:17:38

2

也要考慮一下當字符串進入數據庫後需要做什麼。任何需要qu??如果是這樣,壓縮可能會使這很難/昂貴。

+0

我可能需要查詢未來的壓縮數據,所以在這種情況下壓縮可能不是一個好主意。 – rossboss 2011-06-09 16:28:34

0

在大多數情況下,它有利於壓縮字符串數據。你最好做到以下幾點:

  1. 瞭解數據壓縮https://msdn.microsoft.com/en-us/library/cc280449.aspx
  2. 構建戰略和規劃https://msdn.microsoft.com/en-us/library/dd894051(v=sql.100).aspx
  3. 做動作

對於第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