Domanda

Sto cercando di cross join due tabelle, i clienti e gli elementi, in modo da poter creare un vendite per cliente di rapporto di voce. Ho 2.000 clienti e 2000 elementi.

SELECT customer_name FROM customers; --Takes 100ms

SELECT item_number FROM items; --Takes 50ms

SELECT customer_name, item_number FROM customers CROSS JOIN items; Takes 200000ms

So che questo è di 4 milioni di righe, ma è possibile ottenere questo a correre più veloce? Voglio unirmi alla fine questo con un tavolo di vendita in questo modo:

SELECT customer_name, item_number, sales_total FROM customers CROSS JOIN items LEFT JOIN sales ON (customer.customer_name = sales.customer_name, item.item_number=sales.item_number);

La tabella delle vendite, ovviamente, non ha tutti i clienti o tutti gli elementi, quindi l'obiettivo è quello di avere un rapporto che mostra tutti i clienti e tutti gli elementi insieme a quello che è stato venduto e non venduto.

sto usando PostgreSQL 8.4

È stato utile?

Soluzione

Per rispondere alla tua domanda:. No, non è possibile fare un cross join più veloce di quello - se si potesse allora sarebbe come CROSS JOIN sarebbe stato implementato

Ma in realtà non si vuole un cross join. Probabilmente si desidera due query separate, una che elenca tutti i clienti, e un altro che elenca tutti gli elementi e anche se non sono stati venduti.

Altri suggerimenti

Questo ha davvero bisogno di essere più report. Mi viene in mente diversi fuori della parte superiore della mia testa che produrrà l'imballaggio più efficiente delle informazioni:

  1. Report:. Conteggio di tutti gli acquisti per cliente / item (ovvio)
  2. Report:. Elenco di tutti gli articoli non acquistati, per cliente
  3. Report:. Sintesi della relazione # 2 (numero di elementi) al fine di dare la priorità che i clienti di concentrarsi su
  4. Report:. Elenco di tutti i clienti che non hanno acquistato un voce per voce
  5. Report:. Sintesi della relazione # 3 (conteggio dei clienti) al fine di identificare sia gli articoli più popolari e impopolari per ulteriori azioni
  6. Report: Elenco di tutti i clienti che hanno acquistato un oggetto in passato, ma non hanno acquistato che il suo periodo di riferimento. Questo rapporto è rilevante solo quando la tabella di vendita ha una data ed i clienti sono tenuti a essere acquirenti regolari (cioè widget usa e getta). Non funziona così per le cose come i contratti di servizio.

Il punto qui è che non si dovrebbe insistere che il processo strumento ogni possibile esito contemporaneamente e generare più dati e nessuno potesse digerire manualmente. Uno dovrebbe coinvolgere gli utenti finali e consumatori di dati su ciò che sono le loro esigenze e su misura l'output per soddisfare tali esigenze. Renderà la vita di entrambe le parti molto più facile nel lungo periodo.

Non riesco a immaginare che ci sarà una soluzione di terze parti per questo, i programmatori PostgreSQL conoscono il loro sistema migliore e sarà pesantemente ottimizzarlo.

Se si desidera visualizzare tutti gli elementi per un dato cliente (anche se il ciente non contiene elementi), avrei preferito provare

SELECT c.customer_name, i.item_number, s.sales_total
FROM customers c LEFT JOIN 
    sales s ON c.customer_name = s.customer_name LEFT OIN
    items i on i.item_number=s.item_number

Questo dovrebbe dare un elenco di tutti i clienti, e tutti gli elementi uniti da vendite.

Forse si vuole qualcosa di simile?

select c.customer_name, i.item_number, count( s.customer_name ) as total_sales
from customers c full join sales s on s.customer_name = c.customer_name
full join items i on i.item_number = s.item_number
group by c.customer_name, i.item_number
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top