블로그 이미지
bedbmsguru

Notice

Recent Post

Recent Comment

Recent Trackback

Archive

calendar

1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
  • total
  • today
  • yesterday
2016. 4. 26. 11:18 SQL SERVER


Index Rebuild 시 아래의 에러가 발생할 경우


메시지 1943 수준 16, 상태 1, 줄 1

페이지 수준 잠금이 비활성화되어 있으므로 테이블 "테이블명" 의 인덱스 "인덱스명"을(를) 다시 구성할 수 없습니다.



개발자가 SSMS에서 인덱스를 생성하여 page_locked 옵션 체크가 해제된 상태에서 인덱스를 생성하였음



수정쿼리

ALTER INDEX [인덱스명] ON [테이블명] SET ( ALLOW_PAGE_LOCKS  = ON )




posted by bedbmsguru
2013. 10. 23. 18:02 SQL SERVER

장애로 비정상 종료된 DB를 로그없이 다른 SQL서버 Instance 에서 복원하는 방법





(1) SQL SERVER 2005 이상


1. 복원하고자 하는 database와 같은 이름을 가진 Database를 새로 생성



2. SQL서버를 중지한 다음 복원하려고 하는 MDF파일을 새로만들었던 MDF파일에 덮어쓴다.

그리고 LDF파일은 삭제한다.


3.해당 database를 emergency mode로 변경한다.

alter database ABC set emergency

alter database ABC set single_user -- 먼저 싱글유저 모드로 변경해야함


4. 새로운 로그파일을 생성한다.

alter database ABC rebuild log on

(Name=ABC_log,filename='C:\SQLDAT\ABC_log.ldf')


5. database를 online으로 변경

alter database ABC set online


6. DB를 체크 복구가능한 데이터 복구

DBCC CHECKDB('abc', REPAIR_REBUILD) WITH ALL_ERRORMSGS, NO_INFOMSGS


7.DB체크 결과를 토대로 테이블 복구


--데이터 손실없이 복구 가능한 테이블 복구

dbcc checktable('temp_aaa')


--복구불가능한 데이터는 버리고 테이블 복구

dbcc checktable('temp_aaa', REPAIR_ALLOW_DATA_LOSS) WITH ALL_ERRORMSGS, NO_INFOMSGS


alter database ABC set MULTI_user




(2) SQL SERVER 2000



1. 복원하고자 하는 database와 같은 이름을 가진 Database를 새로 생성

주의:MDF의 이름과 LDF의 이름은 복원하고자하는 DB의 이름과 같아야 한다.


2. SQL서버를 중지한 다음 복원하려고 하는 MDF파일을 새로만들었던 MDF파일에 덮어쓴다.

그리고 LDF파일은 삭제한다.


3. SQL SERVER를 시작하면 해당 Database는 '주의대상' 상태로 표시됨


4. master DB를 업데이트 가능한 상태로 만들어준다.

USE MASTER

GO

sp_CONFIGURE 'allow updates', 1

RECONFIGURE WITH OVERRIDE

GO


5. database의 모드를 emergency mode로 변경한다.

--이 쿼리는 Database의 현재 상태를 볼수 있다 (나중에 다시 복구를 위해 status 값을 기억해 둬야함)

SELECT *

FROM sysdatabases

WHERE name = 'yourdatabasename'


—-status 값을 update

BEGIN TRAN

UPDATE sysdatabases

SET status = 32768

WHERE name = 'yourdatabasename'

COMMIT TRAN


6.SQL SERVER 재시작한다.


7.아래의 DBCC 커맨드를 실행한다. 이 명령은 새 로그파일을 생성하는 명령이다.

주의:LDF의 이름은 새 서버에서 삭제한 이름과 같아야 한다.

DBCC TRACEON (3604)

DBCC REBUILD_LOG(yourdatabasename,'c:\yourdatabasename_log.ldf')

GO


8.주의대상 으로 된 database 상태를 변경한다.

sp_RESETSTATUS yourdatabasename



9. Database mode를 5번에서 저장했던 값으로 변경한다.

BEGIN

UPDATE sysdatabases

SET status = (value retrieved IN first query OF STEP 5)

WHERE name = 'yourdatabasename‘

COMMIT TRAN

GO



10.master DB를 업데이트 불가능하도록 다시 수정한다.

USE MASTER

GO

sp_CONFIGURE 'allow updates',0

