Le dimensioni di varchar sono importanti nelle tabelle temporanee?


16

C'è un dibattito sul lavoro di mia moglie sul solo utilizzo varchar(255)di tutti i varcharcampi nelle tabelle temporanee nelle procedure memorizzate. Fondamentalmente, un campo vuole usare 255 perché funzionerà sempre anche se la definizione cambia, e l'altro campo vuole attenersi alle dimensioni nelle tabelle di origine per potenziali miglioramenti delle prestazioni.

Il campo di esibizione è giusto? Ci sono altre implicazioni? Stanno usando SQL Server.


Direi che forse non hai bisogno di tabelle temporanee in primo luogo. A cosa servono? Se sono necessari, a cosa servono queste colonne specifiche? Sono utilizzati in join o confronti di qualsiasi tipo? Le colonne sottostanti sono nvarchar e non varchar?
Aaron Bertrand

@AaronBertrand Le tabelle temporanee sono lì per la modularità. I dati vengono trasformati e popolati più volte in base alle regole aziendali che possono cambiare. Penso che ce ne siano anche alcuni MAX()nel mix.
Brian Nickel

Risposte:


6

A seconda di come si utilizzano le tabelle temporanee, è possibile che si verifichi un problema di troncamento dei dati.

Questo esempio è un po 'inventato, ma illustra il mio punto. Esempio:

  1. La colonna della tabella utente è varchar (50).
  2. La colonna della tabella temporanea è varchar (255).
  3. Hai un record con 45 caratteri in quella colonna nella tua tabella utente.
  4. Nella tua procedura, concateni '- per la vincita' alla fine di quella colonna, prima di unire quella tabella temporanea nella tua tabella utente.

La tabella temporanea accetterebbe volentieri il nuovo valore varchar con una lunghezza di 59. Tuttavia, la tabella utente non potrebbe. A seconda di come lo gestisci nella tua procedura, ciò potrebbe comportare il troncamento o un errore.

A meno che non si documentino e si tengano conto di questi problemi, la procedura potrebbe essere eseguita in modo imprevisto.

Personalmente, non credo che ci sia una risposta a questa domanda che sia corretta al 100% delle volte. Dipende davvero da come stai usando quelle tabelle temporanee.

Spero che sia di aiuto


0

utilizzando varchar(255)per tutti i varcharcampi nelle tabelle temporanee nelle stored procedure.

Mi spingerei verso l'uso della lunghezza effettiva del campo.

Ho letto di recente che MySQL (suppongo che SQL Server sia simile) le tabelle temporanee allocano memoria sufficiente per memorizzare la lunghezza massima possibile per ogni varcharcolonna ... Un approccio sistematico all'allocazione del 200% -500% della memoria richiesta per i varcharcampi in tutto le procedure memorizzate sembrano un richiamo non necessario alle risorse di sistema. Se si utilizza mai una quantità significativa di memoria durante la creazione di queste tabelle temporanee, è possibile che si richieda inutilmente memoria utilizzata per la memorizzazione nella cache, creando ulteriore lavoro per il server in futuro, anche dopo aver completato le procedure di archiviazione.

Modifica: vedi la risposta di Bill Karwin: /programming/1962310/importance-of-varchar-length-in-mysql-table


2
Supponendo che SQL Server sia simile? Non vorrei ...
AK,

Scusa, mi rendo conto che la mia risposta è incompleta. Ciò che intendo è che vorrei sbagliare dal lato della cautela (cioè non apportare una modifica che potrebbe influire negativamente sulle prestazioni) a meno che tale presupposto non sia accertato come errato.
Matt,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.