728x90
반응형

 일반
update 테이블명 set 필드명=값 where 조건절 ....

* join update

[Sysbase 다른테이블과의 조인 방법]
지금까지 사용해본 DB가 몇개가 되는지
1. ORACLE
2. MS-SQL
3. DB2
4. SYSBASE

ㅋㅋㅋ머 Database야 다 거기서 거기인듯하다.
오늘은 회사에서 사용하고 있는 Sysbase 에 대하여 다른테이블과의 조인방법에 대해서
서술하고 마칠려고 한다.

DataBase가 여러가지 이지만 조금씩 쓰는 방법이 달라 이렇게 기록하고 메모 해야 헤메지 않고 찾아 쓰지
어느 어플에 보면 그런말이 있다 기억은 기록을 이기지 못한다.완전 공감.


1. 다른테이틀 조인 방법
  update A
  set a1 = b.a1, a2 =b.a2
  from A, B
  where A.a = B.a
  위의 예제를 보면 set 다음에 from 절을 사용하면서 테이블간의 join 을 거는것을 볼 수 있다


 

 

728x90
반응형

=====================================================================
1. 테이블을 생성하면서 테이블의 데이타 복사
select * into 생성될테이블명 from 원본테이블명
=====================================================================

2. 테이블 구조만 복사하겠다면
select * into 생성될테이블명 from 원본테이블명 where 1=2
=====================================================================

3. 테이블이 이미 생성되어 있는경우 데이타만 복사
insert into 카피될테이블명 select * from 원본테이블명
=====================================================================

4.특정 데이타만 복사 하겠다면
insert into 카피될테이블명 select * from 원본테이블명 where 검색조건
=====================================================================

5.다른 테이블조인해서 UPDATE 하기
UPDATE 엡데이트 테이블 명
SET 업테이트할 컬럼 = 업데이트 가져오는 컬럼
FROM 엡데이트 테이블 명 A, 다른테이블 명 B 
WHERE 조인조건
=====================================================================

6. 프로시저 검색 
SELECT * FROM INFORMATION_SCHEMA.ROUTINES

728x90
반응형

SELECT object_name(parent_id) [target], name
FROM sys.triggers
ORDER BY object_name(parent_id)

728x90
반응형

exec sp_readerrorlog

728x90
반응형

Select top 20

 [사용 된 평균 CPU] = total_worker_time / qs.execution_count

, [사용 된 총 CPU] = total_worker_time

, [실행 횟수] = qs.execution_count

, [개별 쿼리] = SUBSTRING (qt.text, qs.statement_start_offset / 2, 

                    (CASE WHEN qs.statement_end_offset = -1 

                     THEN LEN (CONVERT (NVARCHAR (MAX), qt.text)) * 2 

                    ELSE qs.statement_end_offset END- 

                    qs.statement_start_offset) / 2)

, [상위 쿼리] = qt.text

, DatabaseName = DB_NAME (qt.dbid)

FROM sys.dm_exec_query_stats qs

CROSS APPLY sys.dm_exec_sql_text (qs.sql_handle) as qt

ORDER BY [사용 된 총 CPU] DESC, [사용 된 평균 CPU] DESC;



728x90
반응형

[MSSQL] CPU 사용율과 메모리 사용율 관련

 

Database 서버가 언젠가부터 CPU 혹은 메모리 과부화가 발생하기 시작했다..

 

원인 발생 여부를 파악하기 위해 여러 검색을 통해 알아봤으나

분석 후 알아낸점은... 동시다발적으로 여러 트랜잭션 및 클라이언트의 쿼리 처리 등등으로 인한

복합적인 문제로 낙인...ㅠㅠ.... 결국 프로그램에서 처리해주지 않으면 안될것 같아, 개발이슈로 띄우고

개발하기로 했으나.. 알아보던 과정이 너무 여기저기 널린 얘기들과 정확히 이렇다 하는 내용이 없었다..

정리해두기로..

메모리 관련된 내용은 추후 업데이트 하기로하고 당착한 CPU 사용율에 좀더 신경을 써보자.

1. 떠돌아 다니는 쿼리문 + 해결방법

 