RECONFIGURE WITH OVERRIDE

GO



8, 9, 10 단계를 진행하다 database가 사용중이라고 나올 경우 

sp_DBOPTION 'yourdatabasename', 'single user','true'  실행할 것

작업이 완료되면 

sp_DBOPTION 'yourdatabasename', 'single user','false' 실행




posted by bedbmsguru
2013. 7. 9. 09:23 SQL SERVER

1.레지스트리에서 Disable Performance Counters  값이 1로 되어있을 경우
   0으로 바꿔준다. (바로해결됨)

--여기나
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\Disable Performance Counters
--여기
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSSQLSERVER\Performance\Disable Performance Counters

위 상황이 해당되지 않을경우

services.msc에 Remote Registry가 시작되었는지 체크
잘 실행되고 있다면
unlodctr 와 lodctr 을 이용해서 SQL 관련 카운터를 다시 등록할것
1) cmd(Administrator권한으로)

2) SQL SERVER의 binn폴더로 이동

3)unlodctr을 이용해서 SQL counters를 unload한다.
    e.g. unlodctr MSSQLSERVER (for default instance)
    e.g. unlodctr SQLSERVERAGENT (for default SQL Agent)
    e.g. unlodctr MSSQL$TEST (for named instance)
    e.g. unlodctr SQLAGENT$TEST (for SQL agent)

4)lodctr을 이용해서 SQL counters를 다시 등록한다.
    e.g. lodctr perf-MSSQLSERVERsqlctr.ini (for default instance)
    e.g. lodctr perf-SQLSERVERAGENTsqlagtctr.ini (for default SQL Agent)
    e.g. lodctr perf-MSSQL$TESTsqlctr.ini (for named instance)
    e.g. lodctr perf-SQLAGENT$TESTsqlagtctr.ini (for SQL Agent)

5)Remote Registry service를 다시 시작한다.
    net stop "Remote Registry"
    net start "Remote Registry"

6)필요할 경우 WMI와 WinPrivSE.exe 싱크를 다시 맞춘다.
    e.g. winmgmt /resyncperfctr "5660"
   cf)5660은 WinPrivSE.exe 의 pid

위 방법으로도 해결 되지 않을 경우
lodctr /R --> 모든 performance counter를 재등록 한다.
  주의!!! 모든 performance counter registry 세팅을 재등록하게 된다.


출처:http://www.travisgan.com/2013/05/missing-sql-performance-counters.html

posted by bedbmsguru
2013. 2. 27. 11:37 SQL SERVER

SQL 2008에서 2000으로 링크드서버를 연결하기위해서는 2000의 master DB에 아래의 프로시져를 생성해 두어야 한다.

 

 

USE MASTER

GO

CREATE PROCEDURE SP_TABLES_INFO_ROWSET_64
      @TABLE_NAME SYSNAME
    , @TABLE_SCHEMA SYSNAME = NULL
    , @TABLE_TYPE NVARCHAR(255) = NULL
AS
BEGIN
    DECLARE @RESULT INT SET @RESULT = 0

    EXEC @RESULT = SP_TABLES_INFO_ROWSET @TABLE_NAME, @TABLE_SCHEMA, @TABLE_TYPE
END

 

 

CF)Linked Server 구성하는법

EXEC sp_addlinkedserver @server='DEVSERVER',@srvproduct='', -- 연결이름.
@provider='SQLOLEDB', @datasrc='목적지IP', @catalog='디비이름' (옵션임)
EXEC sp_addlinkedsrvlogin 'DEVSERVER', 'false', NULL, '아이디', '암호'

posted by bedbmsguru
2013. 1. 23. 11:38 SQL SERVER

DB owner가 누구인지 확인하는 쿼리

SELECT  SUSER_SNAME(owner_sid)
FROM    sys.databases
WHERE   name = 'yourDatabase';


--owner를 sa로 변경

ALTER AUTHORIZATION ON DATABASE::yourDatabase TO sa;




 

posted by bedbmsguru
2013. 1. 14. 15:09 SQL SERVER

출처:http://www.mssqltips.com/sqlservertip/2561/querying-sql-server-agent-job-information/

 


--Agent job 모니터링 Proc 


 alter procedure usp_errorjob

