2011-02-08 9 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 

To jest zapytanie używane do konstruowania kanałów użytkownika. Problem z tym zapytaniem polega na tym, że wartość "uf.user_id in()" zwiększa się wraz ze wzrostem liczby użytkowników, których obserwuje.Maksymalna długość zapytania SQL

Jaka jest dozwolona maksymalna długość zapytania SQL? Czy istnieje lepszy sposób realizacji powyższego zapytania?

Uwaga: używam ActiveRecord. Używam PostgreSQL.

+0

Myślę, że trzeba wyjaśnić, czym są "kanały", "źródła_użytkownika" i kim jest "on". Czy jest jakaś inna tabela interesów? Czy identyfikatory użytkowników 1, 2, 5 itp. Są przechowywane w tabeli? – ChrisJ

+0

RSS: id, feed_type user_feeds: id, feed_id, USER_ID użytkowników: identyfikator, nazwę użytkownika feed_type = [jak | Komentarze | etc] zasadniczo, gdy ktoś lubi coś (słownie fotografię) wpisu dokonuje się w tabela "feeds", a wpisy są wprowadzane do tabeli user_feeds użytkowników znajdujących się na zdjęciu. Tak 1,2,5 ... są użytkownikami i użytkownikami –

Odpowiedz

11

Maksymalna długość zapytania, które może przetwarzać PostgreSQL, wynosi 2147483648 znaków (podpisana 4-bajtowa liczba całkowita, patrz src/include/lib/stringinfo.h).

4

Aby uniknąć rozmiaru kwerendy, można zamienić IN (1, 2) na IN (wybierz id_ślidowania z następującego, gdzie follower_id =?) Lub cokolwiek było odpowiednie zapytanie, aby znaleźć identyfikatory następujących użytkowników od obserwującego ID.

+0

Ah, to jest łatwiejszy sposób na napisanie. –

1

Można rozważyć użycie podkwerendy do skonstruowania części IN oryginalnej klauzuli WHERE. Rezultat powinien wyglądać mniej więcej tak:

"WYBIERZ f. * Z F, posuw użytkownika, użytkownik_feeds uf WHERE (f.id = uf.feed_id i uf.user_id w (SELECT podążał tam gdzie follower = id)) ORDER BY created_at DESC "

Oczywiście podkwerenda nie jest właściwa, jak to napisałem, ale to powinno dać ci ogólny pomysł.

+0

Tak. Dzięki, myślę, że to zrobię. –

0

Użyj skorelowanej pod-zapytania. Jeśli masz tabelę, która zawiera użytkowników, którzy śledzą twój tekst, tekst nie wzrośnie.

Na przykład:

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

Choć nie ma (real) limit długości ciągu zapytania, istnieje ograniczenie dotyczące liczby IN (X, Y, Z ...) klauzul : 10000, konfigurowalne w postgres.ini akt:

Patrz: http://grokbase.com/t/postgresql/pgsql-general/061mc7pxg6/what-is-the-maximum-length-of-an-in-a-b-c-d-list-in-postgresql "w 7.4, a wcześniej to zależy od ustawienia max_expr_depth"

... "W wersji 8.0 i nowszych maksymalna liczba_wybrań jest zniknięta, a limit zależy od max_stack_depth."

Powiązane problemy