보통 메이저 데이터베이스들은 통계 기능을 지원한다. 새로운 프로그램만 개발하는 개발팀의 경우 필요성을 못느껴서 잘 모를수가 있는데 유지보수팀에서 일하다보면 표준에 맞지않는 테이블도 많고 (개발 당시 필요에 의해 만들었으나 문서나 인수인계가 안된 경우) 시스템 전체코드를 분석할 시간적 여유도 없는 경우가 많다. 그럴경우 데이터베이스에 기록된 통계 정보를 활용하여 많이 조회되는 테이블 및 컬럼을 찾아서 인덱스를 추천해 주는 쿼리를 만들어 봤다. 물론 이걸 걸어서 더 느려지는 경우....도 있는데(기존 인덱스를 타는게 빠른데 새로 만든 인덱스를 탄다거나) 그 경우는 뭐.. 인덱스 강제지정을 해주는 수 밖에 없다. 주의 사항. 내가 알기론 MS-SQL은 SQL-Server 서비스 재시작 시 초기화되는걸로 알고있..
서버에 원격이나 직접 접근할 수 있다면 그냥 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..
가끔 SSMS에서는 0.1초만에 끝나는 쿼리가 이상하게 Web이나 프로그램으로 실행하면 느린 경우가 있다. 물론 다른 원인도 많지만 이 방법도 써서 쿼리를 확인해보자. SET ARITHABORT OFF /* 문제가 되는 쿼리 */ SELECT * FROM MYWORKTABLE WHERE WORKER LIKE '봉구%' 기본적으로 SSMS에서는 ARITHABORT 옵션이 ON 상태이다. 만약 우리가 SSMS에서 다음쿼리를 실행한다면 SELECT * FROM MYWORKTABLE WHERE WORKER LIKE '봉구%' 실제로 실행 되는 쿼리는 다음과 같다. (프로파일러 돌려보면 나온다) SET ARITHABORT ON SELECT * FROM MYWORKTABLE WHERE WORKER LIKE '봉구%..