보통 메이저 데이터베이스들은 통계 기능을 지원한다. 새로운 프로그램만 개발하는 개발팀의 경우 필요성을 못느껴서 잘 모를수가 있는데 유지보수팀에서 일하다보면 표준에 맞지않는 테이블도 많고 (개발 당시 필요에 의해 만들었으나 문서나 인수인계가 안된 경우) 시스템 전체코드를 분석할 시간적 여유도 없는 경우가 많다. 그럴경우 데이터베이스에 기록된 통계 정보를 활용하여 많이 조회되는 테이블 및 컬럼을 찾아서 인덱스를 추천해 주는 쿼리를 만들어 봤다. 물론 이걸 걸어서 더 느려지는 경우....도 있는데(기존 인덱스를 타는게 빠른데 새로 만든 인덱스를 탄다거나) 그 경우는 뭐.. 인덱스 강제지정을 해주는 수 밖에 없다. 주의 사항. 내가 알기론 MS-SQL은 SQL-Server 서비스 재시작 시 초기화되는걸로 알고있..
물론 0으로 나눌 상황을 안만드는게 제일 좋지만 내가 시스템 전체를 만드는 것도아니고, 데이터는 다른곳에서 넣었는데 내가 계산해야 하는경우도 많다. 데이터를 모두 검증할수도 없고. 그럴때 다음 명령어를 쓰면 0 나누기 발생 시 NULL을 반환한다. SET ANSI_WARNINGS OFF SET ARITHIGNORE ON SET ARITHABORT OFF 프로시저나 함수를 만들때 상단에 선언해두면 해당 세션 전체에 적용되서 편하다. 위 설정을 해주고 다음처럼 처리하면 된다. SELECT ISNULL(10 / 0, 0) --이렇게 하면 결과값이 0이 된다.
서버에 원격이나 직접 접근할 수 있다면 그냥 mdf, ldf 파일을 보면 된다. 근데 쿼리밖에 쓸수 없을때 사용하면 된다. --DB 용량 확인 SP_HELPDB '데이터베이스이름' --테이블 별 용량 확인 SELECT CONVERT(NVARCHAR(30), MIN(O.NAME)) AS [테이블명] , CAST(LTRIM(STR(SUM(CAST(RESERVED AS BIGINT)) * 8192 / 1024, 15, 0)) AS BIGINT) AS [용량(kb)] FROM SYSINDEXES AS I INNER JOIN SYSOBJECTS AS O ON O.ID = I.ID WHERE I.INDID IN (0, 1, 255) AND O.XTYPE = 'U' GROUP BY I.ID ORDER BY [용량(k..
나는 단순히 SELECT만 하는데 자꾸 다른데서 테이블을 잠그고 있어서 SELECT가 느린경우가 있다. 그래서 데이터 무결성이 크게 중요하지 않은 자료를 보여주는 거라면(금융이나 보안계열 아니면 괜찮지않을까?) WITH NOLOCK 키워드를 많이 사용한다. SELECT * FROM CUST AS A (NOLOCK) LEFT JOIN SELLING AS B (NOLOCK) ON A.CUSTID = B.CUSTID 그런데 이게 모든 테이블마다 NOLOCK을 써주는게 보통일이 아니다. 프로시저나 한 섹션 전체에서 NOLOCK을 걸어도 상관없다면 다음 명령을 상단에 써주자. SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 트랜잭션 레벨과 테이블 잠금에 대해서 더 자세히 알..
그러면 안되지만, 매우 많은 인력(SI)회사들이 문서를 관리하지 않는다. 그래서 가끔 고객이 오류 메세지가 뜬다고 물어보는데도 어디서 나는건지 도무지 모르겠다. 다음 쿼리를 통해 적어도 저장 프로시저의 내용은 전부 뒤져볼 수있다. DECLARE @FIND_STR NVARCHAR(100) = 'WORKTRACER 테이블 INSERT 중 오류가 발생하였습니다.' SELECT B.ID, A.ROUTINE_NAME, C.TEXT FROM INFORMATION_SCHEMA.ROUTINES AS A LEFT JOIN SYSOBJECTS AS B ON B.NAME = A.ROUTINE_NAME LEFT JOIN SYSCOMMENTS AS C ON B.ID = C.ID WHERE A.ROUTINE_TYPE = 'PRO..