[ mojeKorIme @ 04.03.2009. 12:12 ] @
kako najoptimalnije napraviti sljedeće
trebam znci, sumu grupe podijeliti sa ukupnom sumom.. dole je primjer jednostavnog upita...
u stvarnosti je puno zamrseniji.. pokusao sam i sa pravljenjem funkcija.. ali je presporo

Code:
select sum(broj*koef)/(select sum(broj*koef) from tabela) from tabela 
group by vrsta
[ bogdan.kecman @ 04.03.2009. 12:48 ] @
Code:

mysql> create table t3 (id bigint auto_increment primary key, x int, y int) engine=innodb;
Query OK, 0 rows affected, 2 warnings (0.04 sec)

mysql> insert into t3 (x,y) select x,y from t1;
Query OK, 1250000 rows affected (10.77 sec)
Records: 1250000  Duplicates: 0  Warnings: 0

mysql> update t3 set x = id % 15, y = id % 10;
Query OK, 1250000 rows affected (9.48 sec)
Rows matched: 1250000  Changed: 1250000  Warnings: 0

mysql> SELECT SUM(x)/(SELECT SUM(x) FROM t3) FROM t3 GROUP BY y;
+--------------------------------+
| SUM(x)/(SELECT SUM(x) FROM t3) |
+--------------------------------+
|                         0.0714 | 
|                         0.0857 | 
|                         0.1000 | 
|                         0.1143 | 
|                         0.1286 | 
|                         0.0714 | 
|                         0.0857 | 
|                         0.1000 | 
|                         0.1143 | 
|                         0.1286 | 
+--------------------------------+
10 rows in set (1.13 sec)

mysql> SELECT SUM(x*0.7)/(SELECT SUM(x*0.7) FROM t3) FROM t3 GROUP BY y;
+----------------------------------------+
| SUM(x*0.7)/(SELECT SUM(x*0.7) FROM t3) |
+----------------------------------------+
|                                0.07143 | 
|                                0.08571 | 
|                                0.10000 | 
|                                0.11429 | 
|                                0.12857 | 
|                                0.07143 | 
|                                0.08571 | 
|                                0.10000 | 
|                                0.11429 | 
|                                0.12857 | 
+----------------------------------------+
10 rows in set (1.35 sec)

mysql> set @S = (SELECT SUM(x*0.7) FROM t3);
Query OK, 0 rows affected (0.68 sec)

mysql> select @S;
+-----------+
| @S        |
+-----------+
| 6124986.0 | 
+-----------+
1 row in set (0.00 sec)


mysql> SELECT SUM(x*0.7)/@S FROM t3 GROUP BY y;
+---------------+
| SUM(x*0.7)/@S |
+---------------+
|       0.07143 | 
|       0.08571 | 
|       0.10000 | 
|       0.11429 | 
|       0.12857 | 
|       0.07143 | 
|       0.08571 | 
|       0.10000 | 
|       0.11429 | 
|       0.12857 | 
+---------------+
10 rows in set (1.00 sec)

[ bogdan.kecman @ 04.03.2009. 12:55 ] @
1 sekund na obicnoj desktop masini, na mysql-u optimizovanom za klaster a ne za innodb sa 1M2 slogova ..

ovde ti je najbitniji IO .. citas celu tabelu .. dakle treba tu celu tabelu procitati, sama racunica je tu sitnica ..

nemas sta mnogo da optimizujes u ovakvom upitu osim da onaj subquery izbacis u varijablu pre query-a
[ mojeKorIme @ 04.03.2009. 13:36 ] @
pozdrav bogdane i svaka cast na pomoci..
u pitanju je sto grupiram podatke po vrsti artikla i po odjelu odnosno odsjeku.. ovde mi treba takav upit koji ce za pojedini artikal uzeti sumu za taj odsjek i podjeliti sa ukupnom sumom svih artikala za taj odsjek i tako za sve odsjeke..
ps. culi smo se preko pp-a.. kada ubacim sirovi select .. umjesto one funkcije radi za 5. sec.. sad sam imao potrebu redi izvjestaja ponovo mijenjati upit... i ne znam kako da ga napisem da mi radi relativno brzo;/

jos jednom... puno ti hvala
[ bogdan.kecman @ 04.03.2009. 14:04 ] @
vidi pricamo prilicno napamet ali evo jedna stvar koja ti mozda pomogne http://dev.mysql.com/doc/refma...yntax-prepared-statements.html

Code:

mysql>set @t='mysql.user';
Query OK, 0 rows affected (0,00 sec)

mysql>set @q=CONCAT('select host, user from ', @t, ' where user=\'root\'');
Query OK, 0 rows affected (0,00 sec)

mysql>prepare s1 from @q;
Query OK, 0 rows affected (0,00 sec)
Statement prepared

mysql>execute s1;
+-----------+------+
| host | user |
+-----------+------+
| 127.0.0.1 | root |
| localhost | root |
+-----------+------+

mysql>deallocate prepare s1;
Query OK, 0 rows affected (0,00 sec)


[ bogdan.kecman @ 04.03.2009. 15:17 ] @
pre nego bilo sta menjas (upit ti jeste prekomplikovan sa osnovnim problemom koristenja IF() klauzule) uradi sledece:

1. povecaj innodb_buffer_pool_size na 80% od ukupne kolicine RAM-a koju imas u masini (moras da ugasis mysql regularno, ubijes log file, promenis parametar, upalis mysql)
2. povecaj query_cache na 10M http://dev.mysql.com/doc/refman/5.1/en/query-cache.html

i onda probaj koliko ce sta da traje