Leistung des Zeichenfolgenvergleichs vs. int Join in SQL

8

Es wird akzeptiert, dass das Durchsuchen einer Tabelle in einer int-Spalte schneller ist als in einer string-Spalte (z. B. varchar).

Wenn ich jedoch eine Shirt-Tabelle mit einer Color-Spalte habe, wäre es effizienter, eine Color-Tabelle zu erstellen, bei der der Primärschlüssel der Tabelle der Fremdschlüssel auf der Shirt-Tabelle ist? Würde die Join-Funktion den Leistungsvorteil zunichte machen, dass der Wert in der Spalte "Farbe" bei Shirt ein Int-Wert ist, anstatt eines Zeichenfolgenwerts wie "Grün", wenn nach grünen Shirts gesucht wird?

    
RobertMGlynn 14.09.2012, 19:54
quelle

5 Antworten

5

Im Vergleich zu den anderen durchgeführten Operationen ist es unwahrscheinlich, dass zwischen den beiden Ansätzen Leistungsunterschiede bestehen. Wenn Sie nur eine Handvoll Farben haben (bis zu einigen hundert), passt die Farbtabelle in den meisten Datenbanken auf eine einzige Seite. Ein Index für die Farbe würde ziemlich schnell nachschlagen und keine E / A-Aktivität verursachen (nach dem ersten Lauf, um die Seite zu laden).

Ein String-Vergleich hängt von der Datenbank ab, aber es beinhaltet eine Funktion und liest die Daten von der Seite. Also, es ist nicht kostenlos. Verschiedene Datenbanken können natürlich unterschiedliche Leistungsmerkmale für eine String-Funktion aufweisen.

Wo es gespeichert werden sollte, sollte eine Funktion Ihrer Anwendung sein. Angenommen, Sie haben eine Anwendung, in der die Farbe dem Benutzer angezeigt wird. Vielleicht möchten Sie eines Tages den Namen der Farbe in Spanisch, Swahili oder Chinesisch anzeigen. Wenn dies der Fall ist, erleichtert eine separate Tabelle die Internationalisierung erheblich. Prosaischer könnte es sein, dass Sie verhindern möchten, dass "Grene" eingegeben wird. Wenn dies der Fall ist, erleichtert eine solche Tabelle die Auswahlliste.

Auf der anderen Seite, wenn Leistung Ihre einzige Sorge ist, macht es nicht anders. In anderen Fällen ist es tatsächlich möglich, dass eine Nachschlagetabelle schneller als eine denormalisierte Tabelle ist. Dies tritt auf, wenn die Zeichenfolgen lang sind, wodurch die Länge jedes Datensatzes in einer größeren Tabelle erhöht wird. Größere Tabellen bedeuten mehr Seiten, die länger in den Speicher geladen werden.

    
Gordon Linoff 14.09.2012, 20:05
quelle
15

Wenn ich richtig verstehe, fragen Sie, welche dieser beiden Abfragen schneller wäre:

%Vor%

vs

%Vor%

Es hängt ein bisschen von der Datenbank ab (naja ... vielleicht hängt es viel davon ab, ob es richtig optimiert, was am meisten, wenn nicht alles sollte), aber das Nachschlagen in der Farbtabelle sollte vernachlässigbar sein und dann die restliche Ausführung Verwenden Sie den Integer-Lookup-Wert und sollte schneller sein. Der Großteil der Verarbeitung würde letztlich SELECT * from shirt WHERE colorid=N entsprechen. Ich vermute jedoch, dass Sie keinen Unterschied in der Geschwindigkeit bemerken würden, wenn der Tisch nicht ziemlich groß wäre. Die Entscheidung sollte wahrscheinlich darauf basieren, welches Design am sinnvollsten ist (wahrscheinlich das normalisierte).

    
Mark Wilkins 14.09.2012 20:02
quelle
9
___ qstntxt ___

Es wird akzeptiert, dass das Durchsuchen einer Tabelle in einer int-Spalte schneller ist als in einer string-Spalte (z. B. varchar).