AS
SET NOCOUNT ON;
select B.name,
CASE
WHEN A.[run_date] IS NULL OR A.[run_time] IS NULL THEN NULL
ELSE CAST(CAST(A.[run_date] AS CHAR(8)) + ' '
+ STUFF( STUFF(RIGHT('000000' + CAST(A.[run_time] AS VARCHAR(6)), 6)
, 3, 0, ':') , 6, 0, ':') AS DATETIME)
END AS [StartDateTime] ,
STUFF(
STUFF(RIGHT('000000' + CAST([A].[run_duration] AS VARCHAR(6)), 6)
, 3, 0, ':')
, 6, 0, ':')
AS [LastRunDuration (HH:MM:SS)],
CASE A.[run_status]
WHEN 0 THEN 'Failed'
WHEN 1 THEN 'Succeeded'
WHEN 2 THEN 'Retry'
WHEN 3 THEN 'Canceled'
WHEN 4 THEN 'Running' -- In Progress
END AS [RunStatus]
, A.message from
[msdb].[dbo].[sysjobhistory] AS A
inner join [msdb].[dbo].[sysjobs] B
ON A.job_id = B.job_id
where convert(datetime, cast(A.run_date as varchar(20)), 121) > getdate() -7--성공과 실행중인 JOB 제외
AND A.run_status NOT IN (1)
AND B.enabled =1 --사용중인 JOB
AND name not like '%ERRORLOG Cycling%' --원래 실패할 수 있기 때문에 이 작업은 뺀다.
order by [StartDateTime] DESC


--agent job 설정 & 스케줄  정보 확인하기

SELECT 
    [sJOB].[job_id] AS [JobID]
    , [sJOB].[name] AS [JobName]
    , [sDBP].[name] AS [JobOwner]
    , [sCAT].[name] AS [JobCategory]
    , [sJOB].[description] AS [JobDescription]
    , CASE [sJOB].[enabled]
        WHEN 1 THEN 'Yes'
        WHEN 0 THEN 'No'
      END AS [IsEnabled]
    , [sJOB].[date_created] AS [JobCreatedOn]
    , [sJOB].[date_modified] AS [JobLastModifiedOn]
    , [sSVR].[name] AS [OriginatingServerName]
    , [sJSTP].[step_id] AS [JobStartStepNo]
    , [sJSTP].[step_name] AS [JobStartStepName]
    , CASE
        WHEN [sSCH].[schedule_uid] IS NULL THEN 'No'
        ELSE 'Yes'
      END AS [IsScheduled]
    , [sSCH].[schedule_uid] AS [JobScheduleID]
    , [sSCH].[name] AS [JobScheduleName]
    , CASE [sJOB].[delete_level]
        WHEN 0 THEN 'Never'
        WHEN 1 THEN 'On Success'
        WHEN 2 THEN 'On Failure'
        WHEN 3 THEN 'On Completion'
      END AS [JobDeletionCriterion]
FROM
    [msdb].[dbo].[sysjobs] AS [sJOB]
    LEFT JOIN [msdb].[sys].[servers] AS [sSVR]
        ON [sJOB].[originating_server_id] = [sSVR].[server_id]
    LEFT JOIN [msdb].[dbo].[syscategories] AS [sCAT]
        ON [sJOB].[category_id] = [sCAT].[category_id]
    LEFT JOIN [msdb].[dbo].[sysjobsteps] AS [sJSTP]
        ON [sJOB].[job_id] = [sJSTP].[job_id]
        AND [sJOB].[start_step_id] = [sJSTP].[step_id]
    LEFT JOIN [msdb].[sys].[database_principals] AS [sDBP]
        ON [sJOB].[owner_sid] = [sDBP].[sid]
    LEFT JOIN [msdb].[dbo].[sysjobschedules] AS [sJOBSCH]
        ON [sJOB].[job_id] = [sJOBSCH].[job_id]
    LEFT JOIN [msdb].[dbo].[sysschedules] AS [sSCH]
        ON [sJOBSCH].[schedule_id] = [sSCH].[schedule_id]
ORDER BY [JobName]

 

 

--마지막 실행 상세정보+ 다음 실행스케쥴

