Avete mai incontrato una query di SQL Server non è in esecuzione perché fa riferimento troppe tabelle?

StackOverflow https://stackoverflow.com/questions/2432

Domanda

Avete mai visto c'messaggi di errore?

-- SQL Server 2000

Impossibile allocare la tabella ausiliaria per la visione o la funzione di risoluzione.
Il numero massimo di tabelle in una query (256) è stato superato.

-- SQL Server 2005

Troppi nomi di tabella nella query.Il numero massimo consentito è di 256.

Se sì, che cosa hai fatto?

Rinunciato?Convinto i clienti a semplificare le loro richieste?Denormalizzato il database?


@(tutti vogliono me per postare la query):

  1. Io non sono sicuro se posso incollare 70 kb di codice nella risposta finestra di modifica.
  2. Anche se non ho questo questo non aiuta dal momento che questo 70 kb di codice di riferimento 20 o 30 vista che vorrei anche post in quanto, altrimenti, il codice sarà priva di significato.

Non voglio suonare come sto vantando, ma qui il problema non è nella query.Le query sono ottimali (o almeno quasi ottimale).Ho trascorso innumerevoli ore la loro ottimizzazione, alla ricerca di ogni colonna e di ogni singola tabella, che può essere rimosso.Immaginare un rapporto che è di 200 o 300 colonne che deve essere riempito con una singola istruzione SELECT (perché è così che è stato progettato un paio di anni fa, quando era ancora un piccolo report).

È stato utile?

Soluzione

Per SQL Server 2005, mi consiglia di utilizzare le variabili di tabella e parzialmente edificio i dati, come si va.

Per fare questo, creare una variabile di tabella che rappresenta il risultato finale di set che si desidera inviare all'utente.

Trova la tua tabella primaria (dire che la tabella ordini nel tuo esempio sopra) e di estrarre i dati, oltre a un po ' di dati supplementari che è solo dire una join di distanza (nome del cliente, il nome del prodotto).Si può fare una SELECT INTO a mettere questo direttamente nella tua variabile di tabella.

Da lì, scorrere la tabella e per ogni riga, fare un mucchio di piccoli SELEZIONARE la query che recupera tutti i dati supplementari di cui avete bisogno per il vostro set di risultati.L'inserimento di questi in ogni colonna, come si va.

Una volta completato, è possibile quindi fare una semplice SELECT * from tabella variabile e restituire questo set di risultati all'utente.

Non ho i numeri di duro per questo, ma ci sono stati distinti tre casi che ho lavorato dove fare queste query più piccole, in realtà, ha lavorato più veloce di fare una massiccia query di selezione con un mazzo di join.

Altri suggerimenti

Non ho mai incontrato questo tipo di situazione, e ad essere onesti l'idea di riferimento > 256 tabelle in una query fils me, con un terrore mortale.

La prima domanda dovrebbe probabilmente il "Perché così tanti?", seguita da "ciò che i bit di informazione che faccio NON bisogno?" Sarei preoccupato che la quantità di dati restituiti da una query di questo tipo avrebbe cominciato ad avere un impatto sulle prestazioni dell'applicazione abbastanza gravemente, troppo.

@chopeen Si potrebbe modificare il modo in cui si sta calcolare queste statistiche, e invece di tenere una tabella separata di tutti per prodotto stats..quando viene effettuato un ordine, loop attraverso i prodotti e aggiornare la documentazione appropriata nella tabella delle statistiche.Questo sarebbe spostare un sacco di calcolo del carico per la pagina di checkout, piuttosto che tutto in una enorme query quando si esegue un report.Naturalmente ci sono alcune statistiche che non vanno a lavoro e in questo modo, ad es.la gestione dei clienti' prossimo acquisto, dopo l'acquisto di un particolare prodotto.

Questo accade tutto il tempo durante la scrittura di Report di Reporting Services per Dynamics CRM impianti in esecuzione in SQL Server 2000.CRM ha un ben dati normalizzati schema che si traduce in un sacco di join.In realtà c'è un aggiornamento rapido (hotfix) in giro che il limite da 256 a un enorme 260: http://support.microsoft.com/kb/818406 (abbiamo sempre pensato che questo è un grande scherzo da parte del team di SQL Server).

La soluzione, come Dillie-O aludes, è quello di individuare le "sub-" join (preferibilmente quelle che sono utilizzati più volte) e fattore di li temp-le variabili di tabella che si utilizza quindi in join.Si tratta di una importante PIA e spesso uccide le prestazioni.Mi dispiace per voi.

@Kevin, l'amore che tee -- dice tutto :-).

Mi piacerebbe vedere la query, ma immagino che ci sia qualche problema con qualche tipo di iteratore, e mentre io non riesco a pensare a tutte le situazioni dove non è possibile, scommetto che è da un brutto mentre/caso/cursore o una tonnellata di poco implementato vista.

Post query :D

Anche io mi sento come uno dei possibili problemi che potrebbe essere avere un sacco (letto 200+) di nome/valore di tabelle che potrebbe condensato in un'unica tabella di ricerca.

Ho avuto questo stesso problema...la mia macchina di sviluppo è in esecuzione SQL Server 2008 (la vista ha funzionato bene), ma sulla produzione (con SQL Server 2005) la vista non.Ho finito per la creazione di viste per evitare questa limitazione, utilizzando il nuovo vista come parte della query in visualizzazione che ha generato l'errore.

Tipo di sciocco, considerando la logica di esecuzione è la stessa...

Avuto lo stesso problema in SQL Server 2005, che ha lavorato nel 2008), quando ho voluto creare una vista.Ho risolto il problema con la creazione di una stored procedure, invece di vista.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top