Wenn ich jedoch eine Shirt-Tabelle mit einer Color-Spalte habe, wäre es effizienter, eine Color-Tabelle zu erstellen, bei der der Primärschlüssel der Tabelle der Fremdschlüssel auf der Shirt-Tabelle ist? Würde die Join-Funktion den Leistungsvorteil zunichte machen, dass der Wert in der Spalte "Farbe" bei Shirt ein Int-Wert ist, anstatt eines Zeichenfolgenwerts wie "Grün", wenn nach grünen Shirts gesucht wird?

    
___ qstnhdr ___ Leistung des Zeichenfolgenvergleichs vs. int Join in SQL ___ antwort12431291 ___

Das DBMS hat die Möglichkeit, Indizes zu optimieren, bei denen eine begrenzte Anzahl von Werten vorhanden ist. Wie sage ich sQL dies zu tun, weiß ich nicht. Es könnte es herausfinden.

Starten Sie ein Data Warehouse, wenn die Berichtsleistung ein schwerwiegendes Problem ist.

Wie Joe hervorhebt, möchten Sie, dass die Datenbank so normal wie möglich ist. Wenn Sie über eine separate Berichtsfunktion verfügen, die die Möglichkeit bietet, Leistungsprobleme zu verursachen, sollten Sie eine periodische Transformation (oder Regeln zum Erstellen in Echtzeit erstellen) ein zweites schreibgeschütztes Schema ausführen. Die erste ist OLTP und die zweite ist OLAP ('Data Warehouse'); Dies sind wichtige Konzepte, die vorhanden sein müssen, wenn Sie Ihre Daten ernst nehmen wollen.

Wenn es wichtig genug ist, es zu wissen, teste es.

Wenn Ihnen niemand eine Antwort gibt, ist der beste Weg, es selbst zu testen.

(1) Machen Sie 2 Datenbanken

(2) jeweils mit einem Test Ihrer 2 Tabellen

(3) Eine Datenbank verbindet nur die Zeichenfolge 'color' und verwendet diese für einen FK; der andere verbindet sich mit int ('colorID')

Füllen Sie jeweils 2 Millionen Dummy-Zeilen. Führen Sie jeweils mehrere Abfragen durch, wobei der 1. Lauf und der Durchschnittslauf zeitlich abgestimmt werden.

Verwenden Sie eine Instanz auf Ihrem Dev-Computer, um das Netzwerk aus dem Bild zu entfernen.

Sie sollten die Instanz auch vor jedem Testtyp starten und stoppen. Stuff wird absichtlich im Speicher bleiben, damit SQL es schneller liefern kann, aber wahrscheinlich wird dies Ihre Testergebnisse aus dem realen Betrieb verfälschen - wo es nicht mehr im Speicher oder im Cache gespeichert ist.

    
___ tag123sql ___ Structured Query Language (SQL) ist eine Sprache für die Abfrage von Datenbanken. Fragen sollten Codebeispiele, Tabellenstruktur, Beispieldaten und ein Tag für die verwendete DBMS-Implementierung (z. B. MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 usw.) enthalten. Wenn sich Ihre Frage nur auf ein bestimmtes DBMS bezieht (verwendet bestimmte Erweiterungen / Funktionen), verwenden Sie stattdessen das Tag des DBMS. Antworten auf mit SQL gekennzeichnete Fragen sollten den ISO / IEC-Standard SQL verwenden. ___ tag123performance ___ Für Fragen zur Messung oder Verbesserung der Code- und Anwendungseffizienz. ___ tag123join ___ Ein JOIN ist eine allgemeine Operation in der relationalen Algebra für eine Kombinationsoperation für zwei oder mehr Relationen in einem relationalen Datenbanksystem. JOIN ist auch das Schlüsselwort der SQL-Sprache zum Ausführen dieser Operation. ___ answer12431229 ___

Es hängt wirklich vom Abfrageoptimierer ab. Ihre Farbtabelle wird sehr klein sein, also wahrscheinlich basierend auf den Datenbankstatistiken und den Abfrageplänen, würde sie wahrscheinlich vollständig im Speicher geladen werden, so dass Sie nicht nur die Leistungskosten des Joins, die tatsächlich tatsächlich schneller sind, negieren. Dies hängt natürlich von den verwendeten dbms ab, aber einige dbms können Hinweise nehmen, um eine Tabelle auf eine spezielle Art zu behandeln.

