2017-01-03 3 views
0

Ich bin ein bisschen verwirrt über die Berechnung der maximal möglichen Größe eines Datensatzes in SQL Server. Ich erhalte diese Störung, wenn ich eine int-Spalte eine Tabelle in der Anwendung hinzufügen, arbeite ich an (eine Tabelle ich nicht erstellen/das ist neu für mich):Max Rekordgröße

Warning: The table "myTable" has been created, but its maximum row size exceeds the allowed maximum of 8060 bytes. INSERT or UPDATE to this table will fail if the resulting row exceeds the size limit. 

Ich habe versucht, die Methoden vorgeschlagen here um herauszufinden, was die maximale Datensatzgröße in meinem Tisch, aber sie bekommen sehr unterschiedliche Ergebnisse:

1)

SELECT sum(max_record_size_in_bytes) as maxSizeSum 
FROM sys.dm_db_index_physical_stats (DB_ID(N'MyDb'), OBJECT_ID(N'[dbo].[myTable]'), NULL, NULL , 'DETAILED') 

das gibt 5712 als maxSizeSum, also, wenn dieses Recht dann ist die Fehler, den ich bekomme ein Feld hinzufügen würde falsch sein ...

2)

dbcc showcontig ('myTable') with tableresults 

Dies wird 3976, das der Kommentar in der Post gegeben, die er misst nur die aktuellen Daten nicht überraschend ist, nicht möglich, Daten

3)

SELECT OBJECT_NAME (id) tablename 
, COUNT (1)  nr_columns 
, SUM (length)  maxrowlength 
FROM syscolumns 
GROUP BY OBJECT_NAME (id) 
ORDER BY OBJECT_NAME (id) 

Die für myTable zurückgegebene Zeile hat eine maximale Zeilenlänge von 52498. Ich denke, das ist möglich, aber WAAAAY liegt über der zulässigen Länge und den anderen Messmethoden.

4) This post hat eine andere Methode, die auch 52498 bekommt, also bin ich Neigung zu denken, das ist die ‚echte‘ Antwort, aber eine Bestätigung angesichts der Meinungsverschiedenheiten bin der Hoffnung:

Select schema_name(T.schema_id) As SchemaName, 
     T.Name As TableName, 
     Sum(C.max_length) As RowSize 
From sys.tables T 
     Inner Join sys.columns C 
      ON T.object_id = C.Object_ID 
     INNER JOIN sys.types S 
      On C.system_type_id = S.system_type_Id 
    Where T.Name = 'myTable' 
Group By schema_name(T.schema_id), 
     T.Name 
Order By schema_name(T.schema_id), 
     T.Name 

I don Ich habe keine Nvarchar-Felder in meiner Datenbank, das ist also kein Problem für mich. Sind die letzten 2 Methoden richtig und die anderen falsch?

Vielen Dank !!

+0

aber Sie erhalten keinen Fehler, nur eine Warnung – Lamak

+0

Warum veröffentlichen Sie die Tabellendefinition nicht irgendwo? Die Zeilengröße ist größer als * nur * die mögliche Länge jeder Spalte. Jede Zeile hat einen Overhead für NULL-Bitmaps, Längen variabler Datentypen usw. Das erklärt nicht 52498, aber ohne die Tabellendefinition zu sehen, können wir nur raten. –

+0

Danke! Leider ist die spezifische Tabelle vertraulich, daher kann ich sie nicht posten. Ich hatte gehofft, dass es generische Erklärungen geben würde, die für alle Tabellen gelten würden - Geräusche von dem, was Sie sagen, wie NULL-Bitmaps und die variablen Datentypen beeinflussen das, aber ich würde hoffen, dass es eine begrenzte Anzahl solcher Dinge für die Daten geben würde Typen und Werte, die SqlServer unterstützt. Wollen Sie sagen, dass es keine Formel/Abfrage gibt, die generisch (d. H. Für alle Tabellendefinitionen gilt) die maximale Zeilenlänge einer Zeile für eine beliebige SQL Server-Tabelle basierend auf Abfragen berechnet, die auf die Metadaten dieser Tabelle zugreifen? – user756366

Antwort

0

Der Kommentar ist am aussagekräftigsten.

Sie sind nicht überschreiten die maximale Datensatzgröße. Ihre Tabelle könnte überschreiten die maximale Datensatzgröße, angesichts der Definitionen der Spalten.

Wie Sie gezeigt haben, die tatsächliche Datengröße zu betrachten, scheint Ihre Operation sicher - vorläufig.

+0

Danke - ja, ich verstehe, dass ich derzeit keine Daten in meiner Tabelle auf meinem lokalen Computer habe, die die maximale Zeilengröße überschreiten, aber die App ist eine gehostete für Clients, sodass jeder unserer Clients diese maximale Zeile überschreiten könnte Größe zu jeder Zeit - daher möchte ich verstehen, wie zu bestimmen, ob die Tabellendefinition Clients ermöglicht, die mögliche Zeilengröße zu überschreiten, und um wie viel. – user756366