Pregunta ¿El número de columnas afecta el rendimiento de la consulta?


CASO 1: Tengo una tabla con 30 columnas y consulto usando 4 columnas en la cláusula where.

CASO 2: Tengo una tabla con 6 columnas y consulto usando 4 columnas en la cláusula where.

¿Cuál es la diferencia en el rendimiento en ambos casos?

Por ejemplo, tengo una mesa

table A
{
  b varchar(10),
  c varchar(10),
  d varchar(10),
  e varchar(10),
  f varchar(10),
  g varchar(10),
  h varchar(10)

}

SELECT b,c,d
FROM A
WHERE f='foo'

create table B
{
  b varchar(10),
  c varchar(10),
  d varchar(10),
  e varchar(10),
  f varchar(10)

}

SELECT b,c,d
FROM B
WHERE f='foo'

Tanto la tabla A como la B tienen la misma estructura significa solo la diferencia en el número de columnas y columnas utilizadas en donde la condición también es la misma y la columna en seleccionar también es la misma. La diferencia es que la tabla B solo tiene alguna columna no utilizada; estas no se están usando en las condiciones de selección y ubicación. en ese caso, ¿hay alguna diferencia en el rendimiento de ambas consultas?


14
2017-09-08 12:19


origen


Respuestas:


¿El número de columnas afecta el rendimiento de la consulta?

Sí, porque el principal beneficio de devolver menos columnas en un SELECT es que SQL podría evitar leer de la tabla / clúster, y en su lugar, si puede recuperar todo el selected datos de un índice (ya sea como columnas indexadas y / o columnas incluidas en el caso de un índice de cobertura)

Obviamente, las columnas utilizadas en el predicado (donde el filtro), es decir f en tu ejemplo, DEBE estar en las columnas indexadas del índice, y debe ser lo suficientemente selectivo, para que se use un índice en primer lugar.

También hay una secundario beneficio al devolver menos columnas de un SELECT, ya que esto reducirá cualquier sobrecarga de E / S, especialmente si hay una red lenta entre el servidor de la base de datos y la aplicación que consume los datos; es decir, es una buena práctica devolver solo las columnas que realmente necesita y evitar el uso SELECT *.

Editar : En respuesta a la publicación actualizada de OP:

Sin índices en absoluto, ambas consultas realizarán escaneos de tabla. Dado que Table B tiene menos columnas que Table A, las filas por página (densidad) serán más altas en B y entonces B será un poco más rápido ya que SQL necesitará obtener menos páginas.

Sin embargo, con índices como se detalla a continuación

  • Índice en A(f) INCLUDE (b,c,d)
  • Índice en B(f) INCLUDE (b,c,d)

El rendimiento debe ser idéntico para las consultas (asumiendo los mismos datos en ambas tablas), dado que SQL afectará a los índices que ahora tienen anchos de columna y densidades de fila similares.

Editar 

Algunos otros planes:

  • Índice en B(f) sin otra clave o INCLUDE columnas, o con un conjunto incompleto de INCLUDE columnas (es decir, uno o más de b, c or d están perdidos):

Es probable que SQL Server necesite hacer una Clave o RID  Buscar como incluso si se usa el índice, habrá una necesidad de "unirse" de nuevo a la tabla para recuperar las columnas que faltan en la cláusula de selección. (El tipo de búsqueda depende de si la tabla tiene una PK agrupada o no)

  • Índice recto no agrupado en B(f,b,c,d)

Esto seguirá siendo muy eficaz, ya que se usará el índice y se evitará la tabla, pero no será tan bueno como el índice de cobertura, porque la densidad del árbol de índice será menor debido a las columnas clave adicionales en el índice.


11
2017-09-08 12:21



Pruébalo y verás!

Habrá una diferencia de rendimiento, sin embargo, el 99% de las veces no lo notará; ¡por lo general, ni siquiera podrá detectarlo!

Ni siquiera puede garantizar que la tabla con menos columnas sea más rápida; si le molesta, pruébela y vea.

Basura técnica: (desde la perspectiva de Microsoft SQL Server)

Suponiendo que en todos los demás aspectos (índices, recuentos de filas, datos contenidos en las 6 columnas comunes, etc.) las tablas son idénticas, la única diferencia real será que la tabla más grande se distribuirá en más páginas del disco. / en memoria.

El servidor SQL solo intenta leer los datos que absolutamente requiere, sin embargo, siempre cargará una página completa a la vez (8 KB). Incluso con la misma cantidad de datos exactos que se requieren como resultado de la consulta, si esos datos se extienden en más páginas, se requiere más IO.

Dicho esto, SQL Server es increíblemente eficiente con su acceso a datos, por lo que es muy poco probable que vea un impacto notable en el rendimiento, excepto en circunstancias extremas.

Además, también es probable que su consulta se ejecute contra el índice en lugar de la tabla de todos modos, y así con índices exactamente del mismo tamaño es probable que el cambio sea 0.


4
2017-09-08 12:35



No habrá diferencia de rendimiento en función de la posición de la columna. Ahora la construcción de la mesa es una historia diferente, por ej. cantidad de filas, índices, cantidad de columnas, etc.

El escenario del que está hablando en el que compara la posición de la columna en las dos tablas es como comparar casi manzanas con naranjas, porque hay muchas variables diferentes además de la posición de la columna.


2
2017-09-08 12:21



A menos que tenga una diferencia de conjunto de columnas muy amplia sin utilizar ningún índice (por lo tanto, una exploración de tabla), verá poca diferencia en el rendimiento. Dicho esto, siempre es útil / benificial devolver la menor cantidad de columnas posible para satisfacer sus necesidades. La clave aquí es que se puede obtener un mayor beneficio devolviendo las columnas que necesita en lugar de una segunda búsqueda de base de datos para otras columnas.

  • Toma lo que necesites
  • evitar la segunda consulta de la base de datos en la misma tabla para las mismas filas
  • use un índice en la (s) columna (s) de selección (restricción de la cláusula WHERE)
  • restrinja las columnas si no las necesita para mejorar la eficiencia / paginación de la memoria del servidor de datos

2
2017-09-08 12:30



Depende del ancho de la tabla (Bytes por fila), cuántas filas hay en la tabla y si hay índices en las columnas utilizadas por la consulta. Sin respuesta definitiva sin esa información. Sin embargo, cuantas más columnas haya en la tabla, es probable que sea más amplia. Pero el efecto de un índice adecuado es mucho más significativo que el efecto del tamaño de la tabla.


1
2017-09-08 12:22