php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 12-01-2010, 14:41
Lennynero
 Registrierter Benutzer
Links : Onlinestatus : Lennynero ist offline
Registriert seit: Sep 2007
Beiträge: 121
Blog-Einträge: 1
Lennynero ist zur Zeit noch ein unbeschriebenes Blatt
Standard Wie kann ich auslesen wieviel speicher eine Zeile belegt?

Hi,

gibt es einen MySQL Befehl, mit dem ich auslesen kann wieviel Speicher eine Zeile belegt?

So etwa:

Code:
SELECT Memory(), id FROM table
Gruss,
Markus
Mit Zitat antworten
  #2 (permalink)  
Alt 12-01-2010, 14:48
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Du kannst mit DESCRIBE `table` die Spaltentypen herausfinden. Dann weißt du schon mal wie viel Speicher ein Datensatz maximal belegen kann.
Falls es Spalten mit variable breiten Typen geben, musst du den konkreten Datensatz herausziehen und analysieren.

Wofür soll das eigentlich gut sein? Warum willst du das wissen?
Mit Zitat antworten
  #3 (permalink)  
Alt 12-01-2010, 14:57
Lennynero
 Registrierter Benutzer
Links : Onlinestatus : Lennynero ist offline
Registriert seit: Sep 2007
Beiträge: 121
Blog-Einträge: 1
Lennynero ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Nach einem "ALTER TABLE" (Änderung eines ENUM-Feldes) sind einige (nicht alle!) Textfelder einer Spalte auf 256 Zeichen gekürzt worden.

Es ist mir bisher noch nicht ersichtlich wo die Gemeinsamkeiten der beschnittenen Zeilen liegen und es ist ebenfalls erstaunlich, das ich wieder Texte die länger als 256 Zeichen sind reinschreiben kann.

Tabellentyp ist ndbcluster.
Mit Zitat antworten
  #4 (permalink)  
Alt 12-01-2010, 15:09
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Wie lautete denn das ALTER TABLE Statement, was du abgesetzt hast und wie sieht das komplette CREATE TABLE Statement aus, welches du mit SHOW CREATE TABLE bekommst?

Amica
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #5 (permalink)  
Alt 12-01-2010, 15:43
Lennynero
 Registrierter Benutzer
Links : Onlinestatus : Lennynero ist offline
Registriert seit: Sep 2007
Beiträge: 121
Blog-Einträge: 1
Lennynero ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Create Statement:

