튜닝 방법은 힌트 추가, SQL 재작성, 인덱스 생성 또는 변경 세 가지로 크게 나뉘는데, 보통은 힌트 추가로 끝냄.
인덱스 생성이나 변경이 획기적으로 성능을 좋게 할 수도 있지만 가장 리스키하기도 하기 때문에
운영시간에 반영하는 건 절대 추천하지 않는다.
Soft Parsing : SQL과 실행계획을 라이브러리 캐시에서 찾아서 바로 실행하는 것
- 문법만 똑같다고 소프트 파싱이 되는 게 아님, 모든 텍스트가 똑같아야지 가능
Hard Parsing : 모오든 과정을 다 거쳐서 실행(최적화 과정 포함)
- 돈 많이 듦.
WHERE 절에 함수를 씌우는 건 정말 지양해야 하는 코딩 방법임
- > 데이터 어떻게 움직이는지를 안다면 WHERE에 하면 안됨(https://www.mssqltips.com/sqlservertutorial/3204/avoid-using-functions-in-where-clause/)
WHERE 절에서 함수 호출을 피하고, 특히 WHERE 절에서 필터링하는 열에서 함수 호출을 피해야 하는 데에는 두 가지 이유가 있습니다 .첫 번째는 이전 주제와 동일합니다.결과 집합의 모든 레코드에 대해 함수를 호출해야 하므로 쿼리 성능이 저하될 수 있습니다.쿼리 성능에 더 큰 영향을 줄 수 있는 두 번째 이유는 필터링하려는 열 주변에 함수가 있는 경우 해당 열의 인덱스를 사용할 수 없다는 사실입니다.간단한 예를 살펴보겠습니다.먼저 WHERE 절의 열에 인덱스를 생성하여 함수 를 추가할 때 사용되지 않는 방식을 보여야 합니다.다음은 코드입니다.
비클러스터형 인덱스 생성 idxParent_DateDataColumn
ON [dbo].[부모] ([DateDataColumn])
-- 정리 문장
DROP INDEX Parent.idxParent_DateDataColumn
이제 30일 이내인 Parent 테이블의 모든 레코드를 반환하는 간단한 쿼리를 살펴보겠습니다. SQL 문을 작성할 수 있는 한 가지 방법은 다음과 같습니다.
부모ID 선택
[dbo].[부모]에서
WHERE dateadd(d,30,DateDataColumn) > getdate()
이 쿼리의 설명 계획을 살펴보면 우리가 생성한 DateDataColumn의 인덱스가 무시되고 인덱스 스캔이 수행되는 것을 볼 수 있습니다.
사이즈가 너무 크지 않은 보통의 테이블에서 BLOCK을 읽는 건 컬럼 하나를 읽나, 불필요한 컬럼을 다 들어내나 속도는 똑같음..
'데이터베이스 DB' 카테고리의 다른 글
인덱스 설정 기준 및 SQL 작성법 (0) | 2024.12.16 |
---|---|
SQL Indexing은 왜 필요할까? 어떻게 빨라지는 걸까? (0) | 2024.12.16 |
이상현상 종류, 정규화 목적, 종속성 화살표 표기법, 함수 종속성 규칙 (0) | 2021.03.03 |
DB에서 트랜잭션 정의하는 이유, 트랜잭션의 ACID 성질 (0) | 2021.03.03 |
식별자/부분키 (0) | 2021.03.03 |
댓글