데이터베이스 with MSSQL
-
Sorting데이터베이스 with MSSQL/SQL 튜닝 2022. 4. 19. 22:56
1. DB에서 정렬이 위험한 이유 퀵정렬 기준 시간복잡도는 O(NLogN) - > DB는 데이터가 어마어마하게 많다. 너무 용량이 커서 가용 메모리 커버가 안되는 경우가 생기면 디스크까지 찾아간다. -> 디스크는 매우 느림(성능에 문제가 생김!) 즉, Sorting 언제 일어나는지 파악하고 있어야한다. 2. 정렬이 생기는 경우들 1) Sort Merge Join 2) ORDER BY 3) GROUP BY 4) DISTINCT 5) UNION 6) RANKING WINDOWS FUNCTION 7) MIN, MAX CASE1) Sort Merge Join 코드블럭은 생략 원인 : 알고리즘 특성 상 인덱스가 없으면 Merge하기 전에 sort가 발생함 CASE2) ORDER BY SELECT * FROM pl..
-
Hash데이터베이스 with MSSQL/SQL 튜닝 2022. 4. 19. 20:19
1. 특징 - 인덱스가 없을 때 위력을 발휘한다. - 정렬이 필요없다. - 해시테이블은 메모리 소모가 크다.(대신 성능이 좋아진다) 2. 확인 USE Northwind; SELECT * INTO TestOrders FROM Orders; SELECT * INTO TestCustomers FROM Customers; SELECT * FROM TestOrders -- ROW 830 SELECT * FROM TestCustomers -- ROW 91 -- 해시조인은 데이터 수에 영향을 받기 때문에 행의 개수를 표시해놓고 확인해보기. SELECT * FROM TestOrders AS o INNER JOIN TestCustomers AS c ON o.CustomerID = c.CustomerID; 결과는 해시조인..
-
Merge데이터베이스 with MSSQL/SQL 튜닝 2022. 4. 19. 14:26
1. Merge로직 1) NL조인처럼 외부 테이블과 내부 테이블이 있다고 했을 때, 우선 두 테이블을 정렬한다. 2) 외부 테이블은 중복된 값이 없는 것이 좋고 내부 테이블은 중복된 값이 있어도 상관없다. - 외부 테이블에 중복된 값이 없고 내부 테이블에 중복된 값이 있다 = One To Many, 시간복잡도 (N + M) - 외부 테이블에 중복된 값이 있고 내부 테이블에도 중복된 값이 있다 = Many To Many, 시간복잡도(N * M) 3) 외부 테이블과 내부 테이블에서 서칭을 하는 도중 똑같은 값을 만나면 중복이 허용되는 내부 테이블 쪽의 커서를 1 증가시킨다. 4) 커서가 두 테이블의 끝에 다다르기 전까지 비교해보면서 같은 값을 찾는다. 2. 로직확인 SELECT * FROM players A..
-
Nested Loop 조인데이터베이스 with MSSQL/SQL 튜닝 2022. 4. 18. 19:18
1. 조인의 종류 조인에는 3가지 종류가 있다. 1) Nested Loop (NL) 조인 2) Merge (병합) 조인 3) Hash(해시) 조인 조인을 하면 세 가지 상태 중 하나를 골라서 조인이 이루어진다. 그렇다면 세 가지 상태의 각 장단점은 어떤지 알아보기로 한다. 어떤 조인이 이루어지는지 실험 USE BaseballData; -- Merge SELECT * FROM players AS p INNER JOIN salaries AS s ON p.playerID = s.playerID -- NL SELECT TOP 5 * FROM players AS p INNER JOIN salaries AS s ON p.playerID = s.playerID -- Hash SELECT * FROM salaries ..
-
복합 인덱스 컬럼 순서데이터베이스 with MSSQL/SQL 튜닝 2022. 4. 15. 23:18
1. 준비 USE Northwind; SELECT * INTO TestOrders From Orders; DECLARE @i INT = 1; DECLARE @emp INT; SELECT @emp = MAX(EmployeeID) FROM Employees; -- 더미 데이터를 늘리는 작업 ( 830 * 1000 ) WHILE(@i < 1000) BEGIN INSERT INTO TestOrders(CustomerID, EmployeeID, OrderDate) SELECT CustomerID, @emp + @i, OrderDate FROM Orders; SET @i = @i + 1; END CREATE NONCLUSTERED INDEX idx_emp_ord ON TestOrders(EmployeeID, Ord..
-
북마크 룩업데이터베이스 with MSSQL/SQL 튜닝 2022. 4. 15. 14:08
1. Index Seek가 나쁜경우 Index Scan이 항상 나쁜 것은 아니고, Index Seek가 항상 좋은 것도 아니다. 인덱스를 활용하는데 어떻게 느릴 수가 있을까? Non-Clustered의 경우 아래와 같은 방식으로 데이터를 찾아나간다. 1) RID -> Heap Table (Bookmark Lookup) 2) Key -> Clustered USE Northwind; SELECT * INTO TestOrders FROM Orders; SELECT * FROM TestOrders; CREATE NONCLUSTERED INDEX Orders_Index01 ON TestOrders(CustomerID); -- 인덱스 번호 SELECT index_id, name FROM sys.indexes WHE..
-
Index Scan vs Index Seek데이터베이스 with MSSQL/SQL 튜닝 2022. 4. 14. 20:32
1. 인덱스 성능 Index Scan이 뜨는 경우 테이블의 처음부터 다 비교해보면서 데이터를 찾기 때문에 성능이 안좋다. Index Seek가 뜨는 경우는 인덱스를 통해 효율적으로 데이터를 찾기 때문에 성능이 좋다. 그러나 꼭 Index Scan이 뜬다고 해서 마냥 나쁜 것은 아니다. 상황에 따라 Index Scan이 떠도 성능이 좋은 경우가 있다. 2. 분석 USE Northwind; -- 인덱스 접근 방식 -- Index Scan VS Index Seek CREATE TABLE TestAccess ( id INT NOT NULL, name NCHAR(50) NOT NULL, dummy NCHAR(1000) NOT NULL ); GO CREATE CLUSTERED INDEX TestAccess_CI O..
-
Clustered vs NonClustered데이터베이스 with MSSQL/SQL 튜닝 2022. 4. 13. 17:02
1. Clustered vs NonClustered - 데이터 접근 Clustered는 실제 데이터가 리프 페이지에 저장되어 있음 Leaf Page = Data Page 데이터는 Clustered Index키 순서로 정렬이 된다. Non-Clustered는 HeapRID의 주소를 참조하여 데이터에 접근함. 2. 클러스티드 인덱스가 논클러스티드 인덱스에 미치는 영향 - Clustered Index 유무에 다른 동작 1) Clustered Index가 없는 경우 - 데이터가 Heap Table이라는 곳에 저장 - Heap RID -> Heap Table로 접근하여 데이터를 추출 2) Clustered Index가 있는 경우 - Heap Table이 없음 - Leaf Table에 실제 데이터가 있다. - Cl..