Artikel-ID: 198625 - Geändert am: Freitag, 21. November 2003 - Version: 3.1

Info: Vergleich mit Zahlen, Integer und andere optimieren

SystemtippDieser Artikel bezieht sich auf ein anderes Betriebssystem als das von Ihnen verwendete. Für Sie möglicherweise nicht relevante Artikelinhalte wurden deaktiviert.
Alles erweitern | Alles schließen

Zusammenfassung

Daten-Typ-Optimierung mit Datentypen Numeric, Decimal und Integer einige sehr strengen Regeln verwenden. Dieser Artikel erläutert und erklärt die Bedingungen und Einschränkungen, die der Abfrageoptimierer, verwendet um exakten numerischen Daten geben Vergleiche durchzuführen. Überprüfen Sie im folgenden Abschnitt zum besseren Verständnis der Begriffe und Konzepte in diesem Artikel verwendet.

" Genauigkeit " ist die Anzahl von Ziffern in eine Zahl. " Skalierung " ist die Anzahl der Ziffern rechts vom Dezimalzeichen in eine Zahl. Die Zahl 123,45 hat beispielsweise eine Genauigkeit von 5 und einen Maßstab von 2.

Aufgrund von Beschränkungen mit der binäre Zahlensystem von Computern verwendet wird kann nicht einfach einige Dezimalbrüche genau dargestellt werden. Dezimalbruch 0,1 müssen z. B. keine genaue binäre Darstellung. Es kann nur Potenzreihenentwicklung angenähert werden. Es ist daher unverankerten zeigen- und Real Typen ungefähre gelten Datenwerte; während Integer, numeric, und decimal-Datentypen werden als genaue Datentypen behandelt.

Die Begriffe " strict " oder " genau " werden in Ihrer Definition rechnerische bezeichnet. Beispielsweise wird eine numeric(10,1) nicht genau oder ausschließlich mit einer numeric(10,2) vergleichen selbst wenn die beteiligten Zahlen mathematisch äquivalent sind. Wert ein 10.1 und 10.10 sind mathematisch, genau die gleichen. Allerdings werden aufgrund von den Unterschied zwischen skalieren Sie nicht als rechnerisch genaue Übereinstimmung behandelt.

Weitere Informationen

Um der Optimierer Vergleichs Entscheidungen zu verstehen, müssen Sie zuerst die Möglichkeit, eingehende verstehen, Daten analysiert und behandelt werden.
  • Wenn der SQL Server einen Wert von 10 oder weniger Ziffern Positionen ohne ein Dezimaltrennzeichen empfängt, wird der Wert als einen ganzzahligen Datentyp behandelt.
  • Wenn der SQL Server einen Wert von 11 oder mehr Ziffern Positionen empfängt, wird es als ein exakter Datentyp (Decimal oder Numeric) behandelt.
  • Wenn der SQL Server einen Wert mit einem Dezimalpunkt empfängt, wird es als ein exakter Datentyp behandelt.
  • Numeric und Decimal (8,0) oder kleinere Werte, die nicht dezimale Positionen benötigen können durch eine ganze Zahl dargestellt werden. Immer ein strenger Vergleich in einem Numeric oder Decimal ausgeführt (d. h., (8,0) (7,0), (6,0), usw.), der ganzzahlige Wert wird immer als ein genauer betrachtet.
Genaue Datentypen ist "strict" Vergleich erforderlich. Im Gegensatz zu einem Float oder real-Datentyp ist Rundung nicht akzeptabel um die Integrität der Datentyp und zugeordneten Vergleiche zu verwalten.

Der Abfrageoptimierer macht eine Auswahl, wenn er beschließt, den Plan beenden: ist das eingehende Argument mehr oder weniger präzise als Definition der Tabelle?

Wenn der Argumentwert genauer als die Spaltendaten ist, müssen die Spaltendaten an die Argument-Genauigkeit und Skalierung einrichten. Dies erfordert die Umwandlung von Daten in der Spalte und Pläne als Tabellenscans enthalten zu kann.

Wenn der Argumentwert weniger genau als die Spaltendaten ist, kann das Argument an die Genauigkeit und Dezimalstellen der Spalte heraufgestuft werden. Dies führt i. d. r. einen Plan, der einen Index oder direktere Ansatz für die Daten abrufen Aufwand verwenden können.

Zum besseren Verständnis dieses Konzepts werden einige Beispiele für unter angegeben.

Beispiel 1
create table tblTest( a numeric(8,0) PRIMARY KEY, b int)
select * from tblTest where a = 123
				
