Avatar billede trp79 Nybegynder
01. februar 2005 - 18:04 Der er 15 kommentarer og
1 løsning

Ideer til program, der kan finde ud af udnyttelsesgraden af en db

Hejsa
Jeg kunne godt tænke mig at lave et program som undersøger, hvor godt en database udnyttes. Altså, hvis der fx er afsat 256B til en varchar og indholdet i nogle poster kun fylder 90, andre 200 osv. Men er det muligt?
Jeg syntes ikke jeg kan finde nogen metoder i DatabaseMetaData() som giver oplysninger om, hvor meget plads der er afsat til de enkelte kolonner. I forbindelse med at måle på indholdet i de  enkelte posterne i databasen kan man da hive indholdet ud ( fx rs.getString )og måle på hvor meget de fylder og få et reelt svar - altså et som passer med hvor meget den pågældende post fylder i db?
Håber nogen kan hjælpe mig igang.

På forhånd tak, mvh
Torben
Avatar billede arne_v Ekspert
01. februar 2005 - 18:20 #1
getColumns returnerer et ResultSet som bl.a. indeholdr en kolonne COLUMN_SIZE
Avatar billede arne_v Ekspert
01. februar 2005 - 18:21 #2
rs.getString(ix).length() kan vel bruges
Avatar billede trp79 Nybegynder
02. februar 2005 - 08:54 #3
Det lyder super Arne. Jeg kigger på det i aften, men mon ikke godt du kan smide et svar. Din hjælp plejer trods alt at være meget brugbar!
Vil man kunne gøre sådan som du foreskriver på alle typer? Altså, hvad nu hvis der fx ligger en BLOB eller anden datatype i databasen?
Avatar billede arne_v Ekspert
02. februar 2005 - 09:00 #4
Nej - rs.getString(ix).length() er nok til VARCHAR og deslige.

rs.getBytes(ix).length kan nok klare mere.

Men i ekstreme tilfælde må det vel blive rs.getBlob(ix).

Hvis der er gemt 2 GB BLOB's i databasen, så er princippet med
at læse det op i en memory variabel ikke så god.
Avatar billede arne_v Ekspert
02. februar 2005 - 09:01 #5
svar

hvis der er noget der driller så skriv
Avatar billede arne_v Ekspert
02. februar 2005 - 09:01 #6
Og det rs jeg snakke rom i de sidste indlæg er naturligvis fra en normal
query og ikke relateret til ResultSet fra første kommentar.
Avatar billede trp79 Nybegynder
02. februar 2005 - 09:11 #7
Det lyder godt Arne.
Jeg kigger på det i aften, tak for hjælpen.
Avatar billede trp79 Nybegynder
02. februar 2005 - 18:22 #8
Hej igen Arne, så er jeg stødt i et par problemer... Jeg har fundet ud af, at getColumns ligger i interfacet DatabaseMetaData, men jeg har et par problemer:

1) Jeg kan ikke finde ud af, hvad det er for en klasse jeg skal bruge som implementerer DatabaseMetaData

2) Jeg er ikke med på, hvad getColumns parametre er:
  public ResultSet getColumns ( 
    String catalog,
    String schemaPattern,
    String tableNamePattern,
    String columnNamePattern
  )

Håber du har et par ideer :)
Avatar billede arne_v Ekspert
02. februar 2005 - 19:07 #9
re 1)

Ingen.

Du kalder conn.getMetaData() for at få en !
Avatar billede arne_v Ekspert
02. februar 2005 - 19:11 #10
Prøv:

