• RSS
  • Delicious
  • Digg
  • Facebook
  • Twitter
  • Linkedin
  • Youtube

SQL :: Mărimea tabelelor

AlexB miercuri, 14 martie 2012, 12:52 5 comentarii

De multe ori, nu te multumesti sa stii cat ocupa o baza de date din SQL Server (chiar! de ce spune ‘ocupa’? Nu se poate zice ‘cantareste’?), ci te intereseaza cat ocupa fiecare tabel in parte.

Pentru a determina marimea tabelelor poti proceda asa. Creezi urmatoarea procedura stocata si apoi o apelezi.

CREATE PROCEDURE GetAllTableSizes
AS
/*
    Obtains spaced used data for ALL user tables in the database
*/
DECLARE @TableName VARCHAR(100)    --For storing values in the cursor

--Cursor to get the name of all user tables from the sysobjects listing
DECLARE tableCursor CURSOR
FOR 
select [name]
from dbo.sysobjects 
where  OBJECTPROPERTY(id, N'IsUserTable') = 1
FOR READ ONLY

--A procedure level temp table to store the results
CREATE TABLE #TempTable
(
    tableName varchar(100),
    numberofRows varchar(100),
    reservedSize varchar(50),
    dataSize varchar(50),
    indexSize varchar(50),
    unusedSize varchar(50)
)

--Open the cursor
OPEN tableCursor

--Get the first table name from the cursor
FETCH NEXT FROM tableCursor INTO @TableName

--Loop until the cursor was not able to fetch
WHILE (@@Fetch_Status >= 0)
BEGIN
    --Dump the results of the sp_spaceused query to the temp table
    INSERT  #TempTable
        EXEC sp_spaceused @TableName

    --Get the next table name
    FETCH NEXT FROM tableCursor INTO @TableName
END

--Get rid of the cursor
CLOSE tableCursor
DEALLOCATE tableCursor

--Select all records so we can use the reults
SELECT * 
FROM #TempTable

--Final cleanup!
DROP TABLE #TempTable

GO

Pentru mai multe informatii vezi aici: http://www.mitchelsellers.com/blogs/2007/07/27/determing-sql-server-table-size.aspx

Care ar fi alte modalitati?

PS. Presimt ca astia cu mysql-ul se vor umfla iarasi in pene… :p

   

Comentarii Facebook

5 comentarii pana acum. Si tu poti sa comentezi!

  1. Dan spune:

    Ce folosesc eu, pe Azure si local Sql Server 2008:

    select
    sum(reserved_page_count) * 8.0 / 1024
    from
    sys.dm_db_partition_stats

    select
    sys.objects.name, sum(reserved_page_count) * 8.0 / 1024
    from
    sys.dm_db_partition_stats, sys.objects
    where
    sys.dm_db_partition_stats.object_id = sys.objects.object_id

    group by sys.objects.name

    Primul select pentru toata baza de date, urmatorul pentru tabele.

  2. Carmen spune:

    Posibiliate 1.

    Pui un parametru la procedura, parametru care nu se poate chema altfel decat @TableName. Modificam procedura. Ea va trebui sa afiseze la final: pe prima linie tabelul din parametru si care prezinta interes pentru noi; pe urmatoarele linii restul tabelurilor si spatiul de depozitare folosit, in ordine absolut intamplatoare.

    E obligatoriu sa facem asa, ca sa nu cautam via scroll prin cele 950 de randuri afisate.

    Posibilitate 2. Numai pentru experti.

    Click dreapta pe tabel -> Properties -> Storage

    :D

  3. AlexB spune:

    P1. Da, se pot face variatiuni pe aceeasi tema.

    P2. …si se recomanda SQL Server Management Studio-ul intr-o mana si Excelul in cealalta… :)

  4. Carmen spune:

    Un expert ar trebui sa aiba doua. Monitoare. Zic si eu, nu ma puneti la zid…

  5. AlexB spune:

    Multumesc, Dan. Scuze, doar acum am vazut comentariul tau. :)