Wyciągnięcie dużej ilości danych jednym zapytaniem SQL

Droga Listo !
Tworzę skrypt konfigurujący jednocześnie kilkanaście parametrów w każdej pętli. W związku z tym zbudowałem bardzo duze zapytanie SQL wyciągające jednocześnie wszystkie parametry. Działa skutecznie lecz wolno, czemu nie można się dziwić widząc liczbę dodatkowych pętli. Nie znam sie na SQL wystarczająco żeby zoptymalizować je. Czy może mi ktos podpowiedzieć?
LMS : 11.8 MySQL : 5.0.77
Zapytanie :
SELECT nodes.ownerid as owner_id, customers.lastname as owner_name , nodes.id as node_id, nodes.name as node_name , inet_ntoa(nodes.ipaddr) as lan_ip, (SELECT bit_count(inet_aton(networks.mask)) from networks,nodes where ((inet_aton(networks.mask) & nodes.ipaddr) = networks.address and nodes.id = node_id)) as lan_mask, (SELECT networks.interface from networks,nodes where ((inet_aton(networks.mask) & nodes.ipaddr) = networks.address) and nodes.id = node_id) as lan_interface, inet_ntoa(nodes.ipaddr_pub) as wan_ip, (SELECT bit_count(inet_aton(networks.mask)) from networks,nodes where ((inet_aton(networks.mask) & nodes.ipaddr_pub) = networks.address and nodes.id = node_id)) as wan_mask, (SELECT networks.interface from networks,nodes where ((inet_aton(networks.mask) & nodes.ipaddr_pub) = networks.address) and nodes.id = node_id) as wan_interface, nodes.mac as mac, nodes.chkmac as check_mac, (SELECT SUM( uprate ) from tariffs,assignments,nodeassignments where assignments.tariffid = tariffs.id and assignments.customerid = owner_id AND assignments.id != nodeassignments.assignmentid ) as owner_up_limit, (SELECT SUM( upceil ) from tariffs,assignments,nodeassignments where assignments.tariffid = tariffs.id and assignments.customerid = owner_id AND assignments.id != nodeassignments.assignmentid ) as owner_max_up_limit, (SELECT SUM( downrate ) from tariffs,assignments,nodeassignments where assignments.tariffid = tariffs.id and assignments.customerid = owner_id AND assignments.id != nodeassignments.assignmentid ) as owner_down_limit, (SELECT SUM( downceil ) from tariffs,assignments,nodeassignments where assignments.tariffid = tariffs.id and assignments.customerid = owner_id AND assignments.id != nodeassignments.assignmentid ) as owner_max_down_limit, (SELECT SUM( quota_www_limit ) from tariffs,assignments,nodeassignments where assignments.tariffid = tariffs.id and assignments.customerid = owner_id AND assignments.id != nodeassignments.assignmentid ) as owner_burst_threshold, (SELECT SUM( quota_sql_limit ) from tariffs,assignments,nodeassignments where assignments.tariffid = tariffs.id and assignments.customerid = owner_id AND assignments.id != nodeassignments.assignmentid ) as owner_burst_limit, (SELECT SUM( quota_ftp_limit ) from tariffs,assignments,nodeassignments where assignments.tariffid = tariffs.id and assignments.customerid = owner_id AND assignments.id != nodeassignments.assignmentid ) as owner_burst_time, (SELECT SUM( uprate ) from tariffs,assignments,nodeassignments where assignments.tariffid = tariffs.id and nodeassignments.nodeid = node_id AND assignments.id = nodeassignments.assignmentid ) as node_up_limit, (SELECT SUM( upceil ) from tariffs,assignments,nodeassignments where assignments.tariffid = tariffs.id and nodeassignments.nodeid = node_id AND assignments.id = nodeassignments.assignmentid ) as node_max_up_limit, (SELECT SUM( downrate ) from tariffs,assignments,nodeassignments where assignments.tariffid = tariffs.id and nodeassignments.nodeid = node_id AND assignments.id = nodeassignments.assignmentid ) as node_down_limit, (SELECT SUM( downceil ) from tariffs,assignments,nodeassignments where assignments.tariffid = tariffs.id and nodeassignments.nodeid = node_id AND assignments.id = nodeassignments.assignmentid ) as node_max_down_limit, (SELECT SUM( quota_www_limit ) from tariffs,assignments,nodeassignments where assignments.tariffid = tariffs.id and nodeassignments.nodeid = node_id AND assignments.id = nodeassignments.assignmentid ) as node_burst_threshold, (SELECT SUM( quota_sql_limit ) from tariffs,assignments,nodeassignments where assignments.tariffid = tariffs.id and nodeassignments.nodeid = node_id AND assignments.id = nodeassignments.assignmentid ) as node_burst_limit, (SELECT SUM( quota_ftp_limit ) from tariffs,assignments,nodeassignments where assignments.tariffid = tariffs.id and nodeassignments.nodeid = node_id AND assignments.id = nodeassignments.assignmentid ) as node_burst_time FROM nodes, customers where nodes.ownerid = customers.id and nodes.access = 1 order by owner_id

