기본 콘텐츠로 건너뛰기

라벨이 SQL Server인 게시물 표시

sql server로 거리 기반 정렬 및 거리 계산

geography sql server에는 geography 라는 속성의 컬럼이 생겼습니다. (언제부터인지...) 그걸 이용하면 특정 지점에서 가장 가까운 순으로 소팅된 데이터를 부를 수 있지요. DECLARE @InputLatitude FLOAT = 40 . 7128 ; -- 입력 지점의 위도 DECLARE @InputLongitude FLOAT = - 74 . 0060 ; -- 입력 지점의 경도 SELECT TOP 50 * FROM YourTableName ORDER BY geographyColumn . STDistance (geography:: Point (@InputLatitude, @InputLongitude, 4326 )) ASC ; 만약 당신 주변의 가장 가까운 사람들 리스트를 얻고 싶다면 이렇게 하시면 됩니다. 그런데 데이터를 넣을때는? create table tUser ( uSn bigint identity( 1 , 1 ), uUid nvarchar( 200 ), uLoc geography, uLocText nvarchar( 200 ) ) 이렇게 테이블을 만들었다 칩시다. 위도 경도를 받아서 uLocText에 위도 경도를 넣고, uLoc 에는 geography값을 넣는다면, declare @uLocText nvarchar( 200 ), @uSn bigint set @uLocText = ' 40.7128, -74.0060 ' set @uSn = 1 UPDATE tUser SET uLoc = geography:: Point (CAST( SUBSTRING (@uLocText, 1 , CHARINDEX( ' , ' , @uLocText) - 1 ) AS FLOAT), CAST( SUBSTRING (@uLocText, CHARINDEX( ' , ' , @uLocText) + 1 , LEN(@uLocText)) AS FLOAT),

SQL Server 의 모니터링

SSMS(Sql Server Management Service)툴에서 제공하는 간단한 모니터로 대부분의 성능 이슈를 잡아낼 수 있다.  https://serverfault.com/questions/578533/ms-sql-server-getting-overloading-with-suspended-queries-mostly-reads-any-wa 일단 정리 용... giip :: Free mixed RPA orchestration tool!  https://giipasp.azurewebsites.net/

DBMS 튜닝(tuning)시 유의 점

DBMS의 튜닝의 70% 이상은 SQL튜닝과 Index튜닝으로 해결 됩니다. 하지만 예외적인게 조금 있지요. 얼마 전에 옆에서 이상하게 속도가 느려진 쿼리가 있어서 봐달라고 쿼리를 보여주었습니다. 힌트를 주어 강제로 인덱스를 태우고 있었습니다. 이 힌트는 왜 주었냐고 물어보니 원래 그렇게 되어 있어서 사용중이었다고 합니다. 아마 초기에 만든 사람이 사라지고 그냥 그 동안 문제 없이 쓰고 있었던 것 같네요. 그냥 잘 모르면 힌트를 없애고 돌려보세요. 라고 가이드를 했더니 3초 이상 걸렸던 쿼리가 0.01초로 끝났습니다. 이유는 뭘까요? 대부분의 인덱스는 초기 개발자가 개발하면서 만든 인덱스 외에는 나중에 추가 되는 경우가 많지 않습니다. 대부분 한 번 만들면 그게 최적이라고 생각하는 경우가 대 부분이고, 지금 처럼 초기에 만든 사람들이 사라지고 물려받은 사람들은 이유를 모르고 사용하는 경우도 있습니다. 테이블 설계시의 예상 데이터 축적량을 보고 아무리 DB 전문가가 Index를 걸어준들 사용자의 성향이나 시대에 따라 데이터는 전혀 달리 쌓이게 되는게 보통입니다. 예를 들어, 한국형 게시판은 대 부분 글이 많고 댓글이 적은 편입니다. 이유는 튀기 좋아하는 한국인들은 자기가 돋보여야 하기 때문에 댓글에 달 글 조차도 글쓰기로 올라와서 많은 사람들이 보게 하길 원하는 경우가 많기 때문이지요. 하지만 이 게시판으로 일본에서 서비스를 해보면 글은 얼마 안올라오는데 댓글이 수천에서 수만개가 쌓입니다. 즉 유저의 성향에 따른 데이터의 편중이 달라지는데, 이 때 게시글 옆에 댓글을 카운트 하는 경우 subquery를 이용해서 카운트 하는 경우도 많고, group by 를 이용해서 한 번 카운트 한 댓글 통계를 join하는 경우도 있습니다. 전자의 경우는 댓글 수가 적은 한국에서는 좋은 쿼리이나, 댓글이 너무 많아진 일본에서는 group by에 비해 많은 양의 카운트를 nested loop로 처리하게 되므로 효율이 많이 떨어집니다.

한국어, 일본어 대응 가능한 DBMS Query Tool - ORACLE MySQL SQL Server ODBC 지원

A5MK2라는 일본인이 만든 무료 툴이 있다. 그 동안은 Orange라는 국내 유료 소프트를 사용했는데, 너무 고가다 보니 회사에서는 대체 툴을 희망하였고, 이것저것 찾아보다보니 일본인 스탭에게서 추천을 받아 사용을 해보게 되었다. 공식 홈페이지 :  https://a5m2.mmatsubara.com/ 공식 홈페이지(개인 이지만..)에 들어가도 일본 특유의 이뿌지 않고 실용적이기만 한 페이지가 뜨고.. 다운로드 및 과거 버전 다운로드가 가능하다. 사용하면서 느낀 점으로 보아 Orange의 DBA툴(Orange의 메뉴명)은 보기가 좋은 장점이 있는데, 그 외의 기능들을 보면 A5MK2는 떨어지지 않는 훌륭한 툴이다. 그래도 Orange의 장점을 들어보자면 DBA에서 Tablespace기능이나 AWR추출 기능등은 보기도 편하고 클릭 한 번으로 쉽게 확인 및 처리가 가능하다. 하지만, 사이즈가 큰 경우 Processing... 이라고 표시되면서 몇 시간이고 사용을 못하게 되는 단점은 있다. 그 부분에서 본다면 그냥 필요한 부분을 모두 SQL로 보관하고 처리하면 A5MK2에서도 별로 문제 없이 사용할 수 있으므로 그 부분은 좋았다. A5MK2만의 장점을 들자면.. 접속가능한 DBMS가 많다! Oracle OCI 및 직접 접속 IBM DB2 Microsoft SQL Server Interbase/Firebird PostgreSQL MySQL Mariadb SQLite AccessDB ADO(OLE, ODBC) 지원이 안되는 것이 있다면 ODBC로 연결후에 접속을 해버리면 된다! 아쉽게도 최신 버전에는 강제 UTF Encoding이 걸려있어 과거 버전의 Encoding을 할 수 없는 커넥터로 연결하면 글자깨짐이 발생할 수가 있다. 처음부터 UTF8로 만들어진 경우는 전혀 문제 없으나 예전에는 ANSI로 해당 국가 전용으로 만든 케이스가 있다보니 이러한 소수의 케이스에는 과거 버전인 2.9

Alter table 에서 modify 와 change 의 차이 :: SQL Server

두 개의 차이를 모르는 경우가 많아서 정리합니다.  modify는 필드의 속성값을 바꿀때 사용하구요.. change는 필드명을 바꿀떄 사용합니다.  alter table tbbs modify bNote varchar(2000) NULL; alter table tbbs change bNoteOrg bNoteNew varchar(2000) NULL; change에는 원래 필드와 바꾸고 싶은 필드명을 넣어서 필드명을 바꾸는 것이죠~ 더 많은 SQL Server 팁을 보려면  https://github.com/LowyShin/KnowledgeBase/tree/master/wiki/SQL-Server giip :: Control all Robots and Devices! Free inter-RPA orchestration tool! https://giipasp.azurewebsites.net/

[SQL Server] Rank() 함수로 배열을 쉽게..

MS-SQL Server 2005부터 서포트 합니다. 온라인 게임의 통계등에 많이 사용하는 순위나 랭킹 서비스에 많이 활용하는 함수입니다. USE AdventureWorks; GO SELECT i.ProductID, p.Name, i.LocationID, i.Quantity     ,RANK() OVER       (PARTITION BY i.LocationID ORDER BY i.Quantity DESC) AS 'RANK' FROM Production.ProductInventory i       INNER JOIN Production.Product p           ON i.ProductID = p.ProductID ORDER BY p.Name; GO 여기서 위의 예제처럼 Partition By 로 필드를 구분 지으면 지역별(i.LocationID)로 랭킹을 나눈다는 뜻이다. 서울, 부산의 두 지역이 있으면 서울에서의 랭킹과 부산에서의 랭킹이 서로 다르게 나타난다. Parition 뒤의 Order By 는 Rank를 순서짓는 순서가 된다.   즉, 온라인 게임에서 많이 사용하는 캐릭터 테이블에서.. 서버별, 직업별로 높은 레벨, 높은 경험치, 신규 캐릭터 순으로 랭킹을 만들어보면.. 테이블 : tCharacter 서버 : servername 직업 : jobname 레벨 : level 경험치 : exppoint 생성일 : regdt select servername, jobname, level, exppoint, regdt   , rank() over       (partition by servername, jobname         order by level desc, exppoint desc, regdt desc) as Rank from tCharacter 이런식으로 구별지어 랭킹을 만들 수 있답니다. ^^ http://msdn.microsoft.com/ja-jp/library/ms176102.aspx

SQL Server 날짜 관련

CONVERT(varchar(8), getdate(), 112) + REPLACE(CONVERT(varchar(12), getdate(), 108), ':', '') ORACLE에서는 char(14)형식으로 날짜를 지정하는 경우가 간혹 있다. 검색의 최적화를 위해서라고 하는데.. SQL Server로 컨버팅할 때 종종 써목곤 하기 때문에 적어놓는다. YYYYMMDDHH24MISS 의 형태로 바꾸어주는 구문 datetime -> char(14) 이번주의 첫날(일요일)을 구하는 법 select dateadd(dd, 1-(datepart(dw, getdate())), getdate()) 이번달의 첫날을 구하는 법 select convert(datetime, convert(varchar(6), getdate(), 112) + '01') MS Technet의 자세한 convert정보... http://technet.microsoft.com/ko-kr/library/ms174450(SQL.90).aspx

syscacheobjects (SQL Server)

해킹 또는 데이터의 변조등 이상한 문제가 발생했을 때 가장 먼저 훑어보는 System View이다. 이외에도 퍼포먼스 튜닝을 하려는데 개발쪽에서 모든 쿼리를 주지 않은 경우 훑어볼 경우도 사용하곤 한다. 최근에 일어났던 SQL의 내용을 모두 볼 수 있다는 것이 장점이고, SQL을 실행시킨 사람이나 시간을 볼 수 없다는 것이 단점이다. 우선 여기서 의심스러운 쿼리들을 훑어낸 뒤에 이것을 이용하여 Profile을 한다거나 여러가지 액션을 취할 수 있다. 아래는 syscacheobjects뷰의 생성쿼리이다. 기본적으로 생성되어있지만, 참조되는 테이블을 확인할 때 쓰기위해 적어놓는다.

[ASP]SQL Server Data Type

SQL Server Data Type ADO Data Type bigint adBigInt binary adBinary bit adBoolean char adChar datetime adDBTimeStamp decimal adNumeric float adDouble image adVarbinary int adInteger money adCurrency nchar adWChar ntext adWChar numeric adNumeric nvarchar adWChar real adSingle smalldatetime adTimeStamp smallint adSmallInt smallmoney adCurrency sql_variant adVariant sysname adWChar text adChar timestamp adBinary tinyint adVarbinary uniqueidentifier adGUID varbinary adVarbinary varchar adChar