SELECT 
    [sJOB].[job_id] AS [JobID]
    , [sJOB].[name] AS [JobName]
    , CASE 
        WHEN [sJOBH].[run_date] IS NULL OR [sJOBH].[run_time] IS NULL THEN NULL
        ELSE CAST(
                CAST([sJOBH].[run_date] AS CHAR(8))
                + ' ' 
                + STUFF(
                    STUFF(RIGHT('000000' + CAST([sJOBH].[run_time] AS VARCHAR(6)),  6)
                        , 3, 0, ':')
                    , 6, 0, ':')
                AS DATETIME)
      END AS [LastRunDateTime]
    , CASE [sJOBH].[run_status]
        WHEN 0 THEN 'Failed'
        WHEN 1 THEN 'Succeeded'
        WHEN 2 THEN 'Retry'
        WHEN 3 THEN 'Canceled'
        WHEN 4 THEN 'Running' 
      END AS [LastRunStatus]
    , STUFF(
            STUFF(RIGHT('000000' + CAST([sJOBH].[run_duration] AS VARCHAR(6)),  6)
                , 3, 0, ':')
            , 6, 0, ':') 
        AS [LastRunDuration (HH:MM:SS)]
    , [sJOBH].[message] AS [LastRunStatusMessage]
    , CASE [sJOBSCH].[NextRunDate]
        WHEN 0 THEN NULL
        ELSE CAST(
                CAST([sJOBSCH].[NextRunDate] AS CHAR(8))
                + ' ' 
                + STUFF(
                    STUFF(RIGHT('000000' + CAST([sJOBSCH].[NextRunTime] AS VARCHAR(6)),  6)
                        , 3, 0, ':')
                    , 6, 0, ':')
                AS DATETIME)
      END AS [NextRunDateTime]
FROM 
    [msdb].[dbo].[sysjobs] AS [sJOB]
    LEFT JOIN (
                SELECT
                    [job_id]
                    , MIN([next_run_date]) AS [NextRunDate]
                    , MIN([next_run_time]) AS [NextRunTime]
                FROM [msdb].[dbo].[sysjobschedules]
                GROUP BY [job_id]
            ) AS [sJOBSCH]
        ON [sJOB].[job_id] = [sJOBSCH].[job_id]
    LEFT JOIN (
                SELECT 
                    [job_id]
                    , [run_date]
                    , [run_time]
                    , [run_status]
                    , [run_duration]
                    , [message]
                    , ROW_NUMBER() OVER (
                                            PARTITION BY [job_id] 
                                            ORDER BY [run_date] DESC, [run_time] DESC
                      ) AS RowNumber
                FROM [msdb].[dbo].[sysjobhistory]
                WHERE [step_id] = 0
            ) AS [sJOBH]
        ON [sJOB].[job_id] = [sJOBH].[job_id]
        AND [sJOBH].[RowNumber] = 1
ORDER BY [JobName]
 
