¿Cómo puedo averiguar el uso del disco de una sola tabla dentro de una base de datos SQLite sin necesidad de copiar en una nueva base de datos vacía?

InformationsquelleAutor Cristi | 2011-05-05

4 Comentarios

  1. 80

    Puede utilizar sqlite3_analyzer de https://www.sqlite.org/download.html.

    Es una genial herramienta. Se muestra el número de páginas utilizadas por cada mesa con y sin índices (cada página, por defecto, es de 1024 bytes).

    Esta es una muestra de sqlite3_analyzer de salida para la base de datos Northwind:

    *** Page counts for all tables with their indices ********************
    
    EMPLOYEES............................. 200         34.4% 
    ORDERS................................ 152         26.2% 
    CATEGORIES............................ 90          15.5% 
    ORDER DETAILS......................... 81          13.9% 
    CUSTOMERS............................. 17           2.9% 
    SQLITE_MASTER......................... 11           1.9% 
    PRODUCTS.............................. 7            1.2% 
    SUPPLIERS............................. 7            1.2% 
    TERRITORIES........................... 6            1.0% 
    CUSTOMERCUSTOMERDEMO.................. 2            0.34% 
    CUSTOMERDEMOGRAPHICS.................. 2            0.34% 
    EMPLOYEETERRITORIES................... 2            0.34% 
    REGION................................ 2            0.34% 
    SHIPPERS.............................. 2            0.34% 

    También genera las sentencias SQL que puede ser utilizado para crear una base de datos con estadísticas de uso, que se puede analizar.

    • Muchas gracias! Justo lo que estaba buscando…
    • Cuidado, sqlite3_analyze tarda mucho tiempo en ejecutarse.
    • Jaja! Así que esto es lo sqlite3_analyzer hace!
    • Oh mi dios!! Una muy buena herramienta!! He exprimido el sqlite sitio toneladas de veces y nunca me di cuenta en él.
    • ¿Cómo funciona en linux? He descomprimido, pero no puedo iniciarlo
    • sí, una de 64 bits versión de Linux parece haber desaparecido. Raro.

  2. 5

    Me doy cuenta de que esta respuesta totalmente viola el espíritu de la pregunta, pero consigue que el tamaño sin copia el archivo…

    $ ls -lh db.sqlite
    -rw-r--r-- 1 dude bros 44M Jan 11 18:44 db.sqlite
    $ sqlite3 db.sqlite
    sqlite> drop table my_table;
    sqlite> vacuum;
    sqlite> ^D
    $ ls -lh db.sqlite
    -rw-r--r-- 1 dude bros 23M Jan 11 18:44 db.sqlite
    • Que astuto! Te sugiero agregar un comentario anterior, el código que explica lo que hace el fragmento, me tomó un par de momentos.
    • Está usted seguro de que no copia el archivo debajo? El vacío de las necesidades de espacio en disco como el tamaño de la db, por lo menos, creo (no estoy muy seguro acerca de esto, pero algunas cosas no creo que recuerdo de la lectura, y mis experimentos con casi todas las particiones, me llevan a creer que algo parecido a ser el caso.)
    • también, el espacio recuperado por el vacío que podría haber sido recuperada de otras tablas, por lo que probablemente necesita de vacío; tamaño del archivo de prueba; drop table; vacío; tamaño del archivo de prueba
  3. 4

    Si estás en linux o OSX, o por el contrario, tiene utilidades de unix awk (y, opcionalmente, el tipo) disponibles, usted puede hacer lo siguiente para obtener la cuenta y el tamaño estimado a través de análisis de volcado:

    # substitute '.dump' for '.dump mytable' if you want to limit to specific table
    sqlite3 db.sqlite3 '.dump' | awk -f sqlite3_size.awk

    que devuelve:

    table            count   est. size
    my_biggest_table 1090    60733958
    my_table2        26919   7796902
    my_table3        10390   2732068

    y utiliza el script awk:

    /INSERT INTO/ {                              # parse INSERT commands
        split($0, values, "VALUES");             # extract everything after VALUES
        split(values[1], name, "INSERT INTO");   # get tablename
        tablename = name[2];                     #
        gsub(/[\047\042]/, "", tablename);         # remove single and double quotes from name
        gsub(/[\047,]/, "", values[2]);          # remove single-quotes and commas
        sizes[tablename] += length(values[2]) - 3; # subtract 3 for parens and semicolon
        counts[tablename] += 1;
    }
    
    END {
        print "table\tcount\test. size"
        for(k in sizes) {
            # print and sort in descending order:
            print k "\t" counts[k] "\t" sizes[k] | "sort -k3 -n -r";
    
            # or, if you don't have the sort command:
            print k "\t" counts[k] "\t" sizes[k];
        }
    }

    El tamaño estimado se basa en la longitud de cadena de los «INSERT INTO» de comandos, por lo que no va a ser igual al tamaño real del disco, pero para mí, el recuento de más el tamaño estimado es de lo más útil que otras alternativas tales como el número de páginas.

    • Impresionante! Yo voy a usar esto en iOS (jailbreak), gracias
  4. 1

    Me encontré con problemas con las otras respuestas aquí (es decir, sqlite_analyzer no funciona en Linux). ‘Acabó creando la siguiente función Bash (temporalmente) escribir cada tabla en el disco como una forma de evaluar el tamaño del disco. Técnicamente esta es la copia de la db, que no está en el espíritu de OP de la pregunta, pero me dio la información que buscaba.

    function sqlite_size() {
      TMPFILE="/tmp/__sqlite_size_tmp"
      DB=$1
      IFS=" " TABLES=`sqlite3 $DB .tables`
      for i in $TABLES; do
        \rm -f "$TMPFILE"
        sqlite3 $DB ".dump $i" | sqlite3 $TMPFILE
        echo $i `cat $TMPFILE | wc -c`
        \rm -f "$TMPFILE"
      done
    }

    Ejemplo:

    $ sqlite_size sidekick.sqlite
    SequelizeMeta 12288
    events 16384
    histograms 20480
    programs 20480
    
    • para un mejor resultado, utilice : sqlite_size /var/lib/grafana/grafana.db | sort -k2 -n | column -t (se ordenan con bonitas columnas)

Dejar respuesta

Please enter your comment!
Please enter your name here