1-Funcion para calcular el Digito de control de un ean13
3-Fecha de ultima actualización de estadisticas
4-Consulta que nos da el filegroup (archivo) de todas las tablas (fileid)
6-Funciones con archivos (texto) leer o escribir
7-Indices de una tabla o de todas las tablas
8-Rango de registros numericos correlativos (grupos)
9-Reindex de las tablas con un valor de fragmentacion alto (parametrizable)
10-Fragmentacion de las tablas que queramos comprobar
11-Vista para ver los bloqueos
12-Vista para ver los bloqueos detallados
13-Sqls para calcular los primero y ultimos dias de mes
14-Trigger para el control de lo borrado en una tabla
15-Extraer la hora de una fecha y trabajar con horas.
17-Saber el tamaño que ocupan las tablas de la BD.
18-Saber el nº de filas que ocupan las tablas e indices de la BD.
19-Uso que tienen los indices.
20-Uso que tienen los indices, fragmentacion y ult fecha act. estadisticas.
21-Numero de filas de las tablas de un datafile,de una bd o de una tabla
21-Tambien nos da las tablas que componenen un Datafile
23-Buscar todas las tablas que contienen una columna.
1-FUNCION PARA CALCULAR DIGITO CONTROL EN SQL EAN 13
CREATE FUNCTION Dc_ean13
--para utilizarla hay que escribir dbo.Dc_ean13(0101010101010,1)
(@ean as char(13),@control as bit) --si el valor es 1 indica que el ean lleva el DC
returns int
AS
BEGIN
declare @x int
declare @mult int
declare @y float
declare @dc int
declare @mod float
if @control = 1 set @ean=left(@ean,len(@ean)-1)
while len(@ean)<12
begin
set @ean='0'+ @ean
end--si el codigo es inferior a 13 añade 0
set @mult=3 --valor inicial de multiplicado
set @y=0
set @x=12
while @x>0
begin
set @y=@y+(substring(@ean,@x,1))* @mult
if @mult=1 set @mult=3 else set @mult=1
set @x=@x-1
end
set @mod= round((@y/10 - round(@y/10,0,1))*10,0)
set @dc=(10-@mod)
if @dc=10 set @dc=0
return @dc
END
2-VERSION SQL
SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition')
3-FECHA DE ULTIMA ACTUALIZACION DE LAS ESTADISTICAS
SELECT i.name AS 'Index Name' , STATS_DATE(i.id, i.indid) AS 'Statistics Updated'
FROM sysobjects o INNER JOIN sysindexes i ON o.id = i.id
--WHERE o.name ='TABLA'
WHERE STATS_DATE(i.id, i.indid) IS NULL
4-Consulta que nos da el filegroup (archivo) de todas las tablas (fileid)
SELECT s.groupname, i.id,object_Name(i.id)
FROM sysobjects o, (sysindexes i FULL OUTER JOIN
sysfilegroups s ON i.groupid = s.groupid)
WHERE ((o.type = 'U') OR
(o.type = 'S')) AND i.indid IN (0, 1) AND i.id = o.id
5-Crear usuario
EXEC sp_addlogin 'usuario','','bdatos','Spanish'
6-Funciones con archivos (texto) leer o escribir
Sp_configure 'show advanced options', 1;
--para activar las opciones avanzadas del servidor
RECONFIGURE WITH OVERRIDE;
--para que quede activado
sp_configure 'Ad Hoc Distributed Queries', 1;
--para permitir el uso de openrowset que por defecto esta desactivado
RECONFIGURE WITH OVERRIDE;
--para que quede activado
--LEER DESDE ARCHIVO
select * from OpenRowset('MSDASQL', 'Driver={Microsoft Text Driver (*.txt; *.csv)};
DefaultDir=C:\;','select * from
LOG.TXT')
--LEER DESDE ARCHIVO
SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'Text;Database=c:\',LOG#txt)
--ESCRIBIR DESDE ARCHIVO.
INSERT OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'Text;Database=c:\',LOG#txt)
SELECT 'HOLA' AS FECHA
7-Indices de una tabla o de todas las tablas
CREATE VIEW dbo.[Indices de una tabla]
AS
SELECT TOP 100 PERCENT dbo.sysindexes.id, dbo.sysobjects.name AS Tabla, dbo.sysindexes.name AS Indice, dbo.syscolumns.name AS [Column]
FROM dbo.syscolumns INNER JOIN
dbo.sysindexkeys ON dbo.syscolumns.colid = dbo.sysindexkeys.colid AND dbo.syscolumns.id = dbo.sysindexkeys.id INNER JOIN
dbo.sysindexes ON dbo.sysindexkeys.id = dbo.sysindexes.id AND dbo.sysindexkeys.indid = dbo.sysindexes.indid INNER JOIN
dbo.sysobjects ON dbo.sysindexes.id = dbo.sysobjects.id
ORDER BY dbo.sysindexkeys.indid, dbo.sysindexkeys.keyno
8-Rango de registros numericos correlativos (grupos)
SELECT max([Nº mov.]) from dbo.[tabla de movimientos]
--Rango de registros correlativos existentes
SELECT [Nº mov.] as ini,
isnull((SELECT min([Nº mov.]) FROM dbo.[tabla de movimientos] AS mp
WHERE (NOT EXISTS
(SELECT [Nº mov.]
FROM dbo.[tabla de movimientos] AS mp1
WHERE mp1.[Nº mov.]>=m.[Nº mov.] and (mp1.[Nº mov.] = mp.[Nº mov.] + 1)))
and mp.[Nº mov.]>= m.[Nº mov.] ) ,[Nº mov.]) as fin
FROM dbo.[tabla de movimientos] AS m
WHERE (NOT EXISTS
(SELECT [Nº mov.]
FROM dbo.[tabla de movimientos] AS m1
WHERE ([Nº mov.] = m.[Nº mov.] - 1)))
ORDER BY [Nº mov.]
--Rango de registros correlativos no existentes
SELECT [Nº mov.]+1 as ini,
(SELECT MIN([Nº mov.])-1 AS fin
FROM dbo.[tabla de movimientos] AS m2
WHERE ([Nº mov.] > m.[Nº mov.])) AS Expr1
FROM dbo.[tabla de movimientos] AS m
WHERE (NOT EXISTS (SELECT [Nº mov.]
FROM dbo.[tabla de movimientos] AS m1
WHERE ([Nº mov.] = m.[Nº mov.] + 1))) and [Nº mov.]<(SELECT max([Nº mov.]) from dbo.[tabla de movimientos])
ORDER BY [Nº mov.]
9-Reindex de las tablas con un valor de fragmentacion alto (parametrizable)
-- Declare variables
use basedatos
SET NOCOUNT ON
DECLARE @tablename VARCHAR (128)
DECLARE @execstr VARCHAR (255)
DECLARE @objectid INT
DECLARE @indexid INT
DECLARE @frag DECIMAL
DECLARE @maxfrag DECIMAL
-- Decide on the maximum fragmentation to allow
SELECT @maxfrag = 25.0
-- Declare cursor
DECLARE tables CURSOR FOR
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
-- Create the table
DROP TABLE #fraglist
CREATE TABLE #fraglist (
ObjectName CHAR (255),
ObjectId INT,
IndexName CHAR (255),
IndexId INT,
Lvl INT,
CountPages INT,
CountRows INT,
MinRecSize INT,
MaxRecSize INT,
AvgRecSize INT,
ForRecCount INT,
Extents INT,
ExtentSwitches INT,
AvgFreeBytes INT,
AvgPageDensity INT,
ScanDensity DECIMAL,
BestCount INT,
ActualCount INT,
LogicalFrag DECIMAL,
ExtentFrag DECIMAL)
-- Open the cursor
OPEN tables
-- Loop through all the tables in the database
FETCH NEXT
FROM tables
INTO @tablename
WHILE @@FETCH_STATUS = 0
BEGIN
-- Do the showcontig of all indexes of the table
INSERT INTO #fraglist
EXEC ('DBCC SHOWCONTIG (''[' + @tablename + ']'')
WITH FAST, TABLERESULTS, ALL_INDEXES, NO_INFOMSGS')
FETCH NEXT
FROM tables
INTO @tablename
END
-- Close and deallocate the cursor
CLOSE tables
DEALLOCATE tables
-- Delete the temporary table
-- DROP TABLE #fraglist
SELECT * FROM #fraglist WHERE LogicalFrag >= @maxfrag order by ObjectName
SELECT distinct 'DBCC DBREINDEX (''[' + (rtrim (ObjectName))+']'')' FROM #fraglist WHERE LogicalFrag >= @maxfrag
go
10-Fragmentacion de las tablas que queramos comprobar
--Las estadísticas Avg. Bytes free per page y Avg. Page density (full) del conjunto de resultados indican el llenado de las páginas de índice. El número de Avg. Bytes free per page debería ser bajo y el de Avg. Page density (full) debería ser alto para un índice que no tenga muchas inserciones aleatorias. Quitar y volver a crear un índice con la opción FILLFACTOR especificada puede mejorar estas estadísticas. Además, ALTER INDEX con REORGANIZE compactará un índice, teniendo en cuenta FILLFACTOR, lo que mejorará las estadísticas.
--Nota:
--En un índice que contenga muchas inserciones aleatorias y páginas muy llenas se produce un aumento de las divisiones de páginas. Esto aumenta a su vez la fragmentación.
--El nivel de fragmentación de un índice puede determinarse de las siguientes formas:
--Mediante la comparación de los valores de Extent Switches y Extents Scanned.
--El valor de Extent Switches debe ser lo más parecido posible al de Extents Scanned. Esta relación se calcula como el valor de Scan Density. Dicho valor debe ser lo más alto posible y se puede aumentar mediante la reducción de la fragmentación del índice.
--Nota:
--Este método no funciona si el índice abarca varios archivos.
--Mediante la comprensión de los valores de Logical Scan Fragmentation y Extent Scan Fragmentation.
--El valor de Logical Scan Fragmentation y, en menor medida, el valor de Extent Scan Fragmentation ofrecen la mejor indicación del nivel de fragmentación de una tabla. Ambos valores deberían tender a cero tanto como fuera posible, aunque puede ser aceptable un valor entre el 0 y el 10 por ciento.
--Nota:
--El valor de Extent Scan Fragmentation es alto si el índice abarca varios archivos. Para reducir estos valores, debe reducir la fragmentación del índice.
--inserta en una tabla la informacion de fragmentacion de las tabla contenidas en la select
--el showcontig puede ser detallado o rapido( opcion fast)
SET NOCOUNT ON
DECLARE @tablename VARCHAR (128)
DECLARE @execstr VARCHAR (255)
DECLARE @objectid INT
DECLARE @indexid INT
DECLARE @frag DECIMAL
DECLARE @maxfrag DECIMAL
-- Decide on the maximum fragmentation to allow
SELECT @maxfrag = 30.0
-- Declare cursor
DECLARE tables CURSOR FOR
SELECT '['+TABLE_NAME+']'
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE' and TABLE_NAME LIKE '%Mov.%' --filtros de tabla
-- Create the table
CREATE TABLE DatosMigracion.dbo.M_fraglist_Nav4_03 (
ObjectName CHAR (255),
ObjectId INT,
IndexName CHAR (255),
IndexId INT,
Lvl INT,
CountPages INT,
CountRows INT,
MinRecSize INT,
MaxRecSize INT,
AvgRecSize INT,
ForRecCount INT,
Extents INT,
ExtentSwitches INT,
AvgFreeBytes INT,
AvgPageDensity INT,
ScanDensity DECIMAL,
BestCount INT,
ActualCount INT,
LogicalFrag DECIMAL,
ExtentFrag DECIMAL)
-- Open the cursor
OPEN tables
-- Loop through all the tables in the database
FETCH NEXT
FROM tables
INTO @tablename
WHILE @@FETCH_STATUS = 0
BEGIN
-- Do the showcontig of all indexes of the table
INSERT INTO DatosMigracion.dbo.M_fraglist
EXEC ('DBCC SHOWCONTIG (''' + @tablename + ''')
WITH TABLERESULTS, ALL_INDEXES,ALL_LEVELS')
FETCH NEXT
FROM tables
INTO @tablename
END
-- Close and deallocate the cursor
CLOSE tables
DEALLOCATE tables
--SELECT TOP 100 PERCENT dbo.M_fraglist.*
--FROM dbo.M_fraglist_Nav3_70
--WHERE (LogicalFrag > 30)
--ORDER BY AvgRecSize * CONVERT(FLOAT, CountRows) DESC
--Esta sql nos da los objetos con fragmentacion superior a 30 y ordenados por tamaño desc
11-Vista para ver los bloqueos
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[X_50 Bloqueos]') and OBJECTPROPERTY(id, N'IsView') = 1)
drop view [dbo].[X_50 Bloqueos]
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
CREATE VIEW dbo.[X_50 Bloqueos]
AS
SELECT TOP 100 PERCENT CONVERT(char(20), sp1.loginame) AS loginame, sp1.spid, CONVERT(char(20), sp2.loginame) AS [Bloqueado por],
sp1.waittime * 0.001 AS [Tiempo/Espera Sg.], sp1.waitresource, ROUND(sp1.cpu * 0.000001, 2) AS [Time CPU], ROUND(sp1.physical_io * 0.001, 0)
AS [Time Disco], sp1.status, sp1.hostname AS Ordenador, sp1.program_name AS Programa
FROM master.dbo.sysprocesses sp1 LEFT OUTER JOIN
master.dbo.sysprocesses sp2 ON sp1.blocked = sp2.spid
WHERE (sp1.dbid = 7) --base de datos
ORDER BY sp1.waittime, sp1.loginame
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
12-Vista para ver los bloqueos detallados
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[X_50 Bloqueos detallados]') and OBJECTPROPERTY(id, N'IsView') = 1)
drop view [dbo].[X_50 Bloqueos detallados]
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
CREATE VIEW dbo.[X_50 Bloqueos detallados]
AS
SELECT DISTINCT TOP 100 PERCENT dbo.sysobjects.name AS tabla, lock.rsc_type AS [tipo de recurso], lock.req_mode AS [tipo bloqueo], proces.loginame
FROM master.dbo.sysprocesses proces INNER JOIN
master.dbo.syslockinfo lock ON proces.spid = lock.req_spid LEFT OUTER JOIN
dbo.sysobjects ON lock.rsc_objid = dbo.sysobjects.id
WHERE (lock.rsc_objid <> 0) AND (lock.rsc_dbid = 7)GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
13- Sql para calcular primero y ultimos dias de mes
DECLARE @FECHA AS DATETIME
SET @FECHA = CONVERT(VARCHAR,GETDATE(),112) --para quitar horas y minutos
SELECT DATEADD(day, -Day(@FECHA), @FECHA) --ULTIMO DIA DEL MES ANTERIOR
SELECT DATEADD(day, 1-Day(@FECHA), @FECHA) --PRIMER DIA DEL MES
SELECT DATEADD(day, -Day(@FECHA), dateadd(month,1,@FECHA)) --ULTIMO DIA DEL MES
GO
14 - Trigger para el control de borrado de una tabla
CREATE TRIGGER [log_de_la_tabla] ON [dbo].[tabla]
FOR DELETE AS --hay que crear la tabla temporal, con los campos que creamos necesarios, la tabla deteted es una tabla con los mismos campos que la tabla origen
insert tmp_log_tabla select [campo1],SYSTEM_USER as user, 'Delete' as funcion ,getdate() as fecha from deleted
GO
15-Extraer la hora de una fecha y trabajar con horas.
declare @fecha as datetime
set @fecha=getdate()
select convert(varchar,@fecha,108)
select convert(varchar,@fecha,114)
select convert(varchar,@fecha,112) --formato numerio muy util para keys de tabla
select dateadd(year,-146,convert(datetime,convert(varchar,@fecha,108),108))--hay programas que utilizan un fecha fija para representar horas
GO
16-Vaciar el Log.
backup log [NAVISION] with truncate_only
GO
17-Saber el tamaño que ocupan las tablas de la BD.
--En bd con muchas tablas puede tardar bastante.
--Se puede ejecutar otra consulta que solo mira el nº de filas
--drop table #tblResults
CREATE TABLE #tblResults
(
[name] nvarchar(60),
[rows] int,
[reserved] varchar(30),
[reserved_int] int default(0),
[data] varchar(30),
[data_int] int default(0),
[index_size] varchar(30),
[index_size_int] int default(0),
[unused] varchar(30),
[unused_int] int default(0)
)
-- Populate the temp table...
EXEC sp_MSforeachtable @command1=
"INSERT INTO #tblResults
([name],[rows],[reserved],[data],[index_size],[unused])
EXEC sp_spaceused '?'"
-- Strip out the " KB" portion from the fields
UPDATE #tblResults SET
[reserved_int] = CAST(SUBSTRING([reserved], 1,
CHARINDEX(' ', [reserved])) AS int),
[data_int] = CAST(SUBSTRING([data], 1,
CHARINDEX(' ', [data])) AS int),
[index_size_int] = CAST(SUBSTRING([index_size], 1,
CHARINDEX(' ', [index_size])) AS int),
[unused_int] = CAST(SUBSTRING([unused], 1,
CHARINDEX(' ', [unused])) AS int)
-- Return the results...
SELECT * FROM #tblResults order by len(data) desc,data desc
GO
18-Saber el nº de filas que ocupan las tablas e indices de la BD.
select si.rows as 'filas', SO.Name as Tabla, SI.name as 'Index', SFG.groupname
as 'Filegroup'
from sysobjects as SO
join sysindexes as SI
on SO.Id = SI.id
join sysfilegroups as SFG
on SI.GroupId = SFG.GroupId
order by si.rows desc, SO.Name , SI.name, SFG.GroupName
GO
19-Uso de indices
-- Esta sql nos da el uso de los indices de una bd o de las tablas que designemos.
-- Tambien no da los indices no usados.
-- Estas consultas estan extraidas del blog de Eladio Rincon http://blogs.solidq.com/ES/erincon/default.aspx
IF NOT OBJECT_ID ('tempdb.dbo.##objetos') IS NULL DROP TABLE ##objetos
SELECT DB_ID() as database_id, db_name() as database_name, so.id as object_id, so.name as object_name, si.indid as index_id, si.name as index_name, so.xtype as type_desc,si.rows as num_filas into ##objetos FROM
sysobjects so join sysindexes si on so.id = si.id WHERE so.id > 0 -- and so.name like 'tabla%'
SELECT 'INDICES QUE NO SE HAN USADO'
SELECT o.database_id, o.object_id, o.index_id, o.database_name, o.object_name,
o.index_name, o.type_desc,o.num_filas
FROM dbo.##objetos AS o LEFT OUTER JOIN
sys.dm_db_index_usage_stats AS dmv ON o.database_id = dmv.database_id AND o.object_id
= dmv.object_id AND o.index_id = dmv.index_id
WHERE (dmv.database_id IS NULL)
SELECT 'Uso de Indices'
SELECT o.database_id, o.object_id, o.index_id, o.database_name, o.object_name,
o.index_name, o.type_desc,o.num_filas,dmv.user_seeks, dmv.user_scans, dmv.user_lookups,
dmv.user_updates
FROM dbo.##objetos AS o INNER JOIN
sys.dm_db_index_usage_stats AS dmv ON o.database_id = dmv.database_id AND o.object_id
= dmv.object_id AND o.index_id = dmv.index_id
/*
user_seeks Número de consultas de búsqueda realizadas por el usuario.
user_scans Número de consultas de recorrido realizadas por el usuario.
user_lookups Número de búsquedas realizadas por consultas de usuario.
user_updates Número de consultas de actualización realizadas por
el usuario.
system_seeks Número de consultas de búsqueda realizadas por el
sistema.
system_scans Número de consultas de recorrido realizadas por el sistema.
system_lookups Número de búsquedas realizadas por consultas del
sistema.
system_updates Número de consultas de actualización realizadas
por el sistema. */
20-Uso de indices y fragmentación
SELECT I.[Object_Id],
Dense_Rank() OVER (ORDER BY S.Name, T.Name) AS L1,
Rank() OVER (PARTITION BY S.Name, T.Name ORDER BY I.Name) AS L2,
S.Name AS [Esquema],
T.Name AS [Tabla],
I.Name AS [Índice],
CASE I.Type WHEN 1 THEN 'Agrupado' WHEN 2 THEN 'No agrupado'
WHEN 3 THEN 'XML'
END AS [Tipo de Índice],
CASE I.Is_Unique WHEN 1 THEN 'Sí' ELSE 'No' END AS [Único],
CASE I.Is_Hypothetical WHEN 1 THEN 'Sí' ELSE 'No' END AS
[Hipotético],
CASE WHEN U.User_Seeks IS NULL THEN '' ELSE Convert(VARCHAR,
U.User_Seeks)
END AS [Búsquedas de Usuario],
CASE WHEN U.User_Scans IS NULL THEN '' ELSE Convert(VARCHAR,
U.User_Scans)
END AS [Recorridos U],
CASE WHEN U.User_Lookups IS NULL THEN '' ELSE Convert(VARCHAR,
U.User_Lookups)
END AS [Lookups U],
CASE WHEN U.User_Updates IS NULL THEN '' ELSE Convert(VARCHAR,
U.User_Updates)
END AS [ActualizacionesU],
CASE WHEN U.Last_User_Seek IS NULL THEN '' ELSE Convert(VARCHAR,
U.Last_User_Seek, 113)
END AS [Última Búsqueda de Usuario],
CASE WHEN U.Last_User_Scan IS NULL THEN '' ELSE Convert(VARCHAR,
U.Last_User_Scan, 113)
END AS [Último Recorrido U],
CASE WHEN U.Last_User_Lookup IS NULL THEN '' ELSE
Convert(VARCHAR, U.Last_User_Lookup, 113)
END AS [Último Lookup U],
CASE WHEN U.Last_User_Update IS NULL THEN '' ELSE
Convert(VARCHAR, U.Last_User_Update, 113)
END AS [Última Actualización U],
CASE WHEN U.System_Seeks IS NULL THEN '' ELSE Convert(VARCHAR,
U.System_Seeks)
END AS [Búsquedas del Sistema],
CASE WHEN U.System_Scans IS NULL THEN '' ELSE Convert(VARCHAR,
U.System_Scans)
END AS [Recorridos S],
CASE WHEN U.system_Lookups IS NULL THEN '' ELSE Convert(VARCHAR,
U.System_Lookups)
END AS [Lookups S],
CASE WHEN U.System_Updates IS NULL THEN '' ELSE Convert(VARCHAR,
U.System_Updates)
END AS [Actualizaciones S],
CASE WHEN U.Last_System_Seek IS NULL THEN '' ELSE
Convert(VARCHAR, U.Last_System_Seek, 113)
END AS [Última Búsqueda del Sistema S],
CASE WHEN U.Last_System_Scan IS NULL THEN '' ELSE
Convert(VARCHAR, U.Last_System_Scan, 113)
END AS [Último Recorrido S],
CASE WHEN U.Last_System_Lookup IS NULL THEN '' ELSE
Convert(VARCHAR, U.Last_System_Lookup, 113)
END AS [Último Lookup S],
CASE WHEN U.Last_System_Update IS NULL THEN '' ELSE
Convert(VARCHAR, U.Last_System_Update, 113)
END AS [Última Actualización S]
,ROUND(frag.avg_fragmentation_in_percent,0) AS [fragmentación externa
<10], ROUND(frag.avg_page_space_used_in_percent,0) AS [fragmentación
interna >75]
,STATS_DATE(I.[Object_Id], I.[Index_Id]) AS 'Statistics Updated'
FROM sys.indexes AS I -- Indexes
INNER JOIN sys.tables T -- Tables
ON (T.[Object_Id] = I.[Object_Id])
INNER JOIN sys.schemas S -- Schemas
ON (S.[Schema_Id] = T.[Schema_Id])
LEFT JOIN sys.dm_db_index_usage_stats AS U -- Usage Statistics
ON U.[database_id] = (SELECT db_id())
AND U.[Object_Id] = I.[Object_Id] AND U.[Index_Id] =
I.[Index_Id]
--establezco manualmente el id de la bd y de la tabla debido a que puede haber
muchas tablas si no se quiere filtrar por tabla cambiarlo por null
--Si la tabla e indices son muy grandes se puede cambiar detailed a null, en
este caso no nos dara tanta informacion ya que solo scannea un 1%
--solo se compueba el nivel + bajo index_level=0
INNER join sys.dm_db_index_physical_stats(7,164963714,null,null,'DETAILED')
as frag on frag.object_id=I.[Object_Id] and frag.index_id=I.[Index_Id] and index_level=0
WHERE I.[type] <> 0
AND ObjectProperty(I.[object_id], 'IsUserTable') = 1
AND T.Name LIKE 'Histórico cab. albarán compra%'
--ORDER BY S.Name, T.Name, I.Name;
ORDER BY U.User_Seeks * 10 + U.User_Scans desc
21-Numero de filas de las tablas de un datafile o de una bd
select top 100 SI.rows , SO.name , SI.name,SFG.groupname
from sysobjects as SO inner
join sysindexes as SI
on SO.id = SI.indid
join sysfilegroups as SFG
on SI.groupid = SFG.groupid
where SFG.groupname='Data Filegroup 8'
order by SI.rows desc
22-Ver - Leer el LOG util para recuperar parte de un log de
esta manera podemos saber en que momento se realizo una consulta
DBCC LOG (PARROT, 2)
--OR
SELECT * FROM ::fn_dblog(null, null)
23-Buscar todas las tablas que contienen una columna.
select * from INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME LIKE '%nombre columna%'