--agent job 스케쥴 정보 보는 쿼리
SELECT 
    [schedule_uid] AS [ScheduleID]
    , [name] AS [ScheduleName]
    , CASE [enabled]
        WHEN 1 THEN 'Yes'
        WHEN 0 THEN 'No'
      END AS [IsEnabled]
    , CASE 
        WHEN [freq_type] = 64 THEN 'Start automatically when SQL Server Agent starts'
        WHEN [freq_type] = 128 THEN 'Start whenever the CPUs become idle'
        WHEN [freq_type] IN (4,8,16,32) THEN 'Recurring'
        WHEN [freq_type] = 1 THEN 'One Time'
      END [ScheduleType]
    , CASE [freq_type]
        WHEN 1 THEN 'One Time'
        WHEN 4 THEN 'Daily'
        WHEN 8 THEN 'Weekly'
        WHEN 16 THEN 'Monthly'
        WHEN 32 THEN 'Monthly - Relative to Frequency Interval'
        WHEN 64 THEN 'Start automatically when SQL Server Agent starts'
        WHEN 128 THEN 'Start whenever the CPUs become idle'
      END [Occurrence]
    , CASE [freq_type]
        WHEN 4 THEN 'Occurs every ' + CAST([freq_interval] AS VARCHAR(3)) + ' day(s)'
        WHEN 8 THEN 'Occurs every ' + CAST([freq_recurrence_factor] AS VARCHAR(3)) 
                    + ' week(s) on '
                    + CASE WHEN [freq_interval] & 1 = 1 THEN 'Sunday' ELSE '' END
                    + CASE WHEN [freq_interval] & 2 = 2 THEN ', Monday' ELSE '' END
                    + CASE WHEN [freq_interval] & 4 = 4 THEN ', Tuesday' ELSE '' END
                    + CASE WHEN [freq_interval] & 8 = 8 THEN ', Wednesday' ELSE '' END
                    + CASE WHEN [freq_interval] & 16 = 16 THEN ', Thursday' ELSE '' END
                    + CASE WHEN [freq_interval] & 32 = 32 THEN ', Friday' ELSE '' END
                    + CASE WHEN [freq_interval] & 64 = 64 THEN ', Saturday' ELSE '' END
        WHEN 16 THEN 'Occurs on Day ' + CAST([freq_interval] AS VARCHAR(3)) 
                     + ' of every '
                     + CAST([freq_recurrence_factor] AS VARCHAR(3)) + ' month(s)'
        WHEN 32 THEN 'Occurs on '
                     + CASE [freq_relative_interval]
                        WHEN 1 THEN 'First'
                        WHEN 2 THEN 'Second'
                        WHEN 4 THEN 'Third'
                        WHEN 8 THEN 'Fourth'
                        WHEN 16 THEN 'Last'
                       END
                     + ' ' 
                     + CASE [freq_interval]
                        WHEN 1 THEN 'Sunday'
                        WHEN 2 THEN 'Monday'
                        WHEN 3 THEN 'Tuesday'
                        WHEN 4 THEN 'Wednesday'
                        WHEN 5 THEN 'Thursday'
                        WHEN 6 THEN 'Friday'
                        WHEN 7 THEN 'Saturday'
                        WHEN 8 THEN 'Day'
                        WHEN 9 THEN 'Weekday'
                        WHEN 10 THEN 'Weekend day'
                       END
                     + ' of every ' + CAST([freq_recurrence_factor] AS VARCHAR(3)) 
                     + ' month(s)'
      END AS [Recurrence]
    , CASE [freq_subday_type]
        WHEN 1 THEN 'Occurs once at ' 
                    + STUFF(
                 STUFF(RIGHT('000000' + CAST([active_start_time] AS VARCHAR(6)), 6)
                                , 3, 0, ':')
                            , 6, 0, ':')
        WHEN 2 THEN 'Occurs every ' 
                    + CAST([freq_subday_interval] AS VARCHAR(3)) + ' Second(s) between ' 
                    + STUFF(
                   STUFF(RIGHT('000000' + CAST([active_start_time] AS VARCHAR(6)), 6)
                                , 3, 0, ':')
                            , 6, 0, ':')
                    + ' & ' 
                    + STUFF(
                    STUFF(RIGHT('000000' + CAST([active_end_time] AS VARCHAR(6)), 6)
                                , 3, 0, ':')
                            , 6, 0, ':')
        WHEN 4 THEN 'Occurs every ' 
                    + CAST([freq_subday_interval] AS VARCHAR(3)) + ' Minute(s) between ' 
                    + STUFF(
                   STUFF(RIGHT('000000' + CAST([active_start_time] AS VARCHAR(6)), 6)
                                , 3, 0, ':')
                            , 6, 0, ':')
                    + ' & ' 
                    + STUFF(
                    STUFF(RIGHT('000000' + CAST([active_end_time] AS VARCHAR(6)), 6)
                                , 3, 0, ':')
                            , 6, 0, ':')
        WHEN 8 THEN 'Occurs every ' 
                    + CAST([freq_subday_interval] AS VARCHAR(3)) + ' Hour(s) between ' 
                    + STUFF(
                    STUFF(RIGHT('000000' + CAST([active_start_time] AS VARCHAR(6)), 6)
                                , 3, 0, ':')
                            , 6, 0, ':')
                    + ' & ' 
                    + STUFF(
                    STUFF(RIGHT('000000' + CAST([active_end_time] AS VARCHAR(6)), 6)
                                , 3, 0, ':')
                            , 6, 0, ':')
      END [Frequency]
    , STUFF(
            STUFF(CAST([active_start_date] AS VARCHAR(8)), 5, 0, '-')
                , 8, 0, '-') AS [ScheduleUsageStartDate]
    , STUFF(
            STUFF(CAST([active_end_date] AS VARCHAR(8)), 5, 0, '-')
                , 8, 0, '-') AS [ScheduleUsageEndDate]
    , [date_created] AS [ScheduleCreatedOn]
    , [date_modified] AS [ScheduleLastModifiedOn]
