2011-06-09 8 views
5

Estoy usando C# para rellenar una tabla de base de datos (SQL Server 2005 o 2008). Quiero que el tamaño de la tabla de la base de datos permanezca lo más pequeño posible porque Godaddy solo permite bases de datos de 200 MB de tamaño y quiero aprovecharlo al máximo. ¿Debo comprimir mis datos de cadena cuando los inserto, o hay una mejor manera de mantener el tamaño de la base de datos con algún tipo de compresión?¿Es útil comprimir cadenas antes de colocarlas en la base de datos?

+0

Sé que esto no es un responda a su pregunta, pero el mejor consejo que puedo darle es que se baje de GoDaddy o recomiende a su cliente/empleador que se baje de GoDaddy. Tienen un servicio de hosting terriblemente caro por lo poco que obtienes. –

+0

Nunca he podido enviar por FTP un archivo de más de 50 MB a GoDaddy sin su servicio FTP, y no proporcionan utilidades que puedan unir varias piezas en el servidor. – Tim

+0

Hmmmm. La gente aquí realmente edita preguntas. Muy genial. Pensé que eso solo sucedía si había un lenguaje sucio o inapropiado. Gracias Sung. – rossboss

Respuesta

15

Opción D: no hacer nada. Porque it's done for you.

+0

Muchas gracias Denis. Eso es exactamente lo que estaba buscando :) – rossboss

2

Considere también lo que necesita hacer con las cadenas una vez que están en la base de datos. ¿Alguna necesidad de acuñar? Si es así, la compresión puede hacer que sea bastante difícil/costoso.

+0

Es posible que tenga que consultar los datos comprimidos en el futuro, por lo que comprimir en este caso probablemente no sea una buena idea. – rossboss

0

En la mayoría de los casos es beneficioso la compresión de datos de cadena. Será mejor que hacer lo siguiente:

  1. Entender la compresión de datos https://msdn.microsoft.com/en-us/library/cc280449.aspx
  2. estrategia de construcción y planificación https://msdn.microsoft.com/en-us/library/dd894051(v=sql.100).aspx
  3. ¿Las acciones

Para el paso 3. utilizo el siguiente script T-SQL para comprimir una base de datos (puede agregarle modificaciones)

/* 

    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 
Cuestiones relacionadas