Ein weiteres +1 für die Farbtabelle ist, dass Sie, wenn Sie den Farbnamen ändern müssen, nur 1 Aktualisierung benötigen, anstatt den Zeichenfolgenwert für jedes Vorkommen zu ändern.

    
___ tag123foreignkeys ___ Ein Fremdschlüssel ist eine Spalte oder eine Kombination von Spalten in einer relationalen Tabelle, die einem Kandidatenschlüssel einer anderen Tabelle entspricht. Der Fremdschlüssel kann zum Querverweisen von Tabellen verwendet werden. ___ tag123varchar ___ Ein varchar oder variables Zeichenfeld ist eine Menge von Zeichendaten mit unbestimmter Länge. ___ answer12431223 ___

Wenn ich richtig verstehe, fragen Sie, welche dieser beiden Abfragen schneller wäre:

%Vor%

vs

%Vor%

Es hängt ein bisschen von der Datenbank ab (naja ... vielleicht hängt es viel davon ab, ob es richtig optimiert, was am meisten, wenn nicht alles sollte), aber das Nachschlagen in der Farbtabelle sollte vernachlässigbar sein und dann die restliche Ausführung Verwenden Sie den Integer-Lookup-Wert und sollte schneller sein. Der Großteil der Verarbeitung würde letztlich %code% entsprechen. Ich vermute jedoch, dass Sie keinen Unterschied in der Geschwindigkeit bemerken würden, wenn der Tisch nicht ziemlich groß wäre. Die Entscheidung sollte wahrscheinlich darauf basieren, welches Design am sinnvollsten ist (wahrscheinlich das normalisierte).

    
___ answer12431262 ___

Im Vergleich zu den anderen durchgeführten Operationen ist es unwahrscheinlich, dass zwischen den beiden Ansätzen Leistungsunterschiede bestehen. Wenn Sie nur eine Handvoll Farben haben (bis zu einigen hundert), passt die Farbtabelle in den meisten Datenbanken auf eine einzige Seite. Ein Index für die Farbe würde ziemlich schnell nachschlagen und keine E / A-Aktivität verursachen (nach dem ersten Lauf, um die Seite zu laden).

Ein String-Vergleich hängt von der Datenbank ab, aber es beinhaltet eine Funktion und liest die Daten von der Seite. Also, es ist nicht kostenlos. Verschiedene Datenbanken können natürlich unterschiedliche Leistungsmerkmale für eine String-Funktion aufweisen.

Wo es gespeichert werden sollte, sollte eine Funktion Ihrer Anwendung sein. Angenommen, Sie haben eine Anwendung, in der die Farbe dem Benutzer angezeigt wird. Vielleicht möchten Sie eines Tages den Namen der Farbe in Spanisch, Swahili oder Chinesisch anzeigen. Wenn dies der Fall ist, erleichtert eine separate Tabelle die Internationalisierung erheblich. Prosaischer könnte es sein, dass Sie verhindern möchten, dass "Grene" eingegeben wird. Wenn dies der Fall ist, erleichtert eine solche Tabelle die Auswahlliste.

Auf der anderen Seite, wenn Leistung Ihre einzige Sorge ist, macht es nicht anders. In anderen Fällen ist es tatsächlich möglich, dass eine Nachschlagetabelle schneller als eine denormalisierte Tabelle ist. Dies tritt auf, wenn die Zeichenfolgen lang sind, wodurch die Länge jedes Datensatzes in einer größeren Tabelle erhöht wird. Größere Tabellen bedeuten mehr Seiten, die länger in den Speicher geladen werden.

    
___
Joe Stefanelli 14.09.2012 20:01
quelle
3
___ qstntxt ___

Es wird akzeptiert, dass das Durchsuchen einer Tabelle in einer int-Spalte schneller ist als in einer string-Spalte (z. B. varchar).

Wenn ich jedoch eine Shirt-Tabelle mit einer Color-Spalte habe, wäre es effizienter, eine Color-Tabelle zu erstellen, bei der der Primärschlüssel der Tabelle der Fremdschlüssel auf der Shirt-Tabelle ist? Würde die Join-Funktion den Leistungsvorteil zunichte machen, dass der Wert in der Spalte "Farbe" bei Shirt ein Int-Wert ist, anstatt eines Zeichenfolgenwerts wie "Grün", wenn nach grünen Shirts gesucht wird?

    
___ qstnhdr ___ Leistung des Zeichenfolgenvergleichs vs. int Join in SQL ___ antwort12431291 ___