FROM [msdb].[dbo].[sysschedules]
ORDER BY [ScheduleName]
 
 


posted by bedbmsguru
2012. 9. 26. 17:17 SQL SERVER

 Agent Job을 작업스크립팅으로 복사할때


메시지 8145, 수준 16, 상태 1, 프로시저 sp_add_jobschedule, 줄 0
@schedule_uid은(는) 프로시저 sp_add_jobschedule의 매개 변수가 아닙니다.


job을 복사해서 실행했더니 위와같은 에러가 났다.


2008용 ssms 에서 작업스크립팅을 하고 2005 서버에서 스크립트를 실행하였기 때문에 생기는 문제임.

왜 그런가 살펴봤더니  sql server 2005 와 2008 에서 sp_add_jobschedule 프로시져가 좀 달라졌다.


2005는 sp_add_jobschedule 의 파라미터가  @schedule_id (an integer)이고

2008은 @schedule_uid (a uniqueidentifier) 를 받기 때문에 생긴 문제


2008 ssms로 스크립트를 생성해서 2005db서버에서 실행할때 주의하자.



posted by bedbmsguru
2012. 4. 19. 10:25 SQL SERVER

pwdencrypt()  function 으로 데이타를 저장하고

pwdcompar('비교대상값', DB칼럼이름) 로 결과를 비교한다.


create table temp_T
(
    aaa varchar(100) not null,
    abc varbinary(200) not null
)

insert into temp_T values('abc', pwdencrypt('abc'))


select pwdcompare('add', abc) from temp_T where aaa='abc'


pwdcompar 결과가 일치할 경우 1 틀릴경우에는 0이 리턴됨

posted by bedbmsguru
2011. 7. 7. 08:31 SQL SERVER
원문출처
http://www.databasejournal.com/features/mssql/sql-server-index-t-sql-statements.html

 Find all Indexes

The following query can be used to query all the tables, columns and indexes on the current database:


SELECT OBJECT_SCHEMA_NAME(BaseT.[object_id],DB_ID()) AS [Schema],
BaseT.[name] AS [table_name], I.[name] AS [index_name], AC.[name] AS [column_name],
I.[type_desc]
FROM sys.[tables] AS BaseT
INNER JOIN sys.[indexes] I ON BaseT.[object_id] = I.[object_id]
INNER JOIN sys.[index_columns] IC ON I.[object_id] = IC.[object_id]
INNER JOIN sys.[all_columns] AC ON BaseT.[object_id] = AC.[object_id] AND IC.[column_id] = AC.[column_id]
WHERE BaseT.[is_ms_shipped] = 0 AND I.[type_desc] <> 'HEAP'
ORDER BY BaseT.[name], I.[index_id], IC.[key_ordinal]

Fragmentation

The following query can be used to find the index fragmentation on all the tables in the current database:


SELECT object_name(IPS.object_id) AS [TableName],
SI.name AS [IndexName],
IPS.Index_type_desc,
IPS.avg_fragmentation_in_percent,
IPS.avg_fragment_size_in_pages,
IPS.avg_page_space_used_in_percent,
IPS.record_count,
IPS.ghost_record_count,
IPS.fragment_count,
IPS.avg_fragment_size_in_pages
FROM sys.dm_db_index_physical_stats(db_id(DB_NAME()), NULL, NULL, NULL , 'DETAILED') IPS
JOIN sys.tables ST WITH (nolock) ON IPS.object_id = ST.object_id
JOIN sys.indexes SI WITH (nolock) ON IPS.object_id = SI.object_id AND IPS.index_id = SI.index_id
WHERE ST.is_ms_shipped = 0
order by IPS.avg_fragment_size_in_pages desc

 Missing index

SQL Server keeps track of the indexes that it thinks you should create that will help in improving the performance of queries. The following query list all missing indexes.


