una soporta segundo rapida por optimizar optimizacion mas lentas lenta hacer cuantas consultas consulta como agilizar sql mysql select-until

soporta - SQL: selecciona "hasta"



optimizar consultas mysql explain (3)

Estoy buscando una forma de seleccionar hasta que se alcance una suma.

Mi tabla de "documentos" tiene los tag_id " tag_id " y " size ".

Quiero seleccionar todos los documentos con tag_id = 26 pero sé que solo puedo manejar 600 unidades de tamaño. Por lo tanto, no tiene sentido seleccionar 100 documentos y descartar 90 de ellos cuando podría haber sabido que los primeros 10 ya sumaron hasta> 600 unidades.

Entonces, el objetivo es: no traiga una tonelada de datos para analizar cuando voy a descartar la mayor parte.

... pero también me gustaría evitar introducir el trabajo con cursores en esta aplicación.

Estoy usando mysql.


Debería primero almacenar los documentos en una variable de tabla, ordenarlos en el orden en que desea recuperarlos, luego actualizar cada fila con un valor acumulativo para que pueda seleccionar en ella.

declare @documents_temp table ( tag_id int, size int, cumulative_size int null) insert into @documents_temp select tag_id, size, size from documents order by tag_id update @documents_temp d set d.cumulative_size = d.size + (select top 1 cumulative_size from @documents_temp where tag_id < d.tag_id order by tag_id desc) select tag_id, size from @documents_temp where cumulative_size <= 600

No sé si vale la pena.


Esto es mucho menos eficiente, pero evita un cursor (suponiendo que su tabla de documentos también tenga una columna de identificación serial):

select a.id, (select sum(b.size) from documents b where b.id <= a.id and b.tag_id = 26) from documents a where a.tag_id = 26 order by a.id

Además, esto se hizo en pgsql, así que no estoy seguro de si esta sintaxis exacta funcionaría en mysql.

Luego puede ajustar esto en otra consulta que busque aquellos que tienen una suma> 600 (tendrá que nombrar la columna de suma) y tomar la primera identificación. Luego procesa todos los ID a continuación e incluye ese.


Necesita alguna forma de ordenar qué registros tienen prioridad sobre los demás al sumar sus unidades máximas. De lo contrario, ¿cómo sabes qué conjunto de registros contiene un total de hasta 600?

SELECT d.id, d.size, d.date_created FROM documents d INNER JOIN documents d2 ON d2.tag_id=d.tag_id AND d2.date_created >= d.date_created WHERE d.tag_id=26 GROUP BY d.id, d.size, d.date_created HAVING sum(d2.size) <= 600 ORDER BY d.date_created DESC

Esta es solo una consulta básica para comenzar, y hay una serie de problemas por resolver:

  • Se detiene en <= 600, por lo que en la mayoría de los casos no se llenará el límite de tamaño exactamente. Esto significa que es posible que desee modificarlo para permitir un registro más. Por ejemplo, si el primer registro es> 600, la consulta no devolverá nada, y eso podría ser un problema.
  • No servirá de nada verificar si hay registros más pequeños adicionales más adelante que aún podrían caber debajo del límite.
  • Los registros con valores idénticos date_created podrían ser "contados doblemente" aquí y allá.

editar
Actualizado desde que agregó información que está ordenando por fecha.