MSSQL 19

부분범위 처리와 전체 범위처리

user 테이블이 있는데 1000만건입니다. select * from [user] 를 실행하면 언제 부터 결과를 받을 수 있나요? 읽는 데이터 모두가 답입니다. 데이터베이스는 운반 단위에 차면 바로 바로 응답합니다. 그래서 0.0001초 만에 결과를 받기 시작합니다. 이 것이 바로 부분 범위 처리 입니다. select * from [user] order by name를 실행하면 언제 부터 결과를 받을 수 있나요? 이것은 전체를 읽어서 name로 소트를 해야만 결과를 받을 수 있습니다. 이 것이 바로 전체 범위 처리입니다. 전체 범위 처리 : 풀 스캔 후 가공하여 Array Size(운반 단위) 만큼 추출되어야 결과를 얻음 부분 범위 처리 : 조건을 만족하는 Row 수가 Array Size에 도달되면 결과..

아크 모델(exclusive or)에서의 주의점

다음과 같은 모델을 아크라고 하며 exclusive or 관계 입니다. select A.missionno, case A.owner_flag when 1 then B.name when 2 then C.guildname end name from missions A, [user] B, guild C where A.quest_id = 1 and ((A.owner_flag = 1 and A.userno = B.userno) or (A.owner_flag = 2 and A.guildno = C.guildno)) 이 SQL을 실행하니 희안하게도 같은 이름이 복사가 되어 보여 집니다. 옆사람에게 물으니, "에이~ 이런 것도 모르세요? distinct 있자나요~" 그래서 신기하게도 distinct 하나만 붙여주니 원하는..

테이블 조인 하면 느리다?

다음의 1번과 2번 중 어느쪽이 더 빠를까요? 1. Join이 빠르다. select A.userno, A.name, B.guildname from [user] A JOIN guild B ON A.guildno = B.guildno 2. Join하지 않는 것이 빠르다. select userno, name, guildname from [user] 1번이 더 빠릅니다. 디스크 IO 보다 CPU와 메모리가 훨씬 빠르기 때문입니다. 퍼포먼스에 가장 큰 영향을 주는 것이 디스크 IO 입니다. 그럼 디스크 IO량이 어떻게 되는지 따져봅시다. 1번은 108 * 100 바이트(약 1만)+ 32 * 10만 바이트(약 320만) = 약 321만 바이트 2번은 132 * 10만 바이트(약 1320만) 바이트 = 약 1320만..

[RDBMS] 대용량 데이터베이스 솔루션 - MS-SQL로 내용 정리

대용량 데이터베이스 솔루션 1, 2권은 제가 20년 전에 데이터베이스 공부를 위해 읽었던 책입니다. 이 책들은 제가 데이터베이스를 대하는 자세를 바꾸게 해 준 책입니다. DBA에게는 바이블과 같은 책이기도 합니다. 이 책들의 내용들 중에 게임 서버 프로그래머에게 꼭 필요한 내용들을 정리합니다. 이 책은 오라클로 설명하고 있으며 오라클은 게임 개발에서 거의 사용되지 않고 있고 주로 많이 사용하는 MS-SQL에 맞추어 내용을 정리 하였습니다. 여러분에게 관계형 데이터베이스 즉 RDB 개발은 어려웠나요? 제 생각에는 대부분의 게임 서버 프로그래머는 DB 개발을 쉬워 해요. SQL 문법을 익히기만 하면 원하는 결과를 쉽게 얻을 수 있습니다. SQL 문법은 C++ 문법에 비하여 정말 쉽죠. 그래서 인지 많은 개발..

[MSSQL] 데이터 저장 구조

데이터 저장의 저장의 기본 단위가 '페이지'입니다. 페이지 관리의 기본 단위가 '익스텐트'입니다. [페이지] SQL Server의 페이지 크기는 8KB입니다. 1MB당 128페이지가 존재합니다. 각 페이지는 96바이트의 머리글로 시작하여 머리글에는 시스템 정보가 저장됩니다. 머리글 다음에 데이터 행과 이에 대응하는 행 오프셋 정보를 담고 있다. 구조는 다음과 같습니다. 대용량 행(varchar, nvarchar, varbinary, sql_variant등)의 경우에는 8KB를 초과하는 경우가 습니다. 실제 행들이 여러 페이지에 걸쳐 있을 수 없지만 이러한 행들은 전체 행의 8060바이트를 초과하면 ROW_OVERFLOW_DATA 할당 단위에 있는 페이지로 동적으로 옮기고 원래 페이지에는 이에 대한 24바..

[MSSQL] 캐시 확인및 삭제

SQL 테스트시 다음의 명령을 실행 후 테스트합니다. -- 현재 데이터베이스의 모든 더티 페이지를 디스크에 쓰고 버퍼를 정리 CHECKPOINT GO -- 버퍼 풀 초기화 DBCC DROPCLEANBUFFERS GO -- 프로시저 캐시 초기화 DBCC FREEPROCCACHE GO 캐시 부분 확인및 삭제 방법 사용중인 캐시 추출 SELECT * FROM SYS.SYSCACHEOBJECTS WHERE [SQL] LIKE '%테이블이름%' SELECT plan_handle, st.text FROM sys.dm_exec_cached_plans CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st WHERE text LIKE N'%테이블이름%'; 원하는 캐시 삭제 DBCC..

[MSSQL] 실행 계획 아이콘

연산자 자세한 설명은 다음 링크 참고하세요. https://docs.microsoft.com/ko-kr/sql/relational-databases/showplan-logical-and-physical-operators-reference?redirectedfrom=MSDN&view=sql-server-ver15 실행 계획 논리 및 물리 연산자 참조 - SQL Server 실행 계획 논리 및 물리 연산자 참조Showplan Logical and Physical Operators Reference 이 문서의 내용 --> 적용 대상: SQL Server Azure SQL Database Azure Synapse Analytics(SQL DW) 병렬 데이터 웨어하우스 APPLIES TO: SQL Server A..

[MSSQL] 실행 계획 보는 방법

SQL이 의도한 대로 동작하고 있는지 꼭 확인을 해야 겠습니다. 그러기 위해서는 실행 계획을 읽는 방법도 확실하게 알아야 겠습니다. 아래 아이콘을 눌러 놓고 SQL을 실행하면 실행 계획도 함께 볼 수 있습니다. 다음과 같이 볼 수 있습니다. 그래프가 아니라 텍스트 모드로도 볼 수 있습니다. - 텍스트 실행 계획 보기 ON/OFF SET SHOWPLAN_ALL ON GO SET SHOWPLAN_ALL OFF GO - 텍스트 실행 계획 보기를 ON 시키면 다음과 같이 실행 계획을 텍스트로 볼 수 있습니다. |--Parallelism(Gather Streams) |--Hash Match(Right Outer Join, HASH:([B].[userno])=([A].[userno]), RESIDUAL:([jino..

[MSSQL] 테스트 데이터 생성

유저 테이블에 10만건 더미 데이터 생성하기 declare @i int set @i = 0 while (@i < 100000) begin set @i = @i + 1 insert into dbo.[user](name, guildno, reg_date) values (concat('user', @i), @i/100, dateadd(dd, -@i/100, getdate())) end 인벤토리 테이블에 1000만건 더미 데이터 생성하기 declare @i int set @i = 0 while (@i < 10000000) begin set @i = @i + 1 insert into dbo.[inventory] (userno, itemid, reg_date) values (@i/200+1, @i, dateadd(..