conn.getColumns(null,null,"%","%")
Avatar billede trp79 Nybegynder
08. februar 2005 - 09:04 #11
Til andres orientering, så er her hvad jeg nåede frem til:

    private String getType(int i) {
      String desc = null;

      switch (i) {
      case Types.BIT:
          desc = "BIT";
          break;
      case Types.TINYINT:
          desc = "TINYINT";
          break;
      case Types.SMALLINT:
          desc = "SMALLINT";
          break;
      case Types.INTEGER:
          desc = "INTEGER";
          break;
      case Types.BIGINT:
          desc = "BIGINT";
          break;
      case Types.FLOAT:
          desc = "FLOAT";
          break;
      case Types.REAL:
          desc = "REAL";
          break;
      case Types.DOUBLE:
          desc = "DOUBLE";
          break;
      case Types.NUMERIC:
          desc = "NUMERIC";
          break;
      case Types.DECIMAL:
          desc = "DECIMAL";
          break;
      case Types.CHAR:
          desc = "CHAR";
          break;
      case Types.VARCHAR:
          desc = "VARCHAR";
          break;
      case Types.LONGVARCHAR:
          desc = "LONGVARCHAR";
          break;
      case Types.DATE:
          desc = "DATE";
          break;
      case Types.TIME:
          desc = "TIME";
          break;
      case Types.TIMESTAMP:
          desc = "TIMESTAMP";
          break;
      case Types.BINARY:
          desc = "BINARY";
          break;
      case Types.VARBINARY:
          desc = "VARBINARY";
          break;
      case Types.LONGVARBINARY:
          desc = "LONGVARBINARY";
          break;
      case Types.NULL:
          desc = "NULL";
          break;
      case Types.OTHER:
          desc = "OTHER";
          break;
      case Types.JAVA_OBJECT:
          desc = "JAVA_OBJECT";
          break;
      case Types.DISTINCT:
          desc = "DISTINCT";
          break;
      case Types.STRUCT:
          desc = "STRUCT";
          break;
      case Types.ARRAY:
          desc = "ARRAY";
          break;
      case Types.BLOB:
          desc = "BLOB";
          break;
      case Types.CLOB:
          desc = "CLOB";
          break;
      case Types.REF:
          desc = "REF";
          break;
      default:
          desc = "UNKNOWN";
          break;
      }
      return desc;
    }

public void meta2() throws SQLException
{
  DatabaseMetaData dbmd = conn.getMetaData();
  ResultSet rsColumns = dbmd.getColumns(null, null, "%", "%");
  while (rsColumns.next()) {
        String cn = rsColumns.getString("COLUMN_NAME");
        String cdt = getType(rsColumns.getInt("DATA_TYPE"));
        String cnt = rsColumns.getString("TYPE_NAME");
        String cs = rsColumns.getString("COLUMN_SIZE");
        String cnull = rsColumns.getString("IS_NULLABLE");
        System.out.println("Kolonne navn: "+cn+"\t Data type: "+cdt+"\t Native " type: "+cnt+"\t Kolonne str: "+cs+"\t Null: "+cnull);
    }
}

Det ser desværre ud til, at hvis man fx har defineret en VARCHAR så bliver columnsize 0, hvorimod hvis man har defineret en VARCHAR(256), så bliver columnsize 256. Det samme gælder for andre typer. Derved bliver det altså svært at finde ud af, hvor meget plads der er afsat når det ikke explicit er defineret ved oprettelsen af tabellerne i databasen. Jeg har endnu kun prøvet på HSQLDB. Hvorvidt MySQL og andre reagerer på andre måder må kommer an på en test :)
Avatar billede arne_v Ekspert
08. februar 2005 - 10:41 #12
Jeg tror at de fleste databaser vil give syntax fejl hvis du forsøger
at lave en VARCHAR uden at angive max størrelse.
Avatar billede trp79 Nybegynder
09. februar 2005 - 19:52 #13
Nå så har jeg forsøgt med mysql og det ser mere lovende ud :)
Ja, de fleste databaser kræver en angivelse af maxstørrelse ved varchar, men de fleste tillader jo også, at man fx laver en INTERGER uden at angive maxstørrelsen. Her angiver MySQL dog selv størrelsen til 11. Hvorvidt det også gælder for andre typer har jeg ikke tjekket.
Avatar billede arne_v Ekspert
09. februar 2005 - 19:55 #14
De 11 i INT(11) i MySQL har ikke noget at gøre med hvor meget en INT fylder.

Den fylder 4 bytes. Det er et hint om hvormange cifre kollonnen skal vises med
ved udskrift.
Avatar billede trp79 Nybegynder
09. februar 2005 - 20:17 #15
Nå for søren, ja det er jo så ret væsentligt når jeg gerne vil tjekke udnyttelsesgraden af databasen! :)

Jeg har siddet og kigget lidt i mysql doc, men kan ikke rigtig finde en oversigt over, hvor mange bytes, der sættes til side til de enkelte datatyper. Så det bliver måske lidt svært at lave en app. som viser en reel udnyttelsesgrad af databasen.
Avatar billede arne_v Ekspert
09. februar 2005 - 20:44 #16
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester