martes, 19 de abril de 2011

Obtener cuanto ocupa una tabla y cada uno de los indices de la misma

Por medio de este script podemos obtener el espacio en disco  que ocupa una tabla y el detalle del espacio ocupado por cada uno de los indices de dicha tabla:

RESULTADO:
name      rows            reserved               data                     index_size             unused
-------     -----------          ------------------     ------------------       ----------------            ------------------
Client     10580220    2809928 KB         1408328 KB         1384496 KB         17104 KB

IndexName                                   IndexSizeKB
-------------------------------             --------------------
IX_ForDataView                              933944
IX_tuning_id_include_username        445144
PK_Client                                     1413736


SCRIPT:   (en  la variable  @strNombreTabla se indica la tabla a analizar)
DECLARE @strNombreTabla VARCHAR(50)
SET @strNombreTabla = 'Client'


EXEC sp_spaceused @strNombreTabla
SELECT i.name AS IndexName, SUM(s.used_page_count) * 8 AS IndexSizeKB
FROM sys.dm_db_partition_stats AS s
JOIN sys.indexes AS i
ON s.[object_id] = i.[object_id]
AND s.index_id = i.index_id
WHERE s.[object_id] = object_id(@strNombreTabla )
GROUP BY i.name ORDER BY i.name

jueves, 14 de abril de 2011

Función Recursiva SPLIT , transformar una cadena de texto separada por un caracter (ej coma) en una tabla

Por medio de la sig. función (del tipo recursiva) podemos transformar una cadena de texto en tabla, ej:


Declare @stringtest as varchar(8000)

set @stringtest ='1,2,3,4,5,6,7,8,9'

Select * from [dbo].[Split_returns_Table](@stringtest,',')

RESULTADO:

Id
--
1
2
3
4
5
6
7
8
9

(9 row(s) affected)

FUNCION:

CREATE FUNCTION [dbo].[Split_returns_Table]  
(  
  @Id        varchar(8000),  
  @Separador varchar(8)   --= ','  
)  
RETURNS TABLE  

AS  
RETURN  
(  
  WITH SplitETC (Inicio, Fin)  
    AS  
  (  
       SELECT 1,  
              CHARINDEX(@Separador, @Id)  
    UNION ALL  
       SELECT Fin + LEN(@Separador),  
              CHARINDEX(@Separador, @Id, Fin + LEN(@Separador))  
         FROM SplitETC  
        WHERE Fin > 0  
  )  
  SELECT RTRIM(LTRIM(SUBSTRING(@Id, Inicio, Largo))) Id  
    FROM (SELECT Inicio,  
                 CASE WHEN Fin IS NULL OR Fin = 0 THEN  
                     LEN(@Id) + 1  
                 ELSE  
                     Fin  
                 END  - Inicio  AS Largo  
            FROM SplitETC /*OPTION (MAXRECURSION 0) */) AS Split  
)