Yo diría que las pruebas son necesarias, pero es bueno conocer las experiencias de otras personas. En mi experiencia en ms sql server, los nulos pueden y causan problemas de rendimiento masivo (diferencias). En una prueba muy simple ahora he visto un retorno de consulta en 45 segundos cuando no se estableció nulo en los campos relacionados en la declaración de creación de la tabla y más de 25 minutos en los que no se configuró (abandoné la espera y simplemente hice un pico en el plan de consulta estimado).
Los datos de prueba son 1 millón de filas x 20 columnas que se construyen a partir de 62 caracteres alfabéticos aleatorios en minúscula en una HD normal i5-3320 y 8 GB de RAM (SQL Server con 2 GB)/SQL Server 2012 Enterprise Edition en Windows 8.1. Es importante usar datos aleatorios/datos irregulares para hacer que las pruebas sean un "caso peor" realista. En ambos casos, la tabla se volvió a crear y volvió a cargar con datos aleatorios que tardaron unos 30 segundos en archivos de bases de datos que ya tenían una cantidad adecuada de espacio libre.
select count(field0) from myTable where field0
not in (select field1 from myTable) 1000000
CREATE TABLE [dbo].[myTable]([Field0] [nvarchar](64) , ...
vs
CREATE TABLE [dbo].[myTable]([Field0] [nvarchar](64) not null,
por motivos de rendimiento, ambos tenían la opción de tabla data_compression = page set y todo lo demás estaba predeterminado. Sin índices
alter table myTable rebuild partition = all with (data_compression = page);
No tener valores nulos es un requisito en las tablas de memoria optimizado para los que no estoy usando específicamente obstante servidor SQL, obviamente, hará lo que es más rápido que en este caso concreto parece ser masivamente a favor de no tener valores nulos en datos y usando no nulo en la tabla crear.
Cualquier consulta posterior de la misma forma en esta tabla regresa en dos segundos, por lo que supondría que las estadísticas predeterminadas estándar y posiblemente tener la mesa (1.3GB) en la memoria funcionan bien. decir
select count(field19) from myTable where field19
not in (select field18 from myTable) 1000000
En un aparte que no tengan valores nulos y no tener que lidiar con los casos nulos también hace consultas mucho más simple, más corto, menos propenso a errores y muy normalmente más rápido. De ser posible, mejor evitar los nulos generalmente en el servidor ms sql al menos, a menos que sean explícitamente necesarios y no se puedan resolver razonablemente con la solución.
Comenzando con una nueva tabla y dimensionando esto hasta 10m filas/13GB, la misma consulta toma 12 minutos, lo que es muy respetable teniendo en cuenta el hardware y no hay índices en uso. Para la consulta de información estaba completamente enlazado a IO con IO flotando entre 20MB/sa 60MB/s. Una repetición de la misma consulta tomó 9 minutos.
Jakob, ¿qué tipo de problemas de rendimiento ha encontrado con NULLs? –
bien - sin problemas hasta el momento. Pero recuerdo que leí un artículo sobre el rendimiento más lento al usar valores nulos. Entonces, la discusión comenzó en nuestro equipo, ya sea que permitiéramos valores nulos o no, y todavía no hemos llegado a ninguna conspiración. Tenemos algunas tablas muy grandes con millones de filas y una gran cantidad de clientes, por lo que es un cambio bastante grande para el proyecto. Pero los clientes plantearon un problema sobre el rendimiento en el motor de búsqueda. –
SI tiene problemas de rendimiento en el motor de búsqueda, buscaría muchos otros lugares antes de eliminar los valores nulos. Comience con la indexación, mire los planes de ejecución para ver qué está sucediendo realmente. Mire dónde hay cláusulas para ver si son susceptibles de saqueo. Mira lo que estás devolviendo, ¿usaste select * (malo para el rendimiento si tienes un join como un campo por lo menos se repite así esperando nuevos recursos), usaste subconsultas en lugar de join? ¿Usaste un cursor? ¿Es la cláusula Where suficientemente exclusiva? ¿Usó un comodín para el primer personaje? Y sigue y sigue y sigue. – HLGEM