martes, 2 de septiembre de 2014

miércoles, 11 de julio de 2012

Buscar texto dentro de los sp, vw, fx

Hola, buen día

con esta instrucción se puede ubicar cualquier texto(puede ser nombre de tabla, campo, nombre de objeto) que sean utilizados dentro de los los sp, vw o fx.


select distinct 'sp_helptext ', S.Name 
From Sysobjects S
Inner join Syscomments SC on S.Id = SC.ID
where SC.Text like '%Nombre_a_buscar%'
and   S.xType in ('P', 'FN', 'V')
Order by 2

espero les sirva

martes, 10 de julio de 2012

Resource Governor




Resource Governor es poder controlar consultas determinadas y poder adjudicarles una cantidad específica de recursos. Para lograrlo, todas las conexiones que se realizan contra el SQL Server pasan por unclasificador, que se encarga de asignar un grupo a cada sesión en base a una función de clasificación. A estos grupos les podemos asignar un pool , que se encarga de otorgar ylimitar los recursos (CPU y memoria). 

Con este query podemos identificar las consultas que ingresen con el aplicativo MS SQL Query Analyzer, si es así, se le asigna el recurso desarrollo, que solo tendrá un 10% de uso de CPU.



/****** Object:  ResourcePool [desarrollo]    Script Date: 12/10/2010 16:26:57 ******/
CREATE RESOURCE POOL [desarrollo] WITH(min_cpu_percent=0, 
           max_cpu_percent=10, 
           min_memory_percent=0, 
           max_memory_percent=10)

GO



/****** Object:  WorkloadGroup [desarrollo]    Script Date: 12/10/2010 16:29:42 ******/
CREATE WORKLOAD GROUP [desarrollo] WITH(group_max_requests=0, 
           importance=Low, 
           request_max_cpu_time_sec=0, 
           request_max_memory_grant_percent=25, 
           request_memory_grant_timeout_sec=0, 
           max_dop=0) USING [desarrollo]
GO


USE [master]
GO

