Category: SQL Server

  • Script to fix and list out Orphan Users on all the databases on server


    USE MASTER
    GO
    SET NoCount ON
    DECLARE @VarDbId INT,
    @SQL nvarchar(4000),
    @VDBName nvarchar(260),
    @OUCounter INT,
    @Max_OUCounter INT
    SELECT @VarDbId=4,
    @SQL =''
    CREATE TABLE #OrphaneUsers
    (
    ID INT IDENTITY (1,1) NOT NULL,
    DBName VARCHAR(125) NULL ,
    UserName sysname NULL ,
    UserSID VARBINARY(85) NULL ,
    LoginExists bit NULL
    )
    WHILE EXISTS
    (SELECT database_id
    FROM sys.databases
    WHERE database_id>@VarDbId
    AND state_desc ='ONLINE'
    )
    BEGIN
    SELECT TOP 1
    @SQL ='Create table #OrphaneUser

    (UserName sysname null,

    UserSID varbinary(85) null )

    insert into #OrphaneUser exec ' + name+ '.dbo.sp_change_users_login ''report''

    insert into #OrphaneUsers(DBName,UserName,UserSID,LoginExists) select '''+ name+''' as[dbname], UserName, UserSID,0 from #OrphaneUser

    drop Table #OrphaneUser',
    @VDBName=name
    FROM sys.databases
    WHERE database_id>@VarDbId
    AND state_desc ='ONLINE'
    ORDER BY database_id
    EXEC SP_Executesql @SQL
    SELECT TOP 1
    @VarDbId=database_id
    FROM sys.databases
    WHERE database_id>@VarDbId
    AND state_desc ='ONLINE'
    END
    UPDATE #OrphaneUsers
    SET LoginExists=1
    FROM #OrphaneUsers
    JOIN syslogins
    ON #OrphaneUsers.UserName=syslogins.NAME
    SELECT @OUCounter =0,
    @Max_OUCounter =COUNT(0)
    FROM #OrphaneUsers
    WHERE LoginExists=1
    WHILE EXISTS
    (SELECT TOP 1
    id
    FROM #OrphaneUsers
    WHERE LoginExists=1
    AND id >@OUCounter
    )
    BEGIN
    SELECT TOP 1
    @OUCounter=id
    FROM #OrphaneUsers
    WHERE LoginExists=1
    AND id >@OUCounter
    SELECT @SQL ='EXEC '+DBName+'.dbo.sp_change_users_login ''Auto_Fix'', '''+UserName+''', NULL, '''+UserName+''''
    FROM #OrphaneUsers
    WHERE LoginExists=1
    AND id =@OUCounter
    EXEC SP_Executesql @SQL
    PRINT @SQL
    END
    SELECT *
    FROM #OrphaneUsers
    DROP TABLE #OrphaneUsers

  • RAID Levels

    RAID Levels
    RAID 5:-  RAID 5 will provide good performance throughput and prevent data loss if there is a disk failure. For the database which has high read/write activity, RAID 5 will be a better choice when compared to RAID 0 and RAID 1 in terms of data availability and data protection. For an ideal SQL Server configuration, you should have a combination of RAID 1 and RAID 5. You should mirror the operating system using RAID 1, and place transaction logs on a RAID 1 that is separate from the RAID 1 that hosts the operating system. SQL Server writes data to the transaction logs and maintains serial information of all modifications that occurred in a SQL database. The transaction log files can be used for rollback and roll forward of information from a SQL Server database. The SQL Server files and filegroups should be placed on a RAID 5, because you get best performance throughput by placing database files on RAID 5 disk array.

    RAID 10 RAID 10 is a better choice than RAID 5, but RAID 10 would be more expensive than RAID 5. RAID 10 is a combination of RAID 0+1, which is known as striping with mirroring. You should first mirror disks and then create a stripe set of mirrored disks. This provides high fault tolerance for data and excellent throughput performance.

    RAID 1 RAID 1 is known as disk mirroring. You need a minimum of two disks to form a RAID 1 array. One primary disk is used for read/write operations and the data is replicated to the second disk. This RAID level offers better read performance but slower write performance.

    RAID 0 RAID 0 is known as disk striping. This RAID level stripes data across disks in the array, offering better throughput on the read/write operations. However, there is no data protection offered in this RAID level. If one disk fails, the data stored on the disk will be lost.

  • Max Degree of Parallelism and MAXDOP

    Max Degree of Parallelism
    If you do not want to use all of the installed processors in your SQL Server operations, you can limit the use of processors by configuring the processor value to a lower number than the actual number of processors installed. For instance, if a server has four processors and you want to use only three for parallelism, then you should set the max degree of parallelism option to 3.

    The default option, 0, uses the actual number of processors installed in the system for the parallel execution plans of queries and index operations.

    sp_configure ‘max degree of parallelism’, 6;
    GO
    RECONFIGURE WITH OVERRIDE;
    GO

    MAXDOP
    When you want to use a specific number of processors for an individual query or index operation, you can use the MAXDOP query hint or index option to provide better control. MAXDOP overrides the settings defined in the max degree of parallelism option. The use of MAXDOP is limited to the execution of a query that contains the MAXDOP query hint or index option.

    Use below extended procedure to get the number of processors.
    EXECUTE xp_msver ‘ProcessorCount’

    Example
    SELECT
    database_id AS databaseID
    , QUOTENAME(DB_NAME(database_id)) AS ‘databaseName’
    , [OBJECT_ID] AS objectID
    , index_id AS indexID
    , partition_number AS partitionNumber
    , avg_fragmentation_in_percent AS fragmentation
    , page_count
    , 0 AS ‘defragStatus’ /* 0 = unprocessed, 1 = processed */
    FROM sys.dm_db_index_physical_stats (@databaseID, OBJECT_ID(@tableName), Null , Null, @scanMode)
    WHERE avg_fragmentation_in_percent >= 30
    And index_id > 0
    And page_count > 8 — ignore objects with less than 1 extent
    And index_level = 0 — leaf-level nodes only, supports @scanMode
    OPTION (MaxDop 2);

  • Join Me on dotnetSpider.com

    Dear Readers

    Hope you are doing well and enjoying all these database articles. I am also helping the user community on dotnetSpider.com

    I am requesting you to join  http://www.dotnetspider.com, which is a very good site for knowledge sharing. The most attractive feature of the site is, it has a revenue sharing program in association with Google. When you post any content or share your knowledge through various sections like Discussion Forums, 90% of the revenue generated from Google Advertisement in those pages are shared with the authors.

    Since the revenue sharing program is approved by Google and the revenue is paid to members directly by Google when it reaches certain minimum limit, this is a very reliable program to earn some pocket money during your free time.

    If you plan to join this site, please use my user id (tojugalshah123) as the referrer so I will be added in your buddy list

    regards,
    Jugal Shah