Das DBMS hat die Möglichkeit, Indizes zu optimieren, bei denen eine begrenzte Anzahl von Werten vorhanden ist. Wie sage ich sQL dies zu tun, weiß ich nicht. Es könnte es herausfinden.

Starten Sie ein Data Warehouse, wenn die Berichtsleistung ein schwerwiegendes Problem ist.

Wie Joe hervorhebt, möchten Sie, dass die Datenbank so normal wie möglich ist. Wenn Sie über eine separate Berichtsfunktion verfügen, die die Möglichkeit bietet, Leistungsprobleme zu verursachen, sollten Sie eine periodische Transformation (oder Regeln zum Erstellen in Echtzeit erstellen) ein zweites schreibgeschütztes Schema ausführen. Die erste ist OLTP und die zweite ist OLAP ('Data Warehouse'); Dies sind wichtige Konzepte, die vorhanden sein müssen, wenn Sie Ihre Daten ernst nehmen wollen.

Wenn es wichtig genug ist, es zu wissen, teste es.

Wenn Ihnen niemand eine Antwort gibt, ist der beste Weg, es selbst zu testen.

(1) Machen Sie 2 Datenbanken

(2) jeweils mit einem Test Ihrer 2 Tabellen

(3) Eine Datenbank verbindet nur die Zeichenfolge 'color' und verwendet diese für einen FK; der andere verbindet sich mit int ('colorID')

Füllen Sie jeweils 2 Millionen Dummy-Zeilen. Führen Sie jeweils mehrere Abfragen durch, wobei der 1. Lauf und der Durchschnittslauf zeitlich abgestimmt werden.

Verwenden Sie eine Instanz auf Ihrem Dev-Computer, um das Netzwerk aus dem Bild zu entfernen.

Sie sollten die Instanz auch vor jedem Testtyp starten und stoppen. Stuff wird absichtlich im Speicher bleiben, damit SQL es schneller liefern kann, aber wahrscheinlich wird dies Ihre Testergebnisse aus dem realen Betrieb verfälschen - wo es nicht mehr im Speicher oder im Cache gespeichert ist.

    
___ tag123sql ___ Structured Query Language (SQL) ist eine Sprache für die Abfrage von Datenbanken. Fragen sollten Codebeispiele, Tabellenstruktur, Beispieldaten und ein Tag für die verwendete DBMS-Implementierung (z. B. MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 usw.) enthalten. Wenn sich Ihre Frage nur auf ein bestimmtes DBMS bezieht (verwendet bestimmte Erweiterungen / Funktionen), verwenden Sie stattdessen das Tag des DBMS. Antworten auf mit SQL gekennzeichnete Fragen sollten den ISO / IEC-Standard SQL verwenden. ___ tag123performance ___ Für Fragen zur Messung oder Verbesserung der Code- und Anwendungseffizienz. ___ tag123join ___ Ein JOIN ist eine allgemeine Operation in der relationalen Algebra für eine Kombinationsoperation für zwei oder mehr Relationen in einem relationalen Datenbanksystem. JOIN ist auch das Schlüsselwort der SQL-Sprache zum Ausführen dieser Operation. ___ answer12431229 ___

Es hängt wirklich vom Abfrageoptimierer ab. Ihre Farbtabelle wird sehr klein sein, also wahrscheinlich basierend auf den Datenbankstatistiken und den Abfrageplänen, würde sie wahrscheinlich vollständig im Speicher geladen werden, so dass Sie nicht nur die Leistungskosten des Joins, die tatsächlich tatsächlich schneller sind, negieren. Dies hängt natürlich von den verwendeten dbms ab, aber einige dbms können Hinweise nehmen, um eine Tabelle auf eine spezielle Art zu behandeln.