Code:
CREATE TABLE `table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `foreign_key_1` int(11) DEFAULT NULL,
  `foreign_key_2` int(11) DEFAULT NULL,
  `foreign_key_3` int(11) DEFAULT NULL,
  `enum_field_1` enum('option_1','option_2') CHARACTER SET latin1 COLLATE latin1_german1_ci 
  DEFAULT 'option_1',
  `enum_field_2` enum('option_1','option_2') CHARACTER SET latin1 COLLATE latin1_german1_ci 
  DEFAULT NULL,
  `enum_field_3` enum('Keine Angabe','2002','2003','2004','2005',
  '2006','2007','2008','2009','2010') DEFAULT NULL,
  `enum_field_4` enum('option_1','option_2','option_3','option_4','option_5','option_6',
  'option_7','option_8','option_9','option_10','option_11','option_12','option_13') DEFAULT NULL,
  `varchar_field_1` varchar(255) CHARACTER SET latin1 COLLATE latin1_german1_ci DEFAULT NULL,
  `varchar_field_2` varchar(255) CHARACTER SET latin1 COLLATE latin1_german1_ci DEFAULT NULL,
  `varchar_field_3` varchar(255) CHARACTER SET latin1 COLLATE latin1_german1_ci DEFAULT NULL,
  `varchar_field_4` varchar(255) CHARACTER SET latin1 COLLATE latin1_german1_ci DEFAULT NULL,
  `varchar_field_5` varchar(255) CHARACTER SET latin1 COLLATE latin1_german1_ci DEFAULT NULL,
  `varchar_field_6` varchar(255) CHARACTER SET latin1 COLLATE latin1_german1_ci DEFAULT NULL,
  `text_field_1` text CHARACTER SET latin1 COLLATE latin1_german1_ci,
  `varchar_field_7` varchar(255) DEFAULT NULL,
  `varchar_field_8` varchar(255) CHARACTER SET latin1 COLLATE latin1_german1_ci DEFAULT NULL,
  `varchar_field_9` varchar(255) CHARACTER SET latin1 COLLATE latin1_german1_ci DEFAULT NULL,
  `varchar_field_10` varchar(255) CHARACTER SET latin1 COLLATE latin1_german1_ci DEFAULT NULL,
  `varchar_field_11` varchar(255) CHARACTER SET latin1 COLLATE latin1_german1_ci DEFAULT NULL,
  `set_field_1` set('option_1','option_2','option_3','option_4') CHARACTER SET latin1 
COLLATE latin1_german1_ci DEFAULT NULL,
  `set_field_1` set('option_1','option_2','option_3','option_4') DEFAULT NULL,
  `text_field_2` text CHARACTER SET latin1 COLLATE latin1_german1_ci,
  `varchar_field_12` varchar(255) CHARACTER SET latin1 COLLATE latin1_german1_ci DEFAULT NULL,
  `varchar_field_13` varchar(255) CHARACTER SET latin1 COLLATE latin1_german1_ci DEFAULT NULL,
  `set_field_1` set('option_1','option_2') CHARACTER SET latin1 COLLATE latin1_german1_ci 
  DEFAULT NULL,
  `set_field_2` set('option_1','option_2','option_3','option_4') CHARACTER SET latin1 
  COLLATE latin1_german1_ci DEFAULT NULL,
  `int_field_1` tinyint(4) DEFAULT NULL,
  `set_field_3` set('option_1','option_2','option_3','option_4','option_5','option_6') 
  CHARACTER SET latin1 COLLATE latin1_german1_ci DEFAULT NULL,
  `set_field_4` set('option_1','option_2') CHARACTER SET latin1 COLLATE latin1_german1_ci 
  DEFAULT NULL,
  `text_field_3` text CHARACTER SET latin1 COLLATE latin1_german1_ci,
  `int_field_1` tinyint(4) DEFAULT NULL,
  `int_field_2` tinyint(4) DEFAULT NULL,
  `int_field_3` tinyint(4) DEFAULT NULL,
  `int_field_4` tinyint(4) DEFAULT NULL,
  `int_field_5` tinyint(4) DEFAULT NULL,
  `int_field_6` tinyint(4) DEFAULT NULL,
  `int_field_7` tinyint(4) DEFAULT NULL,
  `int_field_8` tinyint(4) DEFAULT NULL,
  `int_field_9` tinyint(4) DEFAULT NULL,
  `int_field_10` tinyint(4) DEFAULT NULL,
  `int_field_11` tinyint(4) DEFAULT NULL,
  `int_field_12` tinyint(4) DEFAULT NULL,
  `varchar_field_14` varchar(255) DEFAULT NULL,
  `status` tinyint(4) DEFAULT NULL COMMENT 'Status',
  `created` datetime DEFAULT NULL COMMENT 'Erstellt am',
  `created_by` int(11) DEFAULT NULL COMMENT 'Erstellt von',
  `modified` datetime DEFAULT NULL COMMENT 'Bearbeitet am',
  `modified_by` int(11) DEFAULT NULL COMMENT 'Bearbeitet von',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uidx_varchar_field_14` (`varchar_field_14`)
) ENGINE=ndbcluster DEFAULT CHARSET=latin1
Alter-Table Statement:
Code:
ALTER TABLE `table`
MODIFY COLUMN `enum_field_3`
ENUM('Keine Angabe','2002','2003','2004','2005','2006','2007','2008','2009','2010');
(War vorher ohne 2010).

Auch das dritte Textfeld wurde gekürzt, bei Textefeld 2 gibt es keine Text der so lang war /ist.

Geändert von Lennynero (12-01-2010 um 15:59 Uhr)
Mit Zitat antworten
  #6 (permalink)  
Alt 12-01-2010, 15:44
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.578
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Das Datenbankdesign ist doch ziemlicher Schrott. Am besten alles niederreißen und vernünftig aufbauen.

http://de.wikipedia.org/wiki/Normali...28Datenbank%29
Mit Zitat antworten
  #7 (permalink)  
Alt 12-01-2010, 15:52
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Dann hast du vermutlich die Gesamtspeicherbreite eines Datensatzes überschritten, was bei so vielen Spalten kein Wunder ist.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #8 (permalink)  
Alt 12-01-2010, 15:52
Lennynero
 Registrierter Benutzer
Links : Onlinestatus : Lennynero ist offline
Registriert seit: Sep 2007
Beiträge: 121
Blog-Einträge: 1
Lennynero ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von h3ll Beitrag anzeigen
Das Datenbankdesign ist doch ziemlicher Schrott. Am besten alles niederreißen und vernünftig aufbauen.