/****** Object:  UserDefinedFunction [dbo].[clasificacionrecursos]    Script Date: 12/10/2010 16:38:25 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [dbo].[clasificacionrecursos] ()
RETURNS SYSNAME WITH SCHEMABINDING
BEGIN
declare @GRUPO  AS sysname
DECLARE @APP_NAME nvarchar(128)
DECLARE @HOST_NAME nchar

SET @GRUPO = 'default';
SET @APP_NAME = APP_NAME()
SET @HOST_NAME = HOST_NAME()
IF @APP_NAME = 'MS SQL Query Analyzer' or @APP_NAME = 'MICROSOFT SQL SERVER MANAGEMENT STUDIO'
begin
  SET @GRUPO = 'desarrollo';
  ELSE 
  SET @GRUPO = 'default';

 end
RETURN @GRUPO ;
END

GO

ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION= dbo.clasificacionrecursos);
GO
-- Start Resource Governor
ALTER RESOURCE GOVERNOR RECONFIGURE;
GO


jueves, 3 de mayo de 2012

Eliminar Indices Hipoteticos




Los índices hipotéticos (Hypothetical Indexes) son creados por el asistente para la optimización de índices (Index tuning wizard o Database Engine Tuning Advisor) cuando intenta determinar que tablas y que columnas se pueden utilizar en un índice para optimizar las consultas.
Por lo general, se borran todos los índices hipotéticos cuando se sale del asistente para optimización de índices. Esto sucede sin problemas cuando termina limpiamente, pero si falla, cancela, o no termina correctamente, entonces estos índices hipotéticos pueden quedar en la base de datos.

Con este script podemos ver y luego decidir si se eliminan dichos indices:



SET NOCOUNT ON
DECLARE @sSql NVARCHAR(1024)
DECLARE @objid INT
DECLARE @indid TINYINT
DECLARE HypIndexCursor CURSOR FOR
    SELECT id, indid
    FROM sysindexes
    WHERE
            INDEXPROPERTY(id, name, 'IsHypothetical') = 1
            --AND name LIKE 'hind_%'        
    ORDER BY name

OPEN HypIndexCursor
FETCH NEXT FROM HypIndexCursor INTO @objid, @indid
WHILE (@@FETCH_STATUS <> -1)
BEGIN
    SELECT @sSql = (
            SELECT
                CASE WHEN INDEXPROPERTY(i.id, i.name, 'IsStatistics') = 1
                    THEN 'DROP STATISTICS '
                ELSE 'DROP INDEX '
                END
                + QUOTENAME(OBJECT_NAME(i.id)) + '.' + QUOTENAME(i.name)
            FROM sysindexes i
            JOIN sysobjects o
                ON i.id = o.id
            WHERE     i.id = @objid
            AND     i.indid = @indid
            )
   
    --EXEC(@sSql)
    PRINT @sSql
    FETCH NEXT FROM HypIndexCursor INTO @objid, @indid
END
CLOSE HypIndexCursor
DEALLOCATE HypIndexCursor

martes, 10 de abril de 2012

SQL2008: Entendiendo el Waitresource

TOMADO TEXTUALMENTE DE LA PAGINA http://aiellodba.blogspot.com/2011/08/entendiendo-el-waitresource.html

SQL2008: Entendiendo el Waitresource
 
Introduccion
Al ver los xml de bloqueos o deadlocks muchas veces aparecen números casi inentendibles, y uno de los importantes es el WAITRESOURCE. Este número codifica que objeto de la base de datos está participando en la pelea por el bloqueo. El recurso puede principalmente ser:
  • Una tabla
  • Una página
  • Una clave
Puede ser algunas cosas mas pero para simplificar el análisis nos enfocaremos en estos.
Manos a la obra
Lo primero que debemos hacer es identificar cual de las tres cosas es, lo cual es fácil leyendo el texto de wait resourse que puede ser:
“OBJECT: 19:1275867612:10”
“PAGE: 12:1:79868773”
“KEY: 12:397371816017920 (760119e06bff)”
 
En el primer caso es cuando se trata de una tabla. Para este caso (y para los siguientes) lo primero que debemos hacer es analizar el primer número antes del separador (:) . Este número en todos los casos indica el id de la base de datos, por lo tanto debo hacer la siguiente consulta para obtenerla:
SELECT * FROM sys.sysdatabases WHERE Dbid=19
 
Lo cual me da por resultado Mibase. Recordemos esto porque es común a los tres casos.
Ahora siguiendo con el análisis del primer caso la información brindada se debe analizar de la siguiente manera:

OBJECT: dbId:ObjectId:IndexId
Con la salvedad de que indexId vale 0 cuando se trata del heap y 1 cuando se trata de un índice cluster. En otro caso figurará el número del índice.
Para obtener esta información en un formato útil debería hacer las siguientes consultas
 
  1. -- Nota: debo estar situado en MiBase
SELECT OBJECT_NAME(1275867612)
-- O bien
SELECT * FROM MiBase.sys.all_objects WHERE object_id = 1275867612
-- Y para buscar el índice en caso de ser mayor que 1:
SELECT * FROM MiBase.sys.indexes WHERE object_id=1275867612  

De esta forma ya sabemos que table y que índice participaba en el bloqueo.

Para el caso 2 (página) comenzaremos averiguando la base de la misma forma y la siguiente información nos viene como:

PAGE: dbId:FileId:PageId

Si no tenemos nuestra base con varios archivos sino todo en uno del primary el segundo campo siempre será 1.

Para analizar el último debemos obtener la información de la página (79868773 en el ejemplo). Para esto tenemos dos formas:

DBCC TRACEON ( 3604 )

DBCC PAGE (12,1,79868773)

o

DBCC PAGE (12 , 1, 79868773) WITH TABLERESULTS,NO_INFOMSGS

En el primer caso es necesario el traceon porque sino no podemos ver la salida, la cual saldrá en modo texto. En el segundo no es necesario visto que la salida la veremos en modo tabla.

Sea cual fuera el caso que elegimos debemos buscar el renglon (o registro) que tenga la siguiente información:

m_objId (AllocUnitId.idObj) = 1051306955 m_indexId (AllocUnitId.idInd) = 7

 
y con esto obtengo el ObjectId para poder continuar mi análisis como en el caso anterior.

pd. para saber cual es el id del objeto debemos ver la opcion
 
Metadata: ObjectId = 907488099
 
para saber el objeto simplemente utilizamos cualquiera de las opciones descritas anteriormete

SELECT * FROM sys.all_objects WHERE object_id = 907488099
SELECT * FROM sys.indexes WHERE object_id=907488099
SELECT OBJECT_NAME(907488099)


Por último nos queda el caso del índice (KEY: 12:397371816017920 (760119e06bff)). En este caso debemos leerlo como:

KEY: dbId:hObjecto (hash)



El hash puede ser ignorado, visto que no tenemos función para transformarlo (es la gracia de los hash!), así que nos quedaremos con el hObj. Este número se encuentra almacenado en la msdb así que lo podemos utilizar para calcular el objetcId
 

  1. SELECT * FROM MiBase.sys.partitions
WHERE hobt_id = 397371816017920 


De esta consulta obtenemos el object_id y podemos hacer nuestro análisis de siempre.

actualizacion de las estadisticas

Hola a todos!!!

con este script podemos actualizar todas las estadisticas de una base de datos

DECLARE @MaxDaysOld int

DECLARE @SamplePercent int

DECLARE @SampleType nvarchar(50)

SET @MaxDaysOld = 0

SET @SamplePercent = NULL --25

SET @SampleType = 'PERCENT' --'ROWS'

BEGIN TRY

DROP TABLE #OldStats

END TRY

BEGIN CATCH SELECT 1 END CATCH

SELECT

RowNum = ROW_NUMBER() OVER (ORDER BY ISNULL(STATS_DATE(object_id, st.stats_id),1))

,TableName = OBJECT_SCHEMA_NAME(st.object_id) + '.' + OBJECT_NAME(st.object_id)

,StatName = st.name

,StatDate = ISNULL(STATS_DATE(object_id, st.stats_id),1)

INTO #OldStats

FROM sys.stats st WITH (nolock)

--WHERE DATEDIFF(day, ISNULL(STATS_DATE(object_id, st.stats_id),1), GETDATE()) > @MaxDaysOld

ORDER BY ROW_NUMBER() OVER (ORDER BY ISNULL(STATS_DATE(object_id, st.stats_id),1))

DECLARE @MaxRecord int

DECLARE @CurrentRecord int

DECLARE @TableName nvarchar(255)

DECLARE @StatName nvarchar(255)

DECLARE @SQL nvarchar(max)

SET @MaxRecord = (SELECT MAX(RowNum) FROM #OldStats)

SET @CurrentRecord = 1

SET @SQL = ''

WHILE @CurrentRecord <= 100--@MaxRecord

BEGIN

SELECT

@TableName = os.TableName

,@StatName = os.StatName

FROM #OldStats os

WHERE RowNum = @CurrentRecord

SET @SQL = N'UPDATE STATISTICS ' + @TableName + ' ' + @StatName + ' WITH FULLSCAN'

PRINT @SQL

EXEC sp_executesql @SQL

SET @CurrentRecord = @CurrentRecord + 1

END

miércoles, 4 de abril de 2012

tablas system information sql server 2000 vs sql server 2005-2008

Buenos dias

encontre la siguiente tabla donde nos indica las tablas del sistema en sql server 2000 vs las tablas del 2005-2008 como las podemos encontrar.

IDInformationSQL Server 2000SQL Server 2005
1Database system table\view - Source for all databases on the SQL Server to include the name, owner, creation date, etc.
SELECT *
FROM master.dbo.sysdatabases
GO
SELECT *
FROM sys.databases;
GO
2Database files system table\view - Source for the currently connected database's file names, size, location, type (database or log), etc.
SELECT *
FROM dbo.sysfiles
GO
SELECT *
FROM sys.database_files;
GO
3Database files system table\view - Source for all database's file related information
SELECT *
FROM master.dbo.sysaltfiles
GO
SELECT *
FROM sys.master_files;
GO
4IO statistics on database files - Returns the usage statistics on a per file basis-- Single database file
SELECT *
FROM :: fn_virtualfilestats(1, 1)
GO
-- All database files
SELECT *
FROM sys.dm_io_virtual_file_stats(NULL, NULL);
GO
5Database meta data - Returns the pertinent database name, size and remarks
EXEC master.dbo.sp_databases
GO
EXEC master.dbo.sp_databases;
GO
6Database meta data - Fairly complete set of pertinent database information that can return data for all databases or 1 database
-- All databases
EXEC master.dbo.sp_helpdb
GO

-- Single database
EXEC master.dbo.sp_helpdb 'Northwind'
GO
-- All databases
EXEC master.dbo.sp_helpdb;
GO
-- Single database
EXEC master.dbo.sp_helpdb 'AdventureWorks';
GO

7Change database ownership - System stored procedure to change the database owner
EXEC sp_changedbowner sa
GO
EXEC sp_changedbowner sa;
GO
8Database ID to name translation - System function that will provide the database name when passed the database ID from the database system table
-- Returns the master database
SELECT DB_NAME(1)
GO
-- Returns the master database
SELECT DB_NAME(1);
GO
9Database name to ID translation - System function that will provide the database ID when passed the database name from the database system table
-- Returns 1
SELECT DB_ID('master')
GO
-- Returns 1
SELECT DB_ID('master');
GO
10Database status - System function that will return the value for 1 of ~25 database specific valuesSELECT DATABASEPROPERTYEX('master', 'Status')
GO