none
Analisi righe Tabelle Database RRS feed

  • Domanda

  • Ciao,

    volendo improntare un piano di pulizia di alcune tabelle temporanee, vorrei poter eseguire una query che mi restituisse il nome della tabella ed il numero di righe presenti.

    In particolar modo vorrei poter analizzare tutte le tabelle dbo.TEMP***** ed il relativo numero di righe.

    Mi potere dare due dritte?

    Grazie


    Marco

    martedì 19 marzo 2019 08:26

Risposte

  • Ciao,

    prova questa:

    SELECT 
        s.Name AS SchemaName,
        t.NAME AS TableName,
        p.rows AS RowCounts,
        SUM(a.total_pages) * 8 AS TotalSpaceKB, 
        SUM(a.used_pages) * 8 AS UsedSpaceKB, 
        (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB
    FROM 
        sys.tables t
    INNER JOIN 
        sys.schemas s ON s.schema_id = t.schema_id
    INNER JOIN      
        sys.indexes i ON t.OBJECT_ID = i.object_id
    INNER JOIN 
        sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
    INNER JOIN 
        sys.allocation_units a ON p.partition_id = a.container_id
    WHERE 
        t.NAME NOT LIKE 'dt%' 
        AND t.is_ms_shipped = 0
        AND i.OBJECT_ID > 255 
    GROUP BY 
        t.Name, s.Name, p.Rows
    ORDER BY 
        SUM(a.used_pages) DESC

    Aggiungi il filtro di cui hai bisogno nella WHERE


    HTH,

    Cris

    Please Mark This As Answer if it solved your issue or Vote This As Helpful if it helps to solve your issue. Thank you!

    martedì 19 marzo 2019 09:37

Tutte le risposte

  • Ciao,

    prova questa:

    SELECT 
        s.Name AS SchemaName,
        t.NAME AS TableName,
        p.rows AS RowCounts,
        SUM(a.total_pages) * 8 AS TotalSpaceKB, 
        SUM(a.used_pages) * 8 AS UsedSpaceKB, 
        (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB
    FROM 
        sys.tables t
    INNER JOIN 
        sys.schemas s ON s.schema_id = t.schema_id
    INNER JOIN      
        sys.indexes i ON t.OBJECT_ID = i.object_id
    INNER JOIN 
        sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
    INNER JOIN 
        sys.allocation_units a ON p.partition_id = a.container_id
    WHERE 
        t.NAME NOT LIKE 'dt%' 
        AND t.is_ms_shipped = 0
        AND i.OBJECT_ID > 255 
    GROUP BY 
        t.Name, s.Name, p.Rows
    ORDER BY 
        SUM(a.used_pages) DESC

    Aggiungi il filtro di cui hai bisogno nella WHERE


    HTH,

    Cris

    Please Mark This As Answer if it solved your issue or Vote This As Helpful if it helps to solve your issue. Thank you!

    martedì 19 marzo 2019 09:37
  • Fantastico Cris!!.... Grazie mille!!!)))) era proprio quello che cercavo...

    Marco

    martedì 19 marzo 2019 10:57
  • E' stato un piacere aiutarti!

    HTH,

    Cris

    Please Mark This As Answer if it solved your issue or Vote This As Helpful if it helps to solve your issue. Thank you!

    martedì 19 marzo 2019 14:27
  • porca miseria....

    volessi tenere il tuo script per l'identificazione degli oggetti temporanei.... posso passare i nomi delle varie tabelle ad una variabile ed effettuare il truncate delle tabelle?....

    come dovrei fare...


    Marco

    martedì 19 marzo 2019 15:28
  • porca miseria....

    volessi tenere il tuo script per l'identificazione degli oggetti temporanei.... posso passare i nomi delle varie tabelle ad una variabile ed effettuare il truncate delle tabelle?....

    come dovrei fare...


    Marco

    chiedo questo perchè nell'istanza ho 12 diversi db con tabelle temporanee differenti ma che sono  nominate tutte con lo stresso prefisso "TEMP....."

    Marco

    martedì 19 marzo 2019 15:30
  • .

    volessi tenere il tuo script per l'identificazione degli oggetti temporanei.... posso passare i nomi delle varie tabelle ad una variabile ed effettuare il truncate delle tabelle?....

    come dovrei fare...

    Ciao Marco,

    una volta identificate le tabelle con la query di Cristiano, potresti "scriptarti" i comandi di TRUNCATE oppure fare un ciclo (anche se meno performante, in questo caso può essere trascurabile).

    Per scriptare i comandi, partendo dalla query di Cristiano, potresti valutare questa variante nella SELECT:

    SELECT 
        s.Name AS SchemaName,
        t.NAME AS TableName,
        p.rows AS RowCounts,
        SUM(a.total_pages) * 8 AS TotalSpaceKB, 
        SUM(a.used_pages) * 8 AS UsedSpaceKB, 
        (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB,
        'TRUNCATE TABLE [' + s.Name + '].[' + t.NAME + ']' AS Truncate_Statement

    Ciao

      

    Sergio Govoni

    Microsoft Data Platform MVP | MVP Profile | English Blog | Twitter | LinkedIn

    martedì 19 marzo 2019 23:54
    Moderatore
  • Fantastico!!!... funziona!!) 

    Ho dovuto escludere però dal TRUNCATE una tabella per violazione delle foreygn keys... è normale?.. c'è altra soluzione?.. forse eseguendo il delete ??....

    Altra cosa.... per eseguire i comandi ho copiato ed incollato il risultato della colonna Truncate_statement... è corretot o dovevo usare un'altro procedimento?...

    Grazie mille intanto...


    Marco

    martedì 26 marzo 2019 11:24

  • Ho dovuto escludere però dal TRUNCATE una tabella per violazione delle foreygn keys... è normale?.. c'è altra soluzione?.. forse eseguendo il delete ??....

    E' una delle limitazioni del comando TRUNCATE. Preso da Docs: "Non è possibile utilizzare TRUNCATE TABLE sulle tabelle a cui fa riferimento un vincolo FOREIGN KEY. È possibile troncare una tabella con una chiave esterna che fa riferimento alla tabella stessa". Qui trovi tutti i dettagli. Il comando DELETE non ha questa specifica limitazione.

    Altra cosa.... per eseguire i comandi ho copiato ed incollato il risultato della colonna Truncate_statement... è corretot o dovevo usare un'altro procedimento?...

    E' corretto.

    Ciao!


    Sergio Govoni

    Microsoft Data Platform MVP | MVP Profile | English Blog | Twitter | LinkedIn

    giovedì 28 marzo 2019 23:02
    Moderatore
  • Riprendo l'argomento perchè mi sono incuriosito per lo script.. 

    Avreste un esempio di come potrei assegnare ad una variabile il valore del Truncate da eseguire?....

    Potrei poi salvare lo script su una store procedure ed avviarla tramite una pianificazione.. così sarebbe il top!!... però non saprei come creare lo script..


    Marco

    domenica 7 aprile 2019 17:51