Normalisierung (Datenbank) ? Wikipedia
Die Praxis zeigt durchaus, das nicht immer "normalisieren" der zwingend beste Weg ist.

Nebenbei finde ich es beachtlich, das du in der Lage bist Aufgrund des Layoutes einer Tabelle auf das Design der ganzen Datenbank zu interpolieren. Sicherlich könnte man einige (wenn nicht sogar alle) ENUM und SET Felder durch weitere Tabellen abbilden, das würde aber jetzt einen Rattenschwanz an arbeit nach sich ziehen, der aber überflüssig ist da wir sowieso schon an der nächsten Version arbeiten. Mein Problem besteht aber jetzt und bis die nächte Version läuft wird es noch ein paar Wochen evt. sogar Monate dauern.

Es ist ja auch so, das man in die entsprechenden Spalten auch wieder Texte die länger als 256 Zeichen sind schreiben kann und es ist ja nicht jede Zeile betroffen gewesen.

Danke für deine Belehrung.
Mit Zitat antworten
  #9 (permalink)  
Alt 12-01-2010, 15:54
Lennynero
 Registrierter Benutzer
Links : Onlinestatus : Lennynero ist offline
Registriert seit: Sep 2007
Beiträge: 121
Blog-Einträge: 1
Lennynero ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von AmicaNoctis Beitrag anzeigen
Dann hast du vermutlich die Gesamtspeicherbreite eines Datensatzes überschritten, was bei so vielen Spalten kein Wunder ist.
Genau das vermute ich auch, deshalb auch die Frage nach der Möglichkeit die Gesamtspeicherbreite der Tupel zu ermitteln.
Mit Zitat antworten
  #10 (permalink)  
Alt 12-01-2010, 15:55
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von Lennynero Beitrag anzeigen
Die Praxis zeigt durchaus, das nicht immer "normalisieren" der zwingend beste Weg ist.
Dort wo du diese Aussage aufgeschnappt hast, steht bestimmt, dass es nicht immer sinnvoll oder machbar ist, bis zur 5NF zu normalisieren. Aber 3NF oder BCNF darf es schon sein und das bringt in der Praxis auch keine Nachteile.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #11 (permalink)  
Alt 12-01-2010, 16:08
Lennynero
 Registrierter Benutzer
Links : Onlinestatus : Lennynero ist offline
Registriert seit: Sep 2007
Beiträge: 121
Blog-Einträge: 1
Lennynero ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von AmicaNoctis Beitrag anzeigen
Dort wo du diese Aussage aufgeschnappt hast, steht bestimmt, dass es nicht immer sinnvoll oder machbar ist, bis zur 5NF zu normalisieren. Aber 3NF oder BCNF darf es schon sein und das bringt in der Praxis auch keine Nachteile.
Abhängig vom Verwendungszweck ist es nicht zwingend notwendig, aber letzten Endes ist das hier vorliegende DB-Design ja nicht wirklich neu und vor allem gewachsen, ein Relaunch steht wie erwähnt sowieso bevor. Von da aus ist es auch nicht meine Absicht über das Tabellendesign zu diskutieren, vielmehr habe ich anfangs eine recht klare Frage gestellt:

Zitat:
Zitat von Lennynero Beitrag anzeigen
Hi,

gibt es einen MySQL Befehl, mit dem ich auslesen kann wieviel Speicher eine Zeile belegt?

So etwa:

Code:
SELECT Memory(), id FROM table
Gruss,
Markus
bekomme eine Belehrung über DB-Design und

Zitat:
Zitat von AmicaNoctis Beitrag anzeigen
Dann hast du vermutlich die Gesamtspeicherbreite eines Datensatzes überschritten, was bei so vielen Spalten kein Wunder ist.
Onemorenerds Antwort ging ja schon in die Richtung und auch eine Antwort: es gibt keine entsprechende Funktion wäre ja schon okay.

EDIT: Bzgl. ENUM vs. JOIN:
http://www.mysqlperformanceblog.com/...hat-is-faster/
http://stackoverflow.com/questions/3...vs-join-tables

Geändert von Lennynero (12-01-2010 um 16:13 Uhr)
Mit Zitat antworten
  #12 (permalink)  
Alt 13-01-2010, 05:52
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Achja, das hab ich vergessen zu erwähnen: Es gibt keine solche Funktion. Deshalb habe ich den "Umweg" gezeigt.