SELECT sys.objects.name
, (avg_total_user_cost * avg_user_impact) * (user_seeks + user_scans) AS Impact
, 'CREATE NONCLUSTERED INDEX ix_IndexName ON ' + sys.objects.name COLLATE DATABASE_DEFAULT + ' ( ' + IsNull(mid.equality_columns, '') + CASE WHEN mid.inequality_columns IS NULL
THEN ''
ELSE CASE WHEN mid.equality_columns IS NULL
THEN ''
ELSE ',' END + mid.inequality_columns END + ' ) ' + CASE WHEN mid.included_columns IS NULL
THEN ''
ELSE 'INCLUDE (' + mid.included_columns + ')' END + ';' AS CreateIndexStatement
, mid.equality_columns
, mid.inequality_columns
, mid.included_columns
FROM sys.dm_db_missing_index_group_stats AS migs
INNER JOIN sys.dm_db_missing_index_groups AS mig ON migs.group_handle = mig.index_group_handle
INNER JOIN sys.dm_db_missing_index_details AS mid ON mig.index_handle = mid.index_handle AND mid.database_id = DB_ID()
INNER JOIN sys.objects WITH (nolock) ON mid.OBJECT_ID = sys.objects.OBJECT_ID
WHERE (migs.group_handle IN
(
SELECT TOP (500) group_handle
FROM sys.dm_db_missing_index_group_stats WITH (nolock)
ORDER BY (avg_total_user_cost * avg_user_impact) * (user_seeks + user_scans) DESC))
AND OBJECTPROPERTY(sys.objects.OBJECT_ID, 'isusertable')=1
ORDER BY 2 DESC , 3 DESC

 Unused index

The following statement lists all the indexes that have not been used. This also generates the DROP index statement which can come handy when deleting the indexes.


SELECT o.name, indexname=i.name, i.index_id
, reads=user_seeks + user_scans + user_lookups
, writes = user_updates
, rows = (SELECT SUM(p.rows) FROM sys.partitions p WHERE p.index_id = s.index_id AND s.object_id = p.object_id)
, CASE
WHEN s.user_updates < 1 THEN 100
ELSE 1.00 * (s.user_seeks + s.user_scans + s.user_lookups) / s.user_updates
END AS reads_per_write
, 'DROP INDEX ' + QUOTENAME(i.name)
+ ' ON ' + QUOTENAME(c.name) + '.' + QUOTENAME(OBJECT_NAME(s.object_id)) as 'drop statement'
FROM sys.dm_db_index_usage_stats s
INNER JOIN sys.indexes i ON i.index_id = s.index_id AND s.object_id = i.object_id
INNER JOIN sys.objects o on s.object_id = o.object_id
INNER JOIN sys.schemas c on o.schema_id = c.schema_id
WHERE OBJECTPROPERTY(s.object_id,'IsUserTable') = 1
AND s.database_id = DB_ID()
AND i.type_desc = 'nonclustered'
AND i.is_primary_key = 0
AND i.is_unique_constraint = 0
AND (SELECT SUM(p.rows) FROM sys.partitions p WHERE p.index_id = s.index_id AND s.object_id = p.object_id) > 10000
ORDER BY reads

Index Maintainenance

Rebuild index

When an index gets fragmented, it requires defragmentation. Defragmentation can be done using the rebuild clause when altering a table. This command is equivalent to DBCC DBREINDEX in SQL Server versions prior to 2005. The command that can be used to rebuild the index is as follows:


USE AdventureWorks2008R2;
GO
ALTER INDEX PK_Employee_BusinessEntityID ON HumanResources.Employee
REBUILD;
GO

If ALL is not specified in rebuild, it will not rebuild a nonclustered index.

REORGANIZE index

Specifies that the index leaf level will be reorganized. The REORGANIZE statement is always performed online. This command is equivalent to DBCC INDEXDEFRAG in SQL Server versions prior to 2005.


USE AdventureWorks2008R2;
GO
ALTER INDEX PK_ProductPhoto_ProductPhotoID ON Production.ProductPhoto
REORGANIZE ;
GO

posted by bedbmsguru
2011. 6. 29. 11:12 SQL SERVER


원문 출처
http://blog.sqlauthority.com/2007/04/29/sql-server-random-number-generator-script-sql-query/


가장 간단한 방법만 퍼왔다. 요긴하게 쓸 수 있을듯.ㅋㅋ
Method 3 : Random Numbers Quick Scripts
---- random float from 0 up to 20 - [0, 20)
SELECT 20*RAND()
-- random float from 10 up to 30 - [10, 30)
SELECT 10 + (30-10)*RAND()
--random integer BETWEEN 0
AND 20 - [0, 20]
SELECT CONVERT(INT, (20+1)*RAND())
----random integer BETWEEN 10
AND 30 - [10, 30]
SELECT 10 + CONVERT(INT, (30-10+1)*RAND()


posted by bedbmsguru