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?
Respuesta
Opción D: no hacer nada. Porque it's done for you.
Muchas gracias Denis. Eso es exactamente lo que estaba buscando :) – rossboss
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.
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
En la mayoría de los casos es beneficioso la compresión de datos de cadena. Será mejor que hacer lo siguiente:
- Entender la compresión de datos https://msdn.microsoft.com/en-us/library/cc280449.aspx
- estrategia de construcción y planificación https://msdn.microsoft.com/en-us/library/dd894051(v=sql.100).aspx
- ¿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
- 1. Comprimir texto antes de almacenarlo en la base de datos
- 2. Comprimir cadenas antes de ponerlas en redis: ¿tiene sentido?
- 3. Clase de base de datos PHP útil
- 4. ¿Es bueno almacenar cadenas largas en una base de datos?
- 5. Comprimir objetos Python antes de guardarlos en la memoria caché
- 6. Cadenas como claves principales en la base de datos SQL
- 7. Cómo comprimir una base de datos MS Access
- 8. ¿Es útil agregar una máscara de bits a todas las tablas en una base de datos?
- 9. ¿Puedo comprimir datos en JavaScript?
- 10. Cuándo filtrar/desinfectar datos: antes de la inserción de la base de datos o antes de la visualización?
- 11. Comprimir archivo antes de cargarlo a través de http
- 12. Cómo comprimir/descomprimir datos de usuario en javascript antes de enviarlos al servidor?
- 13. Sanitize HTML antes de almacenar en la base de datos o antes de la representación? (Biblioteca AntiXSS en ASP.NET)
- 14. Comprimir imágenes en el lado del cliente antes de cargar
- 15. cómo obtener el valor de la base de datos a una matriz de cadenas en Android (base de datos SQLite)
- 16. ¿Es esencial cerrar la base de datos?
- 17. Compruebe si existe una base de datos antes de crear
- 18. ¿Cuándo es útil la salida de repr?
- 19. Error en LINQ to SQL con cadenas vacías en la base de datos
- 20. ¿Cómo es útil la anotación en PHP?
- 21. ¿Es posible comprimir videos en Android?
- 22. ¿Codifica la contraseña antes de almacenarla en la base de datos?
- 23. Cómo formatear los valores antes de guardarlos en la base de datos en rieles 3
- 24. ¿Cuál es la posición: relativa útil para?
- 25. Comprimir archivos mientras lee datos de STDIN
- 26. Práctica recomendada para manejar cadenas nulas desde la base de datos (en Java)
- 27. Cifrado de datos para almacenamiento en la base de datos
- 28. ¿Qué tan útil es Response.IsClientConnected?
- 29. ¿Cuál es la mejor práctica para almacenar detalles de conexión de base de datos en .NET?
- 30. Concatenación de cadenas de SQL independiente de la base de datos en Rails
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. –
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
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