Szymon Kajewski wrote:
Droga Listo !
Coś w ten deseń: ;)
SELECT nodes.ownerid as owner_id, customers.lastname as owner_name , nodes.id as node_id, nodes.name as node_name , nodes.mac as mac, nodes.chkmac as check_mac, inet_ntoa(nodes.ipaddr) as lan_ip, t1.owner_up_limit, t1.owner_max_up_limit, t1.owner_down_limit, t1.owner_max_down_limit, t1.owner_burst_threshold, t1.owner_burst_limit, t1.owner_burst_time, t2.node_up_limit, t2.node_max_up_limit, t2.node_down_limit, t2.node_max_down_limit, t2.node_burst_threshold, t2.node_burst_limit, t2.node_burst_time, bit_count(inet_aton(n1.mask)) AS lan_mask, n1.interface AS wan_ip, bit_count(inet_aton(n2.mask)) AS wan_mask, n2.interface AS wan_interface FROM nodes JOIN customers ON (customers.id = nodes.ownerid) LEFT JOIN ( SELECT customerid, SUM( uprate ) AS owner_up_limit, SUM( upceil ) AS owner_max_up_limit, SUM( downrate ) AS owner_down_limit, SUM( downceil ) AS owner_max_down_limit, SUM( quota_www_limit ) AS owner_burst_threshold, SUM( quota_sql_limit ) AS owner_burst_limit, SUM( quota_ftp_limit ) AS owner_burst_time FROM tariffs,assignments WHERE assignments.tariffid = tariffs.id GROUP BY customerid ) t1 ON (t1.customerid = nodes.ownerid) LEFT JOIN ( SELECT nodeid, SUM( uprate ) AS node_up_limit, SUM( upceil ) AS node_max_up_limit, SUM( downrate ) AS node_down_limit, SUM( downceil ) AS node_max_down_limit, SUM( quota_www_limit ) AS node_burst_threshold, SUM( quota_sql_limit ) AS node_burst_limit, SUM( quota_ftp_limit ) AS node_burst_time FROM tariffs,assignments,nodeassignments WHERE assignments.tariffid = tariffs.id AND assignments.id = nodeassignments.assignmentid GROUP BY nodeid ) t2 ON (t2.nodeid = nodes.id) JOIN networks n1 ON ((inet_aton(n1.mask) & nodes.ipaddr) = n1.address) LEFT JOIN networks n2 ON ((inet_aton(n2.mask) & nodes.ipaddr_pub) = n2.address) WHERE nodes.access = 1 ORDER BY ownerid

Dnia 16 października 2009 9:10 "A.L.E.C" alec@alec.pl napisał(a):
Szymon Kajewski wrote:
Droga Listo !
Coś w ten deseń: ;)
[ciach]
Niestety takie zapytanie nie działa prawidłowo w przypadku gdy jest przypisana taryfa zarówno dla użytkownika, jak i dla komputera. W tym momencie wszystkie komputery uzytkownika mają zwiększona przepustowość o wielkośc taryfy dedykowanej konkretnemu komputerowi(komputerom). Przy okazji, przypomniało mi się: że zapomniałem o wpisaniu jednego warunku:
"(datefrom <= UNIX_TIMESTAMP() OR datefrom = 0) AND (dateto > UNIX_TIMESTAMP() OR dateto = 0)"

[ciach]
Niestety takie zapytanie nie działa prawidłowo w przypadku gdy jest przypisana taryfa zarówno dla użytkownika, jak i dla komputera. W tym momencie wszystkie komputery uzytkownika mają zwiększona przepustowość o wielkośc taryfy dedykowanej konkretnemu komputerowi(komputerom). Przy okazji, przypomniało mi się: że zapomniałem o wpisaniu jednego warunku:
"(datefrom <= UNIX_TIMESTAMP() OR datefrom = 0) AND (dateto > UNIX_TIMESTAMP() OR dateto = 0)"
[ciach]
Przepraszam, byłem niewyspany i nie potrafiłem się odnaleść w tamtym zapytaniu. Oczywiście po mikroskopijnych zmianach działa pięknie. Pytanie tylko czy będzie kompatybilne również z postgres-em? Pomijając fragment UNIX_TIMESTAMP() oczywiście).

Szymon Kajewski wrote:
Pytanie tylko czy będzie kompatybilne również z postgres-em? Pomijając fragment UNIX_TIMESTAMP() oczywiście).
Powinno działać tylko bit_count() zamień na LMSową funkcję mask2prefix() (dostępna w lms-1.11).

Coś w ten deseń: ;)
[ciach]
Może w ramach wyjaśnienia dlaczego potrzebuje rozdzielonego transferu dla uzytkownika i dla komputera.
Routing mamy zrobiony na mikrotiku RB1000 i podziałem pasma zajmuje sie QueueTree. Każdy uzytkownik ma dwie wydzielone kolejki główne (UP_Main,DOWN_Main) bez ograniczenia pasma, podrzędne interfejsom do których klient jest podpiety. Poniżej znajdują sie kolejki klienta z ograniczanym wspólnym pasmem (UP_common,DOWN_common), do których podpięte są równorzędne kolejki poszczególnych komputerów nie posiadających osobnych ustawień pasma. Natomiast komputery posiadające takie ustawienia mają kolejki równorzędne do *_common. Tym sposobem całkowity transfer klienta jest widoczny w jego kolejce głównej, a kontrola pasma działa zgodnie z założeniem.
uczestnicy (2)
-
A.L.E.C
-
Szymon Kajewski