Ein weiteres +1 für die Farbtabelle ist, dass Sie, wenn Sie den Farbnamen ändern müssen, nur 1 Aktualisierung benötigen, anstatt den Zeichenfolgenwert für jedes Vorkommen zu ändern.

    
___ tag123foreignkeys ___ Ein Fremdschlüssel ist eine Spalte oder eine Kombination von Spalten in einer relationalen Tabelle, die einem Kandidatenschlüssel einer anderen Tabelle entspricht. Der Fremdschlüssel kann zum Querverweisen von Tabellen verwendet werden. ___ tag123varchar ___ Ein varchar oder variables Zeichenfeld ist eine Menge von Zeichendaten mit unbestimmter Länge. ___ answer12431223 ___

Wenn ich richtig verstehe, fragen Sie, welche dieser beiden Abfragen schneller wäre:

%Vor%

vs

%Vor%

Es hängt ein bisschen von der Datenbank ab (naja ... vielleicht hängt es viel davon ab, ob es richtig optimiert, was am meisten, wenn nicht alles sollte), aber das Nachschlagen in der Farbtabelle sollte vernachlässigbar sein und dann die restliche Ausführung Verwenden Sie den Integer-Lookup-Wert und sollte schneller sein. Der Großteil der Verarbeitung würde letztlich %code% entsprechen. Ich vermute jedoch, dass Sie keinen Unterschied in der Geschwindigkeit bemerken würden, wenn der Tisch nicht ziemlich groß wäre. Die Entscheidung sollte wahrscheinlich darauf basieren, welches Design am sinnvollsten ist (wahrscheinlich das normalisierte).

    
___ answer12431262 ___

Im Vergleich zu den anderen durchgeführten Operationen ist es unwahrscheinlich, dass zwischen den beiden Ansätzen Leistungsunterschiede bestehen. Wenn Sie nur eine Handvoll Farben haben (bis zu einigen hundert), passt die Farbtabelle in den meisten Datenbanken auf eine einzige Seite. Ein Index für die Farbe würde ziemlich schnell nachschlagen und keine E / A-Aktivität verursachen (nach dem ersten Lauf, um die Seite zu laden).

Ein String-Vergleich hängt von der Datenbank ab, aber es beinhaltet eine Funktion und liest die Daten von der Seite. Also, es ist nicht kostenlos. Verschiedene Datenbanken können natürlich unterschiedliche Leistungsmerkmale für eine String-Funktion aufweisen.

Wo es gespeichert werden sollte, sollte eine Funktion Ihrer Anwendung sein. Angenommen, Sie haben eine Anwendung, in der die Farbe dem Benutzer angezeigt wird. Vielleicht möchten Sie eines Tages den Namen der Farbe in Spanisch, Swahili oder Chinesisch anzeigen. Wenn dies der Fall ist, erleichtert eine separate Tabelle die Internationalisierung erheblich. Prosaischer könnte es sein, dass Sie verhindern möchten, dass "Grene" eingegeben wird. Wenn dies der Fall ist, erleichtert eine solche Tabelle die Auswahlliste.

Auf der anderen Seite, wenn Leistung Ihre einzige Sorge ist, macht es nicht anders. In anderen Fällen ist es tatsächlich möglich, dass eine Nachschlagetabelle schneller als eine denormalisierte Tabelle ist. Dies tritt auf, wenn die Zeichenfolgen lang sind, wodurch die Länge jedes Datensatzes in einer größeren Tabelle erhöht wird. Größere Tabellen bedeuten mehr Seiten, die länger in den Speicher geladen werden.

    
___
FastAl 14.09.2012 20:07
quelle
1

Es hängt wirklich vom Abfrageoptimierer ab. Ihre Farbtabelle wird sehr klein sein, also wahrscheinlich basierend auf den Datenbankstatistiken und den Abfrageplänen, würde sie wahrscheinlich vollständig im Speicher geladen werden, so dass Sie nicht nur die Leistungskosten des Joins, die tatsächlich tatsächlich schneller sind, negieren. Dies hängt natürlich von den verwendeten dbms ab, aber einige dbms können Hinweise nehmen, um eine Tabelle auf eine spezielle Art zu behandeln.

Ein weiteres +1 für die Farbtabelle ist, dass Sie, wenn Sie den Farbnamen ändern müssen, nur 1 Aktualisierung benötigen, anstatt den Zeichenfolgenwert für jedes Vorkommen zu ändern.

    
Carlos Grappa 14.09.2012 20:03
quelle