¿Deberíamos usar un indicador para eliminaciones suaves, o una tabla de unión separada? ¿Cuál es más eficiente? La base de datos es SQL Server.Eliminación suave: use la marca IsDeleted o la tabla de unión separada.
Antecedentes
Hace un tiempo tuvimos un consultor DB entrar y mirar a nuestro esquema de base de datos. Cuando eliminemos un registro de forma suave, actualizaríamos un indicador IsDeleted en la (s) tabla (s) correspondiente (s). Se sugirió que, en lugar de utilizar una bandera, almacenara los registros eliminados en una tabla separada y utilizara una combinación, ya que eso sería mejor. He puesto esa sugerencia a prueba, pero al menos en la superficie, la mesa extra y la combinación parecen ser más caras que usar una bandera.
Prueba Inicial
He creado esta prueba.
Dos tablas, ejemplo y ejemplo eliminado. Agregué un índice no agrupado en la columna IsDeleted.
lo hice tres pruebas, la carga de un millón de registros con las siguientes relaciones borrados/no eliminados:
- eliminados/NonDeleted
- 50/50
- 10/90
- 1/99
resultados - 50/50
Resultados - 10/90
Resultados - 1/99
scripts de base, para la referencia, Ejemplo, DeletedExample, y el Índice de Example.IsDeleted
CREATE TABLE [dbo].[Example](
[ID] [int] NOT NULL,
[Column1] [nvarchar](50) NULL,
[IsDeleted] [bit] NOT NULL,
CONSTRAINT [PK_Example] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Example] ADD CONSTRAINT [DF_Example_IsDeleted] DEFAULT ((0)) FOR [IsDeleted]
GO
CREATE TABLE [dbo].[DeletedExample](
[ID] [int] NOT NULL,
CONSTRAINT [PK_DeletedExample] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[DeletedExample] WITH CHECK ADD CONSTRAINT [FK_DeletedExample_Example] FOREIGN KEY([ID])
REFERENCES [dbo].[Example] ([ID])
GO
ALTER TABLE [dbo].[DeletedExample] CHECK CONSTRAINT [FK_DeletedExample_Example]
GO
CREATE NONCLUSTERED INDEX [IX_IsDeleted] ON [dbo].[Example]
(
[IsDeleted] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
Buena respuesta. También considere usar índices filtrados.Si solo consulta la tabla Ejemplo por Columna1 cuando los registros no se eliminan, indexe Columna1 "DONDE IsDelete = 0". –