1) Sp_Who2 를 통한 문제 프로세스 검색 및 Kill

- Management 실행 => sp_Who2

- CPU 높은 놈을 찾자. Sp_Who2 내장 함수(?)의 경우 SQL 서비스단은 종료시키지 못한다.

(Status 가 Background 라던지.. Background 라던지...)

- 조건은 Status 가 RUNNABLE 상태, CPUTime 의 값이 유독 높은놈이 있다. 물론 해당 SPID를 가진 친구가 어떤 작업을 하는지

확인정도는 당연히 해야겠다. => DBCC INPUTBUFFER([SPID])

- 확인되었고 그놈을 죽여도 된다면.. 죽여버리자(?)! => KILL [SPID]

 

- 정리 : sp_Who2 => DBCC INPUTBUFFER([SPID]) => KILL [SPID]

 

2) 부하가 큰 쿼리문을 검색해서 프로그램 내 혹은 프로시저 등등에서 직접 수정하자!

- 간단보기와 상세보기로 나뉜다. (아래가 상세보기)

 

 

SELECT TOP 20

[Average CPU used] = total_worker_time / qs.execution_count

,[Total CPU used] = total_worker_time

,[Execution count] = qs.execution_count

,[Individual Query] = SUBSTRING (qt.text,qs.statement_start_offset/2,

(CASE WHEN qs.statement_end_offset = -1

THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2

ELSE qs.statement_end_offset END -

qs.statement_start_offset)/2)

,[Parent Query] = qt.text

,DatabaseName = DB_NAME(qt.dbid)

FROM sys.dm_exec_query_stats qs

CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt

ORDER BY [Total CPU used] DESC, [Average CPU used] DESC;

 

 

 

SELECT TOP 20

[Average CPU used] = total_worker_time / qs.execution_count

,[Total CPU used] = total_worker_time

,[Last CPU used] = last_worker_time

,[MAX CPU used] = max_worker_time

,[Execution count] = qs.execution_count

,[Individual Query] = SUBSTRING (qt.text,qs.statement_start_offset/2,

(CASE WHEN qs.statement_end_offset = -1

THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2

ELSE qs.statement_end_offset END - qs.statement_start_offset)/2)

,[Parent Query] = qt.text

,DatabaseName = DB_NAME(qt.dbid)

,qs.creation_time

,qs.last_execution_time

FROM sys.dm_exec_query_stats qs

CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt

ORDER BY [Average CPU used] DESC;

 

 

3) 직접 모니터링해서 해당 프로세서를 죽이자!!!!! (!?)

 

- 성능모니터 실행 => 성능-모니터링 도구-성능 모니터 => 카운터 추가

- 사용 가능한 카운터에서 Thread 하위의 %Processor Time / ID Thread / Thread State / Thread Wait Reason 선택

- 선택한 개체의 인스턴스에서 sqlserv 명칭 죄다 선택..

- 모니터링...

728x90
반응형
728x90
반응형

프로젝트를 진행하다보니

프로시저 내에서 씨리얼하게 값을 증가시켜 데이터를 저장해야 하는일이 생겼다

프로시저내에서 전역변수를 선언할수는 없고

테이블을 하나 만들어서 컬럼을 identity 열로 지정하여 가져올까도 했지만 Transaction 이 발생되서 ... GG

코딩상으로는 전역변수 int 하나 만들어놓고 ++ 시키면 되는데

SQL 은 그런 기능이 없나 하다가 찾게된 기능

코딩상에서 전역변수를 사용하는것과 비슷하다.

 

시퀀스 하나 만들고 (SQL 2012 에서만 지원된다.)

-----------------------------------------

CREATE SEQUENCE TESTIDX AS INT
START WITH 1 -- 시작수
INCREMENT BY 1 -- 증가수

-----------------------------------------

 

프로시저내에서 아래와 같이 활용하면 된다.

-----------------------------------------

NEXT VALUE FOR TESTIDX

-----------------------------------------

 

SEQUENCE 는 지정숫자부터 증가하게하거나 초기화 및 띄어넘기가 가능하다

+ Recent posts