Regeln verweisen wieder auf die Analyse, die 123 ist weniger als 10 Ziffern ist und keine Dezimaltrennzeichen. Aus diesem Grund:
  • Das eingehende Argument gilt einen ganzzahliger Wert.
  • Die Spaltendefinition ist (8,0) oder weniger, also die ganze Zahl gilt einen genaueres Datentyp. Daher muss die Konvertierung für die Datenspalte angewendet werden und eine kleiner als optimale Plan kann ausgewählt werden.
Beispiel 2
create table tblTest( a numeric(10,0) PRIMARY KEY, b int)
select * from tblTest where a = 123.
				
  • Das eingehende Argument ein Dezimaltrennzeichen enthält und keine decimal Positionen werden in der WHERE-Klausel dargestellt, so dass das Argument als genaue Datentyp Decimal oder Numeric (n, 0) angezeigt wird.
  • Die Spaltendefinition ist (10,0), sodass das Argument heraufgestuft und genau verglichen werden kann. Dies führt i. d. r. einen Abfrageplan, der eine direkte Indexsuche verwendet wird.
Beispiel 3
create table tblTest( a numeric(10,0) PRIMARY KEY, b int)
select * from tblTest where a = 123.0
				
  • Das eingehende Argument enthält ein Dezimaltrennzeichen und eine einzelne decimal Position. Dies führt zu einem genauen Datentyp (n, 1).

    Hinweis: Die dezimale Position in dieser Abfrage ist sehr wichtig. Die Abfrage gesendet wird besagt, dass es mathematisch eine Genauigkeit und Dezimalstellenanzahl der (n, 1) vergleichen möchte nicht (n, 0).
  • Die Spaltendefinition ist (10,0), so dass das Argument ein genauer betrachtet wird. Daher muss die Konvertierung für die Datenspalte angewendet werden und eine kleiner als optimale Plan kann ausgewählt werden.
Beachten Sie, dass die Tabellendefinition ein exakter Datentyp war. Wenn der Server versucht, führen Sie die Rundung, würden die Regeln für einen exakten Datentyp nicht beibehalten und würde dazu führen, ungültiges Ergebnis verarbeiten.

Berücksichtigen Sie als Beispiel:
create table tblTest( a numeric(10,1) PRIMARY KEY, b int)
select * from tblTest where a = 123.15
				
Wenn der SQL Server nicht gewählt haben einen Plan für die Spaltendaten des Arguments eingehende konvertieren (n, 2) Genauigkeit und Skalierung, aber stattdessen entschieden, das Argument für die Spaltengenauigkeit und Dezimalstellen zu runden, würde es 123.2 einstellen, wenn der Benutzer wahrscheinlich 123.1 aktualisieren wollten. In diesem Fall sollte es keine Übereinstimmung geben.

Alle numerischen Werte mit weniger als 10 skaliert und Genauigkeit 0 kann als Tinyint, Smallint oder ganzzahligen Typ bzw. dauert 1, 2 und 4 Bytes Speicherplatz, gespeichert werden. Im Vergleich dauert sogar der kleinste numerische Wert 5 Byte mit mehr Speicher zunehmender Genauigkeit erforderlich. Die folgende Tabelle zeigt die Zuordnung zwischen den Typen.

Tabelle minimierenTabelle vergrößern
GenauigkeitNeuer Typ
<= 2tinyint
<= 4smallint
<10int

Zusätzlich zu den Vorteilen durch Indizes effektiveren Verwendung verfügbar können Sie auch beträchtlichen Speicherplatz mithilfe der folgenden Datentypen angemessen speichern.

SQL Server 7.0 hinzugefügt die ALTER TABLE ALTER COLUMN-Anweisungen, die verwendet werden können, um den Datentyp einer Spalte dynamisch zu ändern. In früheren Versionen von SQL Server diese Konvertierung erfolgt nur durch Erstellen einer neuen Tabelle mit den gewünschten Definitionen und Ausführen einer INSERT SELECT zum Füllen der Tabelle. Beachten Sie, dass diese Änderung erfordert möglicherweise Sie aktualisieren alle Trigger, gespeicherte Prozeduren oder anderen Code, die Variablen, die die Spalte für einen numerischen Typ erwartet.

Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft SQL Server 6.5 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
Keywords: 
kbmt kbbug kbinfo KB198625 KbMtde
Maschinell übersetzter ArtikelMaschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 198625  (http://support.microsoft.com/kb/198625/en-us/ )
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.