Ich bezweifle übrigens, dass o.g. ALTER-Statement die VARCHAR-Spalten in irgendeiner Form beeinflusst hat. Damit wurde schließlich nur deine ENUM-Spalte geändert. Die Textspalten waren vorher schon VARCHAR(255) und damit unmöglich länger als 255 Zeichen.
Zwar kann VARCHAR ab 5.0.3 bis 2^16 Zeichen lang sein, aber wenn man eine Spalte als VARCHAR(255) definiert, werden die Daten auf diese Länge beschnitten. Das geschieht schon beim Einfügen, nicht erst beim nächsten ALTER.
Mit Zitat antworten
  #13 (permalink)  
Alt 13-01-2010, 10:13
Lennynero
 Registrierter Benutzer
Links : Onlinestatus : Lennynero ist offline
Registriert seit: Sep 2007
Beiträge: 121
Blog-Einträge: 1
Lennynero ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Die Felder waren weder vorher noch nachher VARCHAR Felder, sondern sind in allen Sicherung als Text-Felder definiert (und sind auch in der fehlerhaften Variante immer noch als Text-Felder definiert).

Was die Sache mit dem ALTER Befehl betriff: es ist reproduzierbar, d.h. ausgeführt auf dem "sauberen" Datenbestand werden einige (nicht alle) der Textfelder auf 256 Zeichen gekürzt.

Die Änderung des ENUM_Feldes mit Navicat (über Tabelle bearbeiten) oder dem MySQL Query Browser führt interessanterweise nicht zu diesem verhalten.

Es ist auch unerheblich ob ich dem ALTER Statement ein "DEFAULT NULL" oder nicht mitgebe.

Serverversion ist: 5.1.30-ndb-6.3.20, Tabellentyp (wie bereits erwähnt) ndbcluster.
Mit Zitat antworten
  #14 (permalink)  
Alt 13-01-2010, 15:50
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Sorry, ich hab dich misverstanden. Du hast kein Problem mit VARCHAR- sondern mit TEXT-Spalten.

Ich hab im Manual gewühlt und folgendes gefunden:
Zitat:
Quelle: MySQL :: MySQL 5.1 Reference Manual :: 10.5 Data Type Storage Requirements
TEXT and BLOB columns are implemented differently in the NDB Cluster storage engine, wherein each row in a TEXT column is made up of two separate parts. One of these is of fixed size (256 bytes), and is actually stored in the original table. The other consists of any data in excess of 256 bytes, which is stored in a hidden table. The rows in this second table are always 2,000 bytes long. This means that the size of a TEXT column is 256 if size <= 256 (where size represents the size of the row); otherwise, the size is 256 + size + (2000 – (size – 256) % 2000).
MySQL :: MySQL 5.1 Reference Manual :: 17.4.21 ndb_size.pl ? NDBCLUSTER Size Requirement Estimator
Mit Zitat antworten
  #15 (permalink)  
Alt 13-01-2010, 16:46
Lennynero
 Registrierter Benutzer
Links : Onlinestatus : Lennynero ist offline
Registriert seit: Sep 2007
Beiträge: 121
Blog-Einträge: 1
Lennynero ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von onemorenerd Beitrag anzeigen
Sorry, ich hab dich misverstanden. Du hast kein Problem mit VARCHAR- sondern mit TEXT-Spalten.

Ich hab im Manual gewühlt und folgendes gefunden:
Thx. (ich müsste erst noch ein paar andere User bewerten, bevor ich dich wieder bewerten kann).

Das mit den 256 Zeichen scheint da ja sehr gut zu passen, nun muss ich noch herausfinden wieso die nur bei einigen Zeilen abgeschnitten werden (ein Oberflächlicher Vergleich von betroffenen und nicht betroffenen Zeilen offenbart mir zumindest keinen Hinweis).

MIt dem "reproduzierbarem Fehler" war ich dagegen zu voreilig: in etwa 50% der Tests wurde Text abgeschnitten, in anderen Fällen nicht.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Eine Zeile aus eine Fremden webseite auslesen CARIHM Projekthilfe 2 26-03-2007 08:05
wer kann für mich eine xml datei auslesen? dersimli Projekthilfe 0 28-03-2006 17:48
Größer eine Zeile in der MySQL Datenbank auslesen GeaZor PHP Developer Forum 3 22-12-2003 20:14
Wieviel Platz belegt ein Verzeichnis kressevadder PHP Developer Forum 14 12-06-2003 13:49
Wieviel Webspace ist belegt? eX0du5 Apps und PHP Script Gesuche 6 13-04-2003 21:17

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 13:22 Uhr.