Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 17 su 17
  1. #11
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469

    Re: Si passa all'azione

    Originariamente inviato da Raccoon29
    mentre la lista delle chiamate è dell'ordine dei milioni. Ora non so se questa pure può essere considerata piccola, ma i tempi di risposta al momento mi stanno creando non pochi problemi
    metti un DESCRIBE delle tabelle, e magari pure le query che vuoi effettuare

  2. #12

    Re: Si passa all'azione

    Originariamente inviato da Raccoon29
    ehm, i link sono identici
    impariamo ad usare google (se non sai cercare stai fresco )?

    http://dev.mysql.com/doc/refman/5.0/...l-indexes.html

    Originariamente inviato da Raccoon29
    ma i tempi di risposta al momento mi stanno creando non pochi problemi
    li hai messi gli indici?

  3. #13

    Yes sir!

    Come gentilmente, pacatamente e civilmente richiesto sono a postarvi quanto gentilmente, pacatamente e civilmente richiesto:

    DESCRIBE della lista chiamate (cdr_details):

    codice:
    +-------------+-------------+------+-----+---------+----------------+
    | Field       | Type        | Null | Key | Default | Extra          |
    +-------------+-------------+------+-----+---------+----------------+
    | id          | int(11)     | NO   | PRI | NULL    | auto_increment |
    | id_cdr      | int(11)     | YES  |     | NULL    |                |
    | dialer      | varchar(30) | YES  | MUL | NULL    |                |
    | date        | date        | YES  |     | NULL    |                |
    | hour        | time        | YES  |     | NULL    |                |
    | seconds     | int(11)     | YES  |     | NULL    |                |
    | tot_cost    | double      | YES  |     | NULL    |                |
    | dialed      | varchar(30) | YES  |     | NULL    |                |
    | type        | int(11)     | YES  |     | NULL    |                |
    | destination | varchar(80) | YES  |     | NULL    |                |
    | cost        | double      | YES  |     | NULL    |                |
    +-------------+-------------+------+-----+---------+----------------+
    DESCRIBE della lista dei numeri delle utenze (customer_dials)

    codice:
    +--------------+-------------+------+-----+------------+----------------+
    | Field        | Type        | Null | Key | Default    | Extra          |
    +--------------+-------------+------+-----+------------+----------------+
    | id           | int(11)     | NO   | PRI | NULL       | auto_increment |
    | dial         | varchar(20) | YES  | MUL | NULL       |                |
    | id_customer  | int(11)     | YES  |     | NULL       |                |
    | voip         | int(11)     | YES  |     | NULL       |                |
    | valid_from   | date        | YES  |     | 0000-00-00 |                |
    | valid_to     | date        | YES  |     | 0000-00-00 |                |
    | id_migration | int(11)     | YES  |     | 0          |                |
    | naked        | int(11)     | YES  |     | 0          |                |
    +--------------+-------------+------+-----+------------+----------------+
    DESCRIBE della lista dei costi delle chiamate (calls_prices)

    codice:
    +------------+---------+------+-----+---------+----------------+
    | Field      | Type    | Null | Key | Default | Extra          |
    +------------+---------+------+-----+---------+----------------+
    | id         | int(11) | NO   | PRI | NULL    | auto_increment |
    | id_call    | int(11) | YES  | MUL | NULL    |                |
    | id_invoice | int(11) | YES  |     | NULL    |                |
    | price      | double  | YES  |     | NULL    |                |
    +------------+---------+------+-----+---------+----------------+
    La logica è terribilmente semplice: ad ogni chiamata corrisponde un "id_call" col prezzo e e il "dialer" è il numero chiamante che è uno di quelli in "dial".

    Tipo la query che farei per avere la lista del totale dei costi delle chiamate divise per numero e tipologia di direttrice (urbana, interurbana, cellulare ecc.) è la seguente:
    codice:
    SELECT d.dial,SUM(p.price),c.type FROM customer_dials d,calls_prices p,cdr_details c
    WHERE d.dial=c.dialer AND c.id=p.id_call AND
    c.date BETWEEN '2011-01-01' AND '2011-01-31' group by d.dial,c.type
    e per eseguire ottenendo 1937 righe ha impiegato qualcosa come 33 minuti

    Info sulle tabelle:
    cdr_details: 855124 righe
    customer_dials: 794 righe
    calls_prices: 861084

    l'unica cosa che vi chiedo nelle eventuali repliche è di risparmiarmi i parenti

    PS: sì lo so, ho detto "dell'ordine dei milioni" e la tabella ne ha solo 850 mila, il fatto è che le chiamate si aggiungono ogni mese e sempre di più (esponenzialmente), quindi comunque ai milioni presto o tardi ci si arriva.
    "La mia vita finirà quando non vedrò più la gente ridere.... non necessariamente alle mie battute."

  4. #14
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    ahem... è totalmente diversa da come l'avrei fatta

    1) denormalizza
    2) indicizza su data, tipo e dial

    fine del problema

    per applicazioni "sborrone" codifica dial col CRC32; per applicazioni davvero sborrone, nell'ipotesi che sia SOLO quella la query che fai (ossia con suddivisione per intervallo di date) puoi partizionare. Ma lo ritengo superfluo.

    mi aspetto tempi di esecuzione dell'ordine di pochi secondi

  5. #15

    Oooooo...

    franzauker sono rimasto ammaliato dalla tua competenza...ma non c'ho capito un tubo.

    No cioé, col denormalizzare immagino intendi di mettere il prezzo direttamente nella lista delle chiamate (o no?), la sborronata del crc32 non so che razza di bestia sia ma penso che mi informerò presto in tal senso , mentre se bastano un paio di indici in più per rendere la ricerca velocissima, allora perché - per assurdo - non si mette un indice per ogni attributo?

    PS: quel dannato libro di Amazon l'ho ordinato 5 giorni fa e ancora nessuna traccia (vabé che c'è stato ferragosto di mezzo...)
    "La mia vita finirà quando non vedrò più la gente ridere.... non necessariamente alle mie battute."

  6. #16
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    1) non c'è motivo di avere 3 tabelle diverse.
    Te ne basta una che mantiene le telefonate, e i relativi costi, su cui metterai indici su tutte le clausule usate nella WHERE (le date) e nelle group by

    2) dal momento che memorizzi i numeri sotto forma di stringa puoi adottare una tecnica di godelizzazione, o se preferisci di codifica delle stringhe in numeri. quella normalmente usata è la banale CRC32.
    Supponiamo di avere un campo "nome" VARCHAR(..)
    fare un indice su nome si può ovviamente fare, essendo stringa non è efficientissimo, puoi aggiungere un campo
    nomecrc32 nel quale scriverai il CRC32('dato-che-vuoi-inserire'), con indice ovviamente su nomecrc32.

    invece di mettere nome='pippo' metterai (nomecrc32=CRC32('pippo')) AND (nome='pippo')

  7. #17

    O.O

    Ecco questa è una figata mostruosa
    "Godelizzazione" non l'avevo proprio mai neanche intrasentito.
    No no, devo assolutamente aggiornarmi, così non può essere!
    franzauker io ti ringrazio tantissimo per avermi spalato la mente, non sembri avvezzo ai social network, ma se abitiamo anche relativamente vicini (100-150km) almeno un caffé te lo offro!
    "La mia vita finirà quando non vedrò più la gente ridere.... non necessariamente alle mie battute."

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.