2011-02-08 57 views
7
SELECT f.* 
FROM feeds f, 
    user_feeds uf 
WHERE (f.id=uf.feed_id and uf.user_id in (1,2,5,6,23,45)) 
ORDER BY created_at DESC 

Esta es una consulta utilizada para construir los feeds de un usuario. El problema que tengo con esta consulta es que el "uf.user_id in()" aumenta a medida que aumenta el número de usuarios que sigue.Longitud máxima de una consulta SQL

¿Cuál es la longitud máxima permitida de una consulta SQL? ¿Existe alguna forma mejor de implementar mi consulta anterior?

Nota: Estoy usando ActiveRecord. Y estoy usando Postgres.

+0

Creo que necesita explicar qué son "feeds", "user_feeds", y quién es "él". ¿Hay alguna otra mesa de interés? ¿Los ID de usuario 1, 2, 5, etc. están almacenados en una tabla? – ChrisJ

+0

RSS: Identificación, feed_type user_feeds: id, FEED_ID, USER_ID usuarios: ID, nombre de usuario feed_type = [como | comentario | etc] esencialmente, cuando a alguien le gusta algo (por ejemplo una foto) se realiza una entrada en el tabla "feeds" y las entradas se realizan en la tabla user_feeds de los usuarios incluidos en la foto. Sí 1,2,5 ... son los ID de usuario –

Respuesta

11

La longitud máxima de una consulta que PostgreSQL puede procesar es 2147483648 caracteres (firmados entero de 4 bytes; ver src/include/lib/stringinfo.h).

4

Para evitar el tamaño de la consulta, se puede reemplazar el IN (1, 2) con IN (SELECT followed_id de seguir donde follower_id =?) O lo que sea la consulta apropiada sería encontrar los ID de los usuarios seguido desde el seguidor de carné de identidad.

+0

Ah, esa es una forma más fácil de escribirlo. –

1

Podría considerar el uso de una subconsulta para construir la parte IN de su cláusula WHERE original. Así, el resultado sería algo como esto:.

"SELECT * FROM f f alimenta, user_feeds uf DONDE (f.id = uf.feed_id y uf.user_id en (SELECT, donde seguidor = id) seguido) ORDER BY created_at DESC "

Obviamente, la subconsulta no es correcta como la publiqué, pero eso debería darle una idea general.

+0

Sí. Gracias, creo que haré eso. –

0

Utilice una subconsulta correlacionada. Si tiene una tabla que contiene los usuarios que un miembro sigue, su texto de consulta no crecerá.

Por ejemplo:

SELECT f.* 
FROM feeds f, 
    user_feeds uf 
WHERE f.id=uf.feed_id 
    AND EXISTS (SELECT 'X' 
       FROM follows 
       WHERE follows.user_id = uf.user_id) 
ORDER BY created_at DESC; 
0

Si bien no existe (real) límite en la longitud de la cadena de consulta, hay un límite en el número de (x, y, z ...) cláusulas : 10000, configurable en el postgres.ini-archivo:

Ver:

: http://grokbase.com/t/postgresql/pgsql-general/061mc7pxg6/what-is-the-maximum-length-of-an-in-a-b-c-d-list-in-postgresql "en 7.4 y anteriores que depende de la configuración max_expr_depth." ... "En 8.0 y posteriores max_expr_depth se ha ido y el límite depende de max_stack_depth".

Cuestiones relacionadas