276
Fast track to SYBASE IQ 소병각씀

Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

Embed Size (px)

Citation preview

Page 1: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

Fast track to SYBASE IQ

소병각씀

Page 2: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

SYBASE IQ Overview

Page 3: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

Sybase RDBMS

Sybase가제공하는 RDBMS는각업무의규모와성격에따라크게아래와같이 3개로구분되어집니다.

Adaptive Server Anywhere (ASA): 개인업무용, 모바일용등으로사용되는최소형RDBMS 입니다. SYBASE IQ의일부분으로사용되고있으며 SYBASE IQ 에서는Catalog, Query parser, Connectivity를담당하고있습니다

Adaptive Server Enterprise (ASE) : 범용 RDBMS이며 특히 OLTP 업무에탁월한효과를발휘합니다. DW 솔루션에서 OLAP의 Repository 영역으로도사용가능합니다.

SYBASE IQ : DW/DSS/Data Mart 업무를위해고안되어진전용 RDBMS 이며 ASA가포함되어있습니다. 단여기에포함된 ASA 영역은시스템을위한영역입니다.

Page 4: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

SYBASE IQ ……

기존의 RDBMS는 OLTP와 DSS가혼용해서사용되는엔진인데반해 SYBASE IQ는데이터웨어하우스전용으로인덱싱이나액세스방식에서데이터웨어하우스에맞는새로운기법으로구현되어성능, 유연성, 경제성측면에서가장탁월한 RDBMS 입니다

기존 RDBMS는대량의데이터에대한질의, 특히조인에대한성능을높이기위해데이터베이스스키마를비정규화즉 Star-Schema 또는 Snowflake-Schema로디자인하기를권장하기도하고파티션기법의데이터분산디자인에의해 ER 모델을권장하기도하지만 SYBASE IQ의새로운기술은데이터베이스스키마에대해어떠한제약도두지않습니다

RDBMS가처리능력을높이기위해단일질의작업을 MPP와같은병렬노드에분담시키는방법으로대용량데이터를처리하는기법을이용하는데이는비용에비해성능에문제가있습니다

Page 5: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

SYBASE IQ -column-wise data

기존 RDBMS는데이터액세스방식이레코드레벨로되어있고 DW에사용되는질의는레코드의모든항목이필요한것이아니라특정몇개의컬럼만을필요로합니다.

따라서레코드레벨의데이터액세스방식은불필요한 I/O를유발시키므로 DW를효과적으로지원할수없습니다

SYBASE IQ는 I/O 자체를줄일수있는새로운데이터액세스기법을제공합니다. 필요한컬럼만액세스하여한번 I/O에대단히많은양의데이터를읽어들일수있습니다

기존 RDBMS SYBASE IQ

VSVS

Page 6: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

SYBASE IQ -bit-wise index

칼럼의카디날리티에해당하는수를비트형태로표현하며이렇게표현된각비트는개별적으로저장되어인덱스가됩니다

이렇게비트단위로저장된각각의인덱스는서로다른압축저장기법을사용하며또한서로다른압축률을제공합니다.

압축률은데이터의성격및데이터베이스를생성할때사용하는인자인페이지크기에따라달라집니다.

1

1

0

1

1

1

1

0

0

1

0

1

1

0

0

0

1

0

0

0

1

0

1

0

0

0

0

0

0

1

0

0

0

0

0

1

1

0

1

0

0

1

1

0

0

0

0

1

1

1

0

1

0

0

0

0

17799

140

339

25

53

sale

sale binary sale index

1 1 0 1 1 1 1

0 0 1 0 1 1 0

0 0 1 0 0 0 1

0 1 0 0 0 0 0

0 1 0 0 0 0 0

1 1 0 1 0 0 1

1 0 0 0 0 1 1

1 0 1 0 0 0 0

Page 7: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

SYBASE IQ ……

SYBASE IQ의 Lock, 트랜잭션메카니즘등모든구조가 DW 시스템에적합하도록디자인이되어있으므로다음과같은업무를위해서사용하지마십시오. 아래에언급되고있는업무의특성들은소량의데이터를기반으로한건한건의데이터처리를위주로하는업무입니다.

OLTP Real time update

위와같은필요성이있는업무는같이제공되는 ASE라는 RDBMS로이동하여사용하시기바랍니다.

Page 8: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

SYBASE IQ Client

Page 9: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

SYBASE IQ Client

ODBC를지원하는 Client : SYBASE IQ에최적화된 API 방법이며각각 UNIX용과Window용이있습니다.

DBISQLC(Interactive SQL Classic) : SYBASE IQ에기본적으로제공되는 SQL Editor그외 3rd party 제품

OCDK를지원하는 Client : SYBASE IQ는 Sybase Native Driver인 OCDK를지원하지만 ODBC 방법과여러가지기본설정값이달라원하지않는부작용이존재하기때문에충분히숙지후에사용하시기바랍니다.

isql : ASE에기본적으로제공되는명령어대화방식의 SQL EditorSQL Advantage : ASE에기본적으로제공되는 GUI 대화방식의 SQL Editor그외 3rd party 제품

JDBC를지원하는 Client : Sybase의 JDBC인 Jconnect를지원하는 API 입니다.DBISQL(Interactive SQL JAVA) : SYBASE IQ에기본적으로제공되는 SQL Editor 이며지원 API에따라 OCDK (Jconnect)와 ODBC (JDBC-ODBC Bridge)를선택할수있습니다.그외 3rd party 제품

Page 10: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

ODBC - win client

ODBC Administrator를실행합니다

Page 11: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

ODBC - win client

Add 버튼을클릭하여새로운 data source를생성합니다

단, SYBASE IQ Server는 Unix Server에존재하는것으로가정합니다.

Page 12: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

ODBC - win client

Adaptive Server IQ 12 드라이버를선택하고 Finish 버튼을클릭합니다

ODBC 탭을선택하고 Data source name 필드에적절한이름을입력합니다

Page 13: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

ODBC - win client

Login 탭을선택하고 User ID와 Password의필드를입력합니다

Database 탭을선택하고 Server name 필드를입력합니다

비밀번호가암호화되어저장

Page 14: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

ODBC - win client

Network 탭을선택하여 TCP/IP 체크박스를클릭하고 SYBASE IQ 서버의 IP 주소와port 번호를콜론(주의:세미콜론아님)으로분리하여입력합니다.

ODBC 탭을선택하고 Test connection 버튼을클릭합니다.(단, 이기능은Win98과같은클라이언트에서는되지않고WinNT와같은서버계열에서만실행됩니다.)

Page 15: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

ODBC - unix client

dbdsn유틸리티이용% $SYBASE/ASIQ-12_6/bin/dbdsn -c "ENG=asiqdemo;DBN=asiqdemo;UID=dba;

PWD=SQL;CommLinks=tcpip{host=157.133.75.36;port=2345}" -w asiqdemo

위명령어가정상적으로수행되었다면 $SYBASE/.odbc.ini파일에다음과같은내용이들어있습니다. 단, ODBCHOME이라는환경변수가특별히따로설정되었다면설정된디렉토리에 .odbc.ini라는파일에편집됩니다. 또한 .odbc.ini라는파일은반드시존재해야합니다.

참고클라이언트는 ODBCHOME 환경변수, HOME 환경변수, path 순서에따라 .odbc.ini파일을참조합니다. 그리고 12.6 부터는 dbfhide라는유틸리티를이용해 odbc.ini파일을암호화해서저장할수있습니다.

[asiqdemo] // data source nameUserid=dba // user idPassword=SQL // passwordDatabaseName=asiqdemo // IQ database nameServerName=asiqdemo // IQ engine nameCommLinks=tcpip{host=157.133.75.36;port=2345} // protocol, IP, port

Page 16: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

: connection parameter

AutoPreCommit : 이옵션은모든명령어실행전에 COMMIT의실행여부를조절하며기본값은 off 즉자동으로 COMMIT하지않습니다. 이옵션은 ODBC를 API로사용하는클라이언트에제한적용됩니다.

CommLinks or Links : 클라이언트에서 IQ 서버와의네트워크통신에대한프로토콜및IQ 서버가사용중인 IP 주소, 포트번호등을기술할수있도록합니다.

DatabaseName or DBN : 클라이언트에서연결하고자하는 IQ 서버의데이터베이스이름을기술합니다.

DataSourceName or DSN : connection parameter들에대한대표이름을기술합니다. 이대표이름을 data source name 이라고부릅니다.

EngineName or ENG : 클라이언트에서연결하고자하는 IQ 서버의엔진(인스턴스) 이름을기술합니다.

IDLE : 클라이언트에서설정된시간동안 idle 하다면접속을해지합니다. 단, TDS 통신과 shared memory 통신을이용한접속은제외이며기본값은 IQ 서버쪽의기동옵션중에 -ti설정값입니다.

Page 17: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

: connection parameter

LogFile or LOG : 클라이언트쪽에서발생하는오류내용을저장하기위한파일이름을설정합니다.

Password or PWD : 클라이언트쪽에서접속을하기위한 IQ 서버의사용자계정에대한비밀번호를설정합니다.

Userid or UID : 클라이언트쪽에서접속을하기위한 IQ 서버의사용자계정을설정합니다.

기타다른 parameter에대해서는매뉴얼을참조하시기바랍니다.

Page 18: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

: network communication parameter

network communication parameter는클라이언트쪽과 IQ 서버쪽모두에기술이가능하고일반적으로클라이언트쪽에는 odbc.ini파일에서버쪽에는 cfg파일에기술합니다. 아래에기술된내용은클라이언트쪽에제한됩니다.

ClientPort or CPort : IQ 서버와통신하는클라이언트쪽의포트번호를설정하며방화벽이설치된클라이언트설정에사용할수있습니다.

Host or IP : 클라이언트가접속하고자하는 IQ 서버의 IP 주소를기술하며 ;으로분리하여여러개를사용할때는기술된순서에의해접속을시도하고응답을받으면그서버로접속합니다.

Local : 클라이언트가로컬에존재하는 IQ 서버로만접속할지여부를제어하며기본값은No이며로컬이아닌서버로의접속을허용합니다.

ServicePort or Port : IQ 서버가사용중인포트번호를클라이언트에게설정하며기본값은 2638입니다.

Timeout or TO : 접속한시도한클라이언트가응답이있을때까지기다리는시간을초로설정하며기본값은 5초입니다.

기타다른 parameter에대해서는매뉴얼을참조하시기바랍니다.

Page 19: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

JDBC/OCDK - win client

DSEDIT라는유틸리티를실행하고 OK 버튼을클릭합니다. 단, SYBASE IQ 12.5 이상에서는기본적으로 OCDK 모듈이설치되지않으므로별도로설치해야합니다.

start programs sybase Dsedit Utility

Server를하나추가시킵니다. Server Object Add……

Page 20: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

JDBC/OCDK - win client

등록된서버의 IP 주소와 port 번호를입력합니다Server Object Modify Attribute

OK 버튼을클릭합니다

콤마

Page 21: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

JDBC/OCDK - win client

SYBASE IQ 서버와연결테스트를실행합니다Server Object Ping Server

아래와같은연결성공메시지가보이면종료합니다.

Page 22: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

JDBC/OCDK - unix client

dscp유틸리티를이용% $SYBASE/OCS-12_6/bin/dscp

>> openOKFailOver to Interface DriverSession 1 InterfacesDriver>> add asiqdemo // IQ engine nameService : [SQL Server] // enterTransport Type : [tcp] tli tcp // sun을제외하면 tcpTransport Address : 157.133.75.36 2345 // IP, portTransport Type : [tcp] // enterTransport Address : // enterSecurity Mechanism [ ] : // enterHA Failoverserver : [ HA Failover Server ] // enterError in adding asiqdemo

Session 1 InterfacesDriver>> exit

Page 23: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

JDBC/OCDK - unix client

dscp유틸리티를이용(계속)위명령어가정상적으로수행되었다면 $SYBASE/interfaces 파일에다음과같은내용이들어있습니다.

수동으로편집$SYBASE/interfaces 파일을 vi 와같은편집기를사용하여위에서언급한것처럼편집하십시오. 단, 편집할때주의할점은master, query 앞의문자는반드시탭으로분리해야합니다.

asiqdemo // for Solarismaster tli tcp /dev/tcp \x000209299e4d32730000000000000000 query tli tcp /dev/tcp \x000209299e4d32730000000000000000

asiqdemo // for HP, IBM….master tcp ether 157.133.75.36 2345query tcp ether 157.133.75.36 2345

Tab

Page 24: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

DBISQL

SYBASE IQ의기본적인질의편집툴

Embedded SQL/C 계열UNIX : dbisqlcWindow : interactive SQL Classic

JAVA 계열UNIX : dbisqlWindow : interactive SQL JAVA

참고 : 원래 dbisql은 ASA(Adaptive Server Anywhere)의기본클라이언트입니다.

Page 25: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

Win : Interactive SQL Classic

Window 계열에서사용하며 ODBC를표준 API로사용하고있습니다.

아래순서대로 Interactive SQL Classic을실행합니다

Page 26: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

Win : Interactive SQL Classic

Login탭의 ODBC data source name콤보박스에서 ODBC 설정에서미리만들어놓은접속을원하는 data source name을선택한후 OK버튼을클릭합니다

Page 27: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

Win : Interactive SQL Classic

Data, Statistics, Command 세개의서브창을가지 Interactive SQL Classic 메인화면이나오고 Statistics 창에 Connected to database 라는접속성공메시지가모이면정상접속상태가됩니다. 이상태에서 SQL문을편집하여결과를조회할수있습니다

Commandwindow

Statisticswindow

Datawindow

Page 28: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

Win : Interactive SQL Classic

File menu : Command 창에서편집한 SQL문을저장할수있는 Save as, 저장된 SQL문을 Command 창으로불러올수있는 Open을비롯하여 New, Exit등이있습니다.

Edit menu : Command 창에서편집할수있는 Cut, Copy, Paste, Delete와접속한서버의특정한테이블을선택할수있는 Insert Table등이있습니다.또한각각의메뉴에는단축키와기능키가설정되어있어사용이간편합니다

Command menu : Command 창에서편집한 SQL문을실행하기위한 Execute, Command 창에서이미사용한명령어를다시사용할수있도록제어하는 Recall, Previous Command, Next Command, 새로운접속을위한 Connect, 접속을끊기위한Disconnect, 여러가지옵션을설정할수있는 Options등이있습니다.

Window menu : 서브창의배치를제어하는 Tile, Always Tile, 세개의서브창을각각활성화시키는 Data, Statistics, Command등이있습니다.

그외에 Help메뉴등이있습니다

Page 29: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

Win : Interactive SQL Classic

옵션설명 : Command 메뉴에 Options 서브메뉴를클릭하면아래와같은창이새로만들어지며각각에대한설명은다음과같습니다. 또한각옵션은 SYBASE IQ에접속시서버에등록되어있는해당되는각각의옵션값을읽어들여설정합니다.

Page 30: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

Win : Interactive SQL Classic

After Every Command : 실행되는모든단위명령어뒤에자동으로 commit 명령어실행여부를제어합니다. 서버에서인식하는옵션명은 Auto_Commit이며기본값은 Off 입니다.

When Exiting SQL : dbisqlc의접속을끊거나종료할때에 commit 명령어실행여부를제어합니다. 서버에서인식하는옵션명은 Commit_on_Exit이며기본값은On 입니다.

Automatic Window Refresh : Insert, Update, Delete의결과가현재실행중인질의결과에반영여부를제어합니다. 서버에서인식하는옵션명은 Auto_Refetch이며기본값은 On 입니다.

Show Column Headings : 각컬럼의헤딩을화면에표시할지여부를제어합니다. 서버에서인식하는옵션명은 Headings이며기본값은 On 입니다.

Beep on Errors : 오류가발생했을때경고음을발생할지여부를제어합니다. 서버에서인식하는옵션명은 Bell 이며기본값은 On 입니다.

Command Delimiter : 한문장의종료를표시하는문자를제어합니다. 서버에서인식하는옵션명은 Command_Delimiter이며기본값은 ;(세미콜론) 입니다

Page 31: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

Win : Interactive SQL Classic

Show Null Value As : 각테이블에입력된값중에 NULL 값의표현을어떻게할지제어합니다. 서버에서인식하는옵션명은 Nulls이며기본값은문자열 [NULL] 입니다.

Log ISQL Commands to File : Command 창에서편집된 SQL이기록되는파일의이름을제어합니다. 서버에서인식하는옵션명은 Isql_Log이며기본값은공백문자입니다. 즉별도파일로기록하지않습니다.

Echo During Execution : SQL 문이실행되기전에 Echo 될지여부를제어합니다. 서버에서인식하는옵션명은 Echo이며기본값은 On 입니다.

When an Error Occurs : 여러개의 SQL문을하나의배치로실행중에오류가발생하면어떻게처리할지를제어합니다. 서버에서인식하는옵션명은 On_Error이며기본값은 prompt 입니다.

Input Format, Output Format, Limit Output columns to : 현재지원되지않는옵션입니다.

Limit Display Columns To : 화면에출력되는각컬럼의최대길이를제어합니다. 서버에서인식하는옵션명은 Truncation_Length이며기본값은 30 입니다.

Page 32: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

Win : Interactive SQL Classic

OK button : 현재세션에서만변경된옵션의효력이발생하며 set temporary option과같습니다.

Permanent button : 해당되는사용자의변경된옵션의효력이지속적으로발생하며set option과같습니다.

OK

Permanent

Page 33: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

Win : Interactive SQL Classic

참고dbisqlc프로그램은질의에대한결과를조회할때 ESQL/C의커서를선언하여사용하고있습니다. 그래서커서를오픈한후에원하는결과가클라이언트로모두전송되지않고클라이언트버퍼크기만큼의양만전송되고더많은양을조회할때그때다시전송되고합니다. 여기서주의할점은프로그램이자동으로커서를종료하지않는다는것입니다. 이렇게커서가열려있는상태에있는테이블이나 Stored Procedure는다른사용자의DDL 명령을아래메시지처럼블록킹하고있습니다. 이런상태를벗어나려면또다른SQL 문을실행하거나 resume 이라는명령어를실행하십시오. 그러면커서가종료됩니다.

Page 34: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

UNIX : dbisqlc

Syntax : dbisqlc [-c "keyword=value……" | -d "delimiter" | -q | -x]여기서 -q 는 quite mode, -x는 syntax check only 옵션이며 keyword에해당되는자세한목록은매뉴얼을참조하시기바랍니다

GUI Mode : 그래픽문자를사용한텍스트형태로제공되어마우스를사용할수없다는것을제외하면Window 용과거의비슷합니다. 실행하기위한명령어는 dbisqlc이며뒤에접속을위한여러가지옵션을붙여줘야하는데붙이는방법에따라다음과같이 3가지형태로구분됩니다. dbisqlc실행파일의위치는 $ASDIR/bin에있습니다.

Command Line에직접입력 : dbisqlc를실행하면서접속에필요한옵션을명령어와같이입력합니다. 단, dbisqlc의실행을위한 path가적절히설정되었다고가정합니다

% dbisqlc -c "uid=DBA;pwd=SQL;eng=asiqdemo;dbn=asiqdemo“

SQLCONNECT 환경변수이용 : 접속에필요한옵션을 SQLCONNECT라는환경변수에설정하고그냥단순히명령어만실행하면됩니다.% dbisqlc

.odbc.ini이용 : 접속에필요한옵션을 .odbc.ini라는파일에 data source name 이라는대표이름을이용하여저장하고접속할때이이름을옵션으로입력합니다.% dbisqlc -c dsn=asiqdemo

Page 35: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

UNIX : dbisqlc

Quite Mode : UNIX 환경의 GUI 모드에서는여러가지불편한점이많은관계로잘사용하지않지만배치파일형태로 SQL 명령어들을파일로저장하여놓고이파일을입력파일로이용하여실행할때많이사용하는방법입니다. 실행하기위한명령어및 3 가지의사용형태는모두 GUI 모드와같고각각의뒤에 "-q filename" 옵션을붙여주면됩니다.

Command Line에직접입력% dbisqlc -c "uid=dba;pwd=SQL;eng=asiqdemo;dbn=asiqdemo" -q query.sql

SQLCONNECT 환경변수이용% dbisqlc -q query.sql

.odbc.ini이용% dbisqlc -c dsn=asiqdemo -q query.sql

Page 36: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

Win : Interactive SQL JAVA

Window 계열에서사용하며 JDBC를표준 API로사용하고있으며 JDBC-ODBC API를옵션으로제공하고있습니다.

아래순서대로 Interactive SQL JAVA를실행합니다

Page 37: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

Win : Interactive SQL JAVA

Identification 탭의 ODBC data source name 콤보박스에서 ODBC 설정에서미리만들어놓은접속을원하는 data source name을입력혹은선택한후 OK 버튼을클릭합니다. 참고로 Advanced 탭에서추가적으로필요한옵션과 API로어떤 JDBC Driver를사용할것인지선택할수있습니다.

Page 38: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

Win : Interactive SQL JAVA

SQL Statements, Messages/Results 두개의서브창을가지 Interactive SQL JAVA 메인화면이나오고이상태에서 SQL Statements 창을통해 SQL문을편집하여결과를조회할수있습니다

SQL Statementswindow

Messages/Resultswindow

접속상태확인

Page 39: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

Win : Interactive SQL JAVA

File menu : SQL Statements 창에서편집한 SQL문을저장할수있는 Save as, 저장된SQL문을 SQL Statements 창으로불러올수있는 Open을비롯하여 SQL 문을파일로부터읽어바로실행하는 Run Script, Exit등이있습니다.

Edit menu : SQL Statements 창에서편집할수있는 Redo, Undo, Cut, Copy, Paste, Delete, Find/Replace, Find Next, Go To, Clear, Select All 과 SQL을저장한파일을입력할수있는 Insert File등이있습니다.또한각각의메뉴에는단축키와기능키가설정되어있어사용이간편합니다

SQL menu : SQL Statements 창에서편집한 SQL문을실행하기위한 Execute, Execute Selection, 실행을취소하는 Stop, SQL Statements 창에서이미사용한명령어를다시사용할수있도록제어하는 History, Previous SQL, Next SQL, 새로운접속을위한 Connect, 접속을끊기위한 Disconnect, SQL문의기록을시작, 종료하는 Start Logging, Stop Logging등이있습니다.

Data menu : 현재툴을사용하고있는클라이언트의위치를기준으로 DB로혹은 DB에서데이터를 Import, Export해줍니다. Import 시주의할점은데이터가 insert into values 형태로한건한건들어가기때문에부작용을충분히숙지한후에사용바랍니다.

Window menu : 창을종료하는 Close Window, 새로운창을만드는 Open Window, 열려있는서브창을각각활성화시키는메뉴등이있습니다. 그외에 Help메뉴등이있습니다

Page 40: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

Win : Interactive SQL JAVA

Tools menu : DB에생성되어있는테이블을조회, 선택할수있는 Lookup Table Name, Stored Procedure를조회선택할수있는 Lookup Procedure Name, 메뉴방식으로질의를만들수있도록도와주는 Edit Query, 설정의변경을가능하게해주는 Options등이있습니다.

옵션설명 : 옵션은 SYBASE IQ에접속시서버에등록되어있는해당되는각각의옵션값을읽어들여설정합니다. 각각의옵션은 Interactive SQL Classic와거의유사합니다.

ASA만사용

Page 41: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

UNIX : dbisql

실행파일은 $SYBASE/ASIQ-12_6/bin/dbisql 이며실행후의내용은 Interactive SQL JAVA와같습니다.

ASA영역

Page 42: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

dbisql command

clear : data window 혹은 results window의내용을모두지웁니다.

configure : dbisql툴의옵션을변경할수있는 option window를활성화합니다.

connect : 기술된데이터베이스와의연결을수행하며연결중이던채널은종료되지않고비활성화되며새로운채널이활성화됩니다. 이렇게하나의클라이언트에서여러개의채널을열어서사용할수있습니다.

connect [ to engine-name ] [ database database-name] [ as connection-name ] [ user ] userid [ identified by password ]

connect using connect-string

disconnect : 현재활성중인데이터베이스와의연결을종료합니다. 열려있는모든채널과의연결을종료하려면 all 옵션을주면됩니다. Commit_On_Exit 옵션의영향이없습니다.

disconnect [ { connection-name | current | all } ]

exit, quit, bye : dbisql을종료합니다. Commit_On_Exit 옵션의설정값에따라종료되지않은트랜잭션의 COMMIT 혹은 ROLLBACK을수행합니다.

help : ASA에서만온라인도움말기능이가능합니다.

Page 43: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

dbisql command

parameters : quite모드에서사용하는입력파일에서파라미터를정의하는데사용합니다.선언된이후에참조될때는 { }로양쪽이감싸져야하며나중에 read명령어를통해파라미터전달이가능합니다.

parameters param1 [,param2,……]

read : command file에선언된파라미터의값을넘겨줍니다.

예) parameter & read% dbisqlc -c dsn=asiqdemo -q read query.sql 50000 200403

% vi query.sql

set connection : connect 명령어에의해연결된여러개의채널중에활성채널을선택합니다.

parameters param_salary, param_month;

SELECT emp_lnameFROM employeeWHERE salary > {param_salary}and sal_month = '{param_month}';

Page 44: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

dbisql command

set : 현재연결된사용자에게설정된옵션값들을별도의창에출력해줍니다.

그외에 start engine, stop engine, start database, stop database등이있는데이는ASA 환경에서사용되는명령어들입니다. SYBASE IQ 환경에서는잘못동작할수있으니주의바랍니다.

Page 45: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

: Sybase Central

SYBASE IQ와연결하여 Admin 작업을할수있는디폴트툴이며다음과같은작업을수행할수있습니다.데이터베이스생성, dbspace생성및제거테이블, 뷰, 인덱스, Stored Procedure 생성사용자및그룹의권한관리

Page 46: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

isql

ASE의기본 SQL 편집툴이며 UNIX와Win 모두같은환경에서실행가능합니다.

클라이언트를실행하면서연결에필요한파라미터를실행명령어와같이입력합니다

isql -Udba -Psql -Sasiqdemo1> sp_iqstatus2> go...

1> exit

참고isql및Win 환경에서사용하는 SQL Advantage와같은 SYBASE Native Driver를사용하는툴들은 SYBASE IQ와접속할때 ODBC 연결과는기본설정옵션등여러가지면에서다릅니다. 그래서가능하면사용을자제하시고꼭사용하실때에도이점충분히숙지하시고사용하시기바랍니다.

Page 47: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

Using WatcomSQL

Page 48: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

: asiqdemo db

본문에서언급되는대부분의질의는 SYBASE IQ 설치할때기본적으로제공되는샘플데이터베이스인 asiqdemo의오브젝트(테이블, stored procedure등)들을참조하고있습니다.

다음장에 asiqdemo db의테이블에대한 ERD가첨부되어있으니실습이필요하신분들은이 ERD를참조하시고 asiqdemo db에접속해서사용하시기바랍니다.

이데이터베이스를생성하는스크립트는 $ASDIR/demo/mkasiqdemo.cfg입니다.

Page 49: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

: asiqdemo db ERD

emp_id unsigned intmanager_id unsigned intemp_fname char(20)emp_lname char(20)dept_id unsigned intstreet char(40)city char(20)state char(4)zip_code char(9)phone char(10)status char(1)ss_number char(11)salary numeric(20,3)start_date timestamptermination_date datebirth_date timestampbene_health_ins char(1)bene_life_ins char(1)bene_day_care char(1)sex char(1)

employee

id unsigned intname char(15)description char(30)size char(18)color char(6)quantity unsigned intunit_price numeric(15,2)

product

id unsigned intfname char(15)lname char(20)address char(35)city char(30)city char(20)state char(2)zip char(10)phone char(12)company_name char(35)

customer

id unsigned intline_id smallintprod_id unsigned intquantity unsigned intship_date timestamp

sales_order_items

id unsigned intcust_id unsigned intorder_date timestampfin_code_id char(2)region char(7)sales_rep unsigned int

sales_order

year char(4)quater char(2)code char(2)amount numeric(9)

fin_data

code char(2)type char(10)description char(50)

fin_code

dept_id unsigned intdept_name char(40)dept_head_id unsigned int

department

id unsigned intlast_name char(15)first_name char(15)title char(2)street char(30)city char(20)state char(2)zip char(5)phone char(10)fax char(10)

contact

Page 50: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

WatcomSQL

WatcomSQL은 ASA에서사용하는 SQL언어이며 ANSI 표준에추가적으로 Sybase의향상되어진기능을제공하는질의를위한구조적인언어입니다. 이언어는질의를위한SQL 문뿐만아니라제어문과같은프로그래밍구조도포함하는절차적언어이기도합니다.

T-SQL은 Transact-SQL의줄임말로 ASE에서사용되어지는 SQL 언어입니다.

SYBASE IQ에서는WatcomSQL대부분을기본적으로제공하고있으며 ASE와호환성을유지하기위해 T-SQL도사용가능합니다.

그러나성능, 안정성적인측면을고려하여 SYBASE IQ에서는WatcomSQL사용을권장합니다.

참고 : SYBASE IQ에서WatcomSQL모두를지원하지는않으며이교재에서언급하는WatcomSQL은 ASA가아닌 SYBASE IQ를위한 SQL 임을기본전재로합니다. 또한태생적인인연으로인하여 MS SQL Server의 Transact-SQL은 SYBASE가개발하고추후MS가수정을한 SQL 언어임을참고로알려드립니다.

Page 51: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

WatcomSQL

논리적으로관련된문장들을하나의블록형태로묶어처리하기때문에프로그램을모듈화해서개발할수있습니다.

프로그램밍언어에서사용가능한변수등의사용이가능합니다.

IF, LOOP, WHILE 등과같은제어문등을포함하기때문에절차적인언어구조로된프로그램이가능합니다.

예외처리를위한기능을제공하기때문에사용자의예외에대한처리로직을줄일수있습니다.

여러 SQL 문장을블록으로묶어서버와통신하기때문에통신량을줄일수있습니다.

Stored Procedure와같이사용하여프로그램을서버쪽에두고관리하기때문에유지보수에대한비용을줄일수있으며통신량을추가적으로줄일수있습니다.

Page 52: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

compound statement

BEGIN, END 라는 keyword로 SQL문의블록을생성하며그안에지역선언부, 실행부, 예외처리부와같은내용이들어갈수있으며지역선언부와예외처리부는생략가능합니다.

이렇게만들어지는블록은옵션으로이름을줄수도있고또한하나의블록을단일명령어처리하기위해서 BEGIN 뒤에 ATOMIC 옵션을사용할수도있습니다.

이러한 BEGIN~END로묶여진블록구조를 compound statement라고합니다.

지역선언부에서는지역변수, 커서, EXCEPTION, 임시테이블을선언할수있으며이렇게만들어진 Object들은그 compound statement 내에서만사용가능합니다. 경우에따라지역선언부는생략가능합니다.

예외처리부에서는지역선언부에서선언되어진예외에대한처리루틴이포함되지만경우에따라생략가능합니다.

이런구조는중첩될수있고프로시져, 함수등의몸체로사용되어지며블록내의모든개별 SQL문은 ;로구분됩니다.

Page 53: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

compound statement

참고 : compound statement 내부에서만사용가능한명령어DECLARE VARIABLEDECLARE EXCEPTION, EXCEPTION HANDLERCASE statement ( not case expression )CURSOR FORcursor ( DECLARE CURSOR, OPEN, FETCH, CLOSE )EXECUTE IMMEDIATE (Dynamic SQL)SIGNAL……

[ label;] // 이름BEGIN [ ATOMIC ] // 시작

[ local-declaration ] // 지역선언부statement-list; // 실행부[ exception ] // 예외처리부

END [ label ] // 종료

Compound Statement

Page 54: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

클라이언트에서서버로전송한 SQL 문장단위를배치라고말하며하나의배치에서는거의모든WatcomSQL문을사용할수있습니다.

문법에따라어떤문장요소는한문장이바로배치가되어야만하는경우도있고여러문장이모여하나의배치를이루는경우도있습니다.

INSERT, UPDATE, DELETE, SELECT, COMMIT와같은질의를위한 SQL 기본문장들은여러개의 SQL문을하나로배치로처리하기위해서마지막 SQL 문장뒤에세미콜론으로문장을분리하면되지만그외의프로그래밍을위한요소들은반드시한문장이하나의배치로처리되어야만합니다.

배치는트랜잭션과다르며 BEGIN ~ END, IF THEN ~ END IF등으로묶여있다면배치의끝은 END 이며그렇지않다면 ;으로구분됩니다.

만약배치내에서 syntax 오류가발생한다면그배치전체가실행되지않습니다. 단, 해당 object가존재하지않는경우는 syntax 오류로보지않습니다.

만약 dbisqlc에서배치로 2개이상의 SELECT문장을실행했다면첫번째 SQL문의결과를조회한후에 2번째결과를보기위해서는 RESUME 이라는명령어를실행해야합니다.

Page 55: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

예1)INSERT INTO department ( dept_id, dept_name )

VALUES ( 220, 'Eastern Sales' ) UPDATE employee

SET dept_id = 220 WHERE dept_id = 200 AND state = 'MA'

COMMIT; // 3 statement per 1 batch

예2)INSERT INTO department ( dept_id, dept_name )

VALUES ( 220, 'Eastern Sales' );UPDATE employee

SET dept_id = 220 WHERE dept_id = 200 AND state = 'MA';

COMMIT; // 1 statement per 1 batch

Page 56: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

variable

임시적인데이터를보관하기위한용도로혹은 stored procedure와같은서브프로그램으로데이터를넘겨다이나믹한 SQL 프로그램을구현하기위한용도로사용합니다.

변수는활동범위에따라 local variable, connection level variable, global variable로나뉘어지며 global variable은 ASE와호환성을유지하기위해서제공하고있습니다.

EXECUTE IMMEDIATE와같은다이나믹 SQL과같이제한적으로사용할수있었는데12.6 부터는아래와같은위치에서도변수를사용할수있도록허용하여개발의용이성을증대했습니다.

SELECT TOP n에서 nBACKUP문에서 archive-deviceRESTORE문에서 db-file, archive-device, dbspace-nameLOAD TABLE문에서 FROM절의 file-name

변수이름의시작은변수라는것을나타내기위해 v_와같은특별한문자사용하기를권장하며이문장의끝은반드시세미콜론으로닫아줘야합니다.

사용되기전에반드시선언이먼저되어야하고선언될때 data type에관계없이 NULL 값을가지고있습니다

Page 57: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

local variable

BEGIN 바로다음에 DECLARE문에의해 compound statement 내부에서만선언되며그내부에서만사용할수있습니다. 즉 BEGIN ~ END 안에서만사용가능합니다.

콤마에의해여러개의변수를같이선언하는것은불가능하며만약필요하다면매번DECLARE를사용해야하며선언과동시에디폴트로특정한값을할당할수는없습니다.

syntaxDECLARE variable-name data-type;

예)BEGIN

DECLARE v_max_sales INTEGER;DECLARE v_half_max NUMERIC(10,0);……………..

END; // 만약 BEGIN ~ END 없이 LOCAL 변수를선언하면?

Page 58: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

connection level variable

CREATE VARIABLE문에의해 compound statement 내, 외부에서선언되며해당세션이종료되거나 DROP VARIABLE를통해삭제됩니다

콤마에의해여러개의변수를같이선언하는것은불가능하며만약필요하다면매번CREATE VARIABLE를사용해야하며선언과동시에디폴트로특정한값을할당할수는없습니다.

syntaxCREATE VARIABLE variable-name data-type;

예)CREATE VARIABLE v_max_sales INTEGER;CREATE VARIABLE v_half_max NUMERIC(10,0);

Page 59: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

variable-data type

변수선언할때각변수의 data type도선언해야하며선언할수있는 data type은테이블의컬럼에선언할 data type과같습니다.

Data Type RangeMax Prec.

Storage(byte)

CHAR (n)CHARACTER (n)

1 <= n <= 255 n

CHAR (n)CHARACTER (n)

256 <= n <= 32K 256 + (n - 255)

VARCHAR (n)CHARACTER VARYING (n)

1 <= n <= 255 n

VARCHAR (n)CHARACTER VARYING (n)

256 <= n <= 32K 256 + (n - 255)

INTEGERUNSIGNED INT

-2,147,483,648 ~ 2,147,483,6470 ~ 42,942,967,294

1011

4

TINYINT 0 ~ 255 3 1

Page 60: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

variable-data type

Data Type RangeMax Prec.

Storage(byte)

SMALLINT -32,768 ~ 32,767 5 2

BIGINTUNSIGNED BIGINT

-9,223,372,036,854,775,808 ~9,223,372,036,854,775,807

0 ~ 18,446,744,073,709,551,615

1920

8

FLOAT (n) Platform-dependent 16 4 or 8

REAL Platform-dependent 7 4

DOUBLE 2.22 (^308) ~ 1.79 (^308) 15 8

DECIMAL (p,s)NUMERIC (p,s)

-10^38 ~ 10^38 - 1 126 2 to 69

BINARY (n) 1 <= n <= 255 256

Page 61: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

variable-data type

Data Type RangeMax Prec.

Storage(byte)

VARBINARY (n) 1 <= n <= (32k - 1) 32K - 1

BIT 0, 1, NULL 1

DATE 0001/01/01 ~ 9999/12/31 4

DATETIMESMALLDATETIMETIMESTAMP

0001/01/01 00:00:00.000000 ~9999/12/31 23:59:59.999999

8

TIME 00:00:00.000000 ~ 23:59.59.999999 8

Page 62: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

선언된변수에새로운값을할당할수있는방법에는아래와같이두가지가있는데테이블로부터특정한값을선택하여할당할때는반드시 SELECT INTO문을사용해야합니다.

이렇게테이블로부터값을선택하여변수에할당할때에는반드시 1건의결과만산출되어야합니다. 2건이상의결과를산출하면오류가발생합니다.

syntax1SET variable-name = expression;

syntax2SELECT select-list INTO variable-nameFROM table-list

Page 63: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

예) SET문을통해서CREATE PROCEDURE greater_proc ( IN v_a INT, IN v_b INT, OUT v_c INT )BEGIN

IF v_a > v_b THENSET v_c = v_a;

ELSESET v_c = v_b;

END IF;END

예) single row SELECT문을통해서BEGIN

DECLARE v_customer_id INT;DECLARE v_orders INT;SELECT COUNT(b.cust_id) INTO v_ordersFROM customer a, sales_order bWHERE a.id = b.cust_idAND a.id = v_customer_id;

END// 만약 select 한결과가 2건이상이면오류발생

Page 64: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

temporary table

프로그램밍언어에서임시결과를보관하기위해변수를사용해왔던것처럼 SQL 이란언어는취급하는대상이집합단위의데이터이기때문에이런집합단위의임시결과를보관하기위한구조가필요한데이를충족할만한것이임시테이블 (in-line view 포함) 입니다.

데이터베이스엔진이질의를컴파일해서결과를산출할때 GROUP BY, ORDER BY, JOIN 과같은작업은한번의작업으로그처리를수행할수없기때문에내부적으로임시테이블을사용합니다.

사용자가엔진이임시테이블을사용하는것처럼임시저장용도로사용하기위해임의의임시테이블을만들어사용할수있습니다. 이렇게임의의테이블을만들어사용해서얻는이점은그테이블에인덱스를생성할수있어임시저장량이많을경우도움이됩니다.

임시테이블을누가만들어사용하던지데이터가작업되는영역은 IQ TEMPORARY STORE 입니다.

참고 : In-line view vs. Temp table일반적으로 FROM 절에임시결과값을저장하는 In-line view 형태의임시테이블을많이사용하는데같은용도로인덱스를만들정도로데이터양이많이산출되는결과라면임시테이블을만들어사용하는편이과정상불편할수있지만좋은성능을발휘합니다.

Page 65: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

local temporary table

compound statement 내/외부에서만들어지며만들어진영역을벗어나거나세션을마치거나 DROP TABLE문을만나면삭제됩니다.

DECLARE LOCAL TEMPORARY TABLE 이라는명령어를통해만들수있고다른세션의사용자는이테이블을사용할수없습니다. 또한임시테이블에입력된데이터는기본적으로 COMMIT 시에삭제되지만옵션으로저장상태를유지할수도있습니다.

임시테이블이라도필요한컬럼에적절한인덱스는만들어야합니다.

만약프로시져내부에서만든다면임시테이블의이름은그프로시져의이름과연관이있도록명명하는편이디버깅에편리합니다

syntaxDECLARE LOCAL TEMPORARY TABLE table-name

( { column-definition [ column-constraint….] | table-constraint }, …)ON COMMIT { DELETE | PRESERVE } ROWS ];

예)DECLARE LOCAL TEMPORARY TABLE customer_temp

( cust_id INT, cust_name CHAR(20), cust_address CHAR(255) )ON COMMIT PRESERVE ROWS;

Page 66: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

global temporary table

compound statement 내/외부에서만들어지며 DROP TABLE문을만나면삭제되며연결상태가종료되면저장된데이터는삭제됩니다. 단, 테이블정의는보관됩니다.

CREATE GLOBAL TEMPORARY TABLE 이라는명령어를통해만들수있고다른세션사용자는이테이블을사용할수있지만데이터는사용할수없습니다. 또한임시테이블에입력된데이터는기본적으로 COMMIT 시에삭제되지만옵션으로저장상태를유지할수도있습니다.

임시테이블이라도필요한컬럼에적절한인덱스는만들어야하며만약프로시져내부에서만든다면임시테이블의이름은그프로시져의이름과연관이있도록명명하는편이디버깅에편리합니다

syntaxCREATE GLOBAL TEMPORARY TABLE table-name

( { column-definition [ column-constraint….] | table-constraint }, …)ON COMMIT { DELETE | PRESERVE } ROWS ];

예)CREATE GLOBAL TEMPORARY TABLE customer_temp

( cust_id INT, cust_name CHAR(20), cust_address CHAR(255) )ON COMMIT PRESERVE ROWS;

Page 67: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

DECLARE LOCAL TEMPORARY TABLE employee(

emp_id INT NOT NULL,lname CHAR(30) NOT NULL,fname CHAR(30) NOT NULL,salary UNSIGNED INT NOT NULL,dept_id INT NOT NULL

) IN SYSTEM

위의테이블은 SYBASE IQ Temporary Store 영역에생성되지않고 ASA의임시공간인/tmp/.SQLAnywhere/에휘발성파일로생성되며파일크기한계를가지고있습니다. 이한계값에도달하면 IQ Server가down되거나 hang 상태가되는등여러가지부작용이많습니다. IQ에서 ASA는단순히 Catalog를위한공간이므로사용자들의사용을금하여주십시오.

local temporary table vs. global temporary tableETL 작업에서 CDC 데이터를본테이블에반영하기전에로딩하기위한임시테이블형태와같이사용빈도가많은경우는 global temporary table을사용하는편이서버에게테이블을매번만드는부담을줄여줄수있습니다.

Page 68: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

if

다른언어들과유사하게일치하는조건에따라선택적으로작업을할수있게해줍니다. 만약조건이 TRUE 이면 THEN ~ ELSE 사이의문장을수행하고 FALSE, NULL 이면ELSE ~ END IF 사이의문장을수행합니다.

논리적으로이해하기편하게하기위해 IF ~ ELSE문을중첩해서사용하기보다는 IF ~ ELSEIF ~ ELSE나 CASE 문의사용을권장합니다.

문장구현시 ELSEIF 문의스펠링과종료시에 END IF의사용에주의하시기바랍니다.

조건절에서 NULL 값에대한비교는 IS NULL 연산자를사용하시면됩니다.

syntaxIF search-condition THEN

statement-list;[ ELSEIF search-condition THEN

statement-list; ][ ELSE

statement-list; ]END IF;

Page 69: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

case statement

중첩된 IF문처럼여러조건에따라분기해야한다면이때사용가능한구조가 CASE 입니다. 이를 CASE statement라고합니다.

문장구현종료시에 END CASE의사용에주의하시기바랍니다.

syntaxCASE value-expression

WHEN [ constant | NULL ] THEN statement-list;[ WHEN [ constant | NULL ] THEN statement-list; ]ELSE statement-list;

END CASE;

예)BEGIN

DECLARE prod_name CHAR(20); DECLARE type CHAR(10);SELECT name INTO prod_name FROM productWHERE id = 300;CASE prod_name

WHEN 'Tee Shirt' THEN SET type = 'SHIRT'ELSE SET type = 'Unknown'

END CASE;END

Page 70: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

case expression

SELECT절에서혹은컬럼을대신할수있는다른절에서사용이가능하며컬럼의분기조건이나타날때사용할수있는구조입니다. 이를 CASE expression 이라고합니다.

SYBASE IQ의WatcomSQL에서는 SELECT 절에 IF문을사용할수없고커서의사용빈도를줄이기위해 CASE 표현식의사용을권장하며종료시에 END의사용에주의하시기바랍니다. (case statement에서는 END CASE 입니다)

syntaxCASE expression

WHEN expression THEN expression[ ELSE expression ]

END

예)SELECT id, SELECT name,

( CASE name ( CASEWHEN 'Tee Shirt' THEN 'Shirt' WHEN id=300 THEN 'Shirt'WHEN 'Sweatshirt' THEN 'Shirt' WHEN id=600 THEN 'Shirt'WHEN 'Baseball cap' THEN 'Hat' WHEN id=400 THEN 'Hat'ELSE 'Unknown' ELSE 'Unknown'

END ) as Type END ) as TypeFROM product; FROM product;

Page 71: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

loop

가장간단한형태의루프로 LOOP ~ END LOOP 사이에반복되는문장들로이루어져있으며탈출조건을제시하지않으면무한루프가되어시스템에많은부하를주기때문에반드시특정한조건을주고 LEAVE 문을통해루프를탈출할수있도록해야합니다.

syntax[ statement-label : ]LOOP

statement-list;END LOOP [ statement-label ]

예)………SET i = 1;insert_loop:LOOP

INSERT INTO counter (number) VALUES (i);IF i >= 10 THEN

LEAVE insert_loop;END IF;SET i = i + 1;

END LOOP insert_loop// 위예는오직 LOOP문을 설명하기위한예로실제이런입력문의사용을자제바랍니다.

Page 72: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

while loop

조건이 TRUE 인동안만일련의문장을반복하기위해사용하며조건은반복이시작될때체크하게되어루프내의문장이한번도수행되지않을경우도있습니다.

루프를시작할때조건이 FALSE 이면루프를탈출하게됩니다.

syntax[ statement-label : ]WHILE search-condition LOOP

statement-list;END LOOP [ statement-label ]

예)SET i = 1;insert_loop:WHILE i <= 10 LOOP

INSERT INTO counter (number) VALUES (i);SET i = i + 1;

END LOOP insert_loop

// 위예는오직WHILE LOOP문을설명하기위한예로실제이런입력문의사용을자제바랍니다.

Page 73: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

cursor for loop

일반적으로많이사용하는 index counter를증가시켜가며특정문장을반복하는 FOR LOOP와다르며 BEGIN ~ END 사이의 compound statement 내에서만사용가능합니다.

오직커서와함께사용하며 FETCH 로직을커서의마지막데이터까지 반복적으로사용하고자동으로커서가 close 되는등편리한면이있습니다.

syntaxFOR for-loop-name AS cursor-nameCURSOR FOR statement [ FOR UPDATE | FOR READ ONLY ]DO

statement-list;END FOR

예)CREATE VARIABLE v_emp_name CHAR(20);FOR names AS cursCURSOR FOR SELECT emp_fname

FROM employeeDO

SET v_emp_name = emp_fname;CALL search_for_name_proc ( v_emp_name );

END FOR;

Page 74: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

resume

dbisql과같은툴에서는 SELECT 한결과를화면상에출력할때조건에만족하는모든데이터를한번에출력하지않고그결과의일부분만을먼저출력하는커서형태의방식을적용합니다.(dbisql classic에서만나타나는현상이며 dbisql Java 제외)

그래서커서가 OPEN된상태에서는해당되는테이블에대한어떠한종류의 DDL 문을수행할수없습니다.이럴때그커서를 CLOSE 해주는역할을하는명령어가 RESUME 입니다.

마찬가지로 stored procedure도똑같이적용이되어실행이종료된것처럼보이는stored procedure도 RESUME를해주기전까지는 DROP 이나 ALTER 명령어를수행할수없습니다.

예)SELECT emp_name FROM employeeSELECT name FROM product;// dbisql과같은툴에서위처럼한배치에서두개의 SELECT문을사용했다면첫번째// 결과가기본적으로보여지고 RESUME 을해야만두번째결과를볼수있습니다.

참고SELECT를수행한후에 RESUME 만실행한상태는 CURSOR가닫혀있는상태지만아직까지도 SELECT한테이블에대한 shared lock을 release하지는않았습니다.이 lock까지를 release 하려면 RESUME 후에 COMMIT을실행하면됩니다.

Page 75: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

set option

데이터베이스내에기본값으로설정되어진여러가지옵션을변경할수있습니다. 대상이되는옵션에는 IQ 영역에서만적용되는옵션, ASA 영역에서만적용되는옵션, dbisql툴에서만적용되는옵션, ESQLC 영역에서만적용되는옵션등이있으며이에대한자세한내용은매뉴얼을참고하시기바랍니다.

연결중인세션에서만설정값을바꾸려면 TEMPORARY라는 keyword를사용해야하며생략할때는 PERMANENT 하게변경합니다.

user-name을생략하면현재이명령어를사용중인사용자가명령어의대상이되며모든사용자에게적용할때에는 PUBLIC이라는 group-name을사용하면됩니다.

sp_iqcheckoptions를이용하여변경된 option 값을확인할수있습니다.

syntaxSET [temporary] OPTION [user-name|public.]option-name = value;

SET OPTION PUBLIC.Load_Memory_MB = 400;SET TEMPORARY OPTION Query_Plan = 'On';SET TEMPORARY OPTION Temp_Extract_Name1 = '/asiq/data/test.dat';

Page 76: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

Double Hyphen(--)한줄에서이문자뒤의문자를주석처리합니다

Double Slash(//)한줄에서이문자뒤의문자를주석처리한다. --와동일합니다

Slash-Asterisk(/* */) /* 와 */ 사이의모든문자는줄에관계없이주석처리합니다

Percent sign(%) Percent_as_comment 옵션의값이 ON 이면 --와동일합니다

Page 77: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

dynamic SQL

SQL keyword나 object의이름을변수로받아서다이나믹하게새로운 SQL를만들어낼수있습니다.

BEGIN ~ END 사이의 compound statement 내부에서만사용가능하며 exception 처리는불가능합니다.

WITH QUOTES, WITH ESCAPES의옵션에따라 " 혹은 escape sequence 부호를데이터로해석할지특수문자로해석할지여부가결정됩니다. 단, 12.6 부터가능합니다.

WITH RESULT SET 옵션을 ON으로설정하여사용하면다이나믹 SQL에서도 result set을산출할수있습니다. 단, 12.6 부터가능합니다.

syntaxEXECUTE IMMEDIATE [ WITH QUOTES { ON | OFF } | WITH ESCAPES { ON | OFF }

| WITH RESULT SET { ON | OFF } ] string-expr;

예) CREATE PROCEDURE CreateTable_proc( in v_tablename char(30) )BEGIN

EXECUTE IMMEDIATE 'CREATE TABLE ' || v_tablename || ' ( column1 int,…………)';

END

Page 78: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

message

메시지를출력하기위해사용되며메시지가출력되는곳을 CONSOLE과 LOG로지정하면 server log 파일에메시지가출력됩니다.

CLIENT로지정하면 dbisql과같은윈도우를지원하는클라이언트에메시지가출력됩니다. 단, 여기서 server log 는 $SYBASE/ASIQ-12_6/logfiles/srvname.xxx.srvlog 파일을지칭합니다.

또한 MESSAGE TYPE을 INFO, STATUS라하면 Message Window에, ACTION, WARNING이라하면기본윈도우가아닌 Message Box에해당메시지가출력됩니다.

CLIENT FOR 옵션을이용하여특정한클라이언트에혹은모든연결된클라이언트에대상메시지를출력할수있습니다.

syntaxMESSAGE expression

[ TYPE { INFO | ACTION | WARNING | STATUS } ][ TO { CONSOLE | CLIENT [ FOR { CONNECTION conn_id | ALL } ] | LOG }

[ DEBUG ONLY ] ]

예)MESSAGE 'The current date and time: ', Now() TYPE INFO TO CLIENT;

Page 79: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

message

참고 : SQL사용중에 UNIX 명령어를사용하여메시지출력하는예

CREATE VARIABLE MsgText VARCHAR(255); CREATE VARIABLE CurrTime VARCHAR(30);

SET CurrTime = CAST(NOW() AS VARCHAR(30));

SET MsgText = 'echo the message you want to send to the file ' || ' at ' || CurrTime || ' >> /tmp/outputfile.txt';

CALL xp_cmdshell(MsgText); // OS 명령어를수행하는 SP

Page 80: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

exception

EXCEPTION 이란 compound statement 실행중에발생하는오류를의미하며이런EXCEPTION은 SYBASE IQ 엔진에의해생성될수도있고사용자가임의적으로만들어발생시킬수도있습니다.

compound statement 실행할때에오류가발생하면그시점에서실행을중단하고관련된예외처리기부분으로제어를옮겨조건에따라마지막조치작업을할수있도록도와주는구조가 exception handler 입니다.

이렇게 exception handler를사용하려면미리자동으로정의된예외를이용하거나아니면사용자가임의적으로 DECLARE 문을이용하여예외를선언하여야하며또한선언된각각에대한처리루틴을 EXCEPTION문에기술해야합니다.

오류가발생했을때 SQLCODE, SQLSTATE 두함수를사용하여관련된오류코드및상태를확인할수있습니다.

syntaxDECLARE exception-name EXCEPTION FOR SQLSTATE sqlstate-number;

EXCEPTION [ WHEN exception-name THEN statement-list; ……][ WHEN exception-name THEN statement-list; ……]WHEN OTHER THEN statement-list;

Page 81: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

exception

예)BEGIN

DECLARE column_not_foundEXCEPTION FOR SQLSTATE '52003'; // 예외선언

MESSAGE 'Hello !!!' TO CLIENT;SIGNAL column_not_found; // 예외발생MESSAGE 'Line following signal !!!' TO CLIENT; // 수행안됨

EXCEPTION // 예외처리WHEN column_not_found THEN // 52003 예외처리

MESSAGE '52003 handling. (SQLSTATE = ', SQLSTATE, ')' TO CLIENT;

WHEN others THEN // 그외예외처리MESSAGE 'Others handling. (SQLSTATE = ',

SQLSTATE, ')' TO CLIENT;END

Page 82: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

exception

사용자가임의의예외(SQLSTATE) 경우를만들어예외처리를수행할수있으며이때주의할점은 선언가능한 SQLSTATE 번호는 99000 ~ 99999 이라는사실입니다. 그외의번호는시스템이예약한번호들이기때문입니다.

예)BEGIN

DECLARE my_exceptionEXCEPTION FOR SQLSTATE '99000'; // 사용자정의예외선언

MESSAGE 'User-Defind Exception test !!!' TO CLIENT;

// 여기에사용자정의예외를만드는조건을입력하는데예에서는 signal로대신함SIGNAL my_exception; // 사용자정의예외발생

MESSAGE 'Line following signal !!!' TO CLIENT; // 수행안됨

EXCEPTION // 예외처리WHEN my_exception THEN // 사용자정의예외처리

MESSAGE 'my_exception handling. (SQLSTATE = ', SQLSTATE, ')' TO CLIENT;

WHEN others THEN // 그외예외처리MESSAGE 'Others handling. (SQLSTATE = ',

SQLSTATE, ')' TO CLIENT;END

Page 83: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

signal

시스템에서제공된 SQLSTATE 혹은사용자가만든 SQLSTATE를임의적으로발생시키는데사용됩니다.

이명령어는 compound statement 내에서만사용가능하며먼저 DECLARE문에의에sqlstate-number에해당하는 exception-name을선언한후에사용해야합니다.

시스템이제공하지않는사용자가선언할수있는 SQLSTATE 번호는 99000 ~ 99999 입니다.

syntaxDECLARE exception-name EXCEPTION FOR SQLSTATE sqlstate-number;

SIGNAL exception-name;

예)BEGIN

DECLARE column_not_foundEXCEPTION FOR SQLSTATE '52003'; // 일단먼저선언

SIGNAL column_not_found; // 코드가아닌변수사용END

Page 84: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

traceback

compound statement 에서오류가발생했을때가장최근에발생한오류를출력합니다. 단, compound statement가아닌곳에서의오류와 syntax 오류는제외됩니다.

syntaxTRACEBACK(*)

예)BEGIN

.

.

.SELECT prod_name FROM employee;// column 'prod_name' not found 오류발생

.ENDSELECT traceback(*);

Page 85: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

SELECT statementINSERT statementUPDATE statementDELETE statement

GRANT statementREVOKE statement

CREATE TABLE | PROCEDURE | FUNCTION | INDEX statement

BEGIN TRANSACTION statementCOMMIT, ROLLBACK statementSAVEPOINT statementRELEASE SAVEPOINT statement

LOAD TABLE statement……..

위내용들은계속해서진행하는다른장에서언급하도록하겠습니다.

Page 86: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

Selecting data from a table

Page 87: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

overview

syntaxSELECT select-list // select 절[ FROM table-expression ] // from 절[ ON join-condition ] // on 절[ WHERE search-condition ] // where 절[ GROUP BY column-list ] // group by 절[ HAVING search-condition ] // having 절[ ORDER BY column-list ] // order by 절

SELECT 문에사용되어지는 SQL Keyword는대/소문자구별을하지않습니다. 하지만일반적으로대문자로많이표현하고있습니다.

SELECT문을형성하는 SELECT, FROM, WHERE 절과같은각절은라인을분리하여읽기편하게사용합니다.

테이블명, 컬럼명과같은 Identifier는대소문자구별을하지않지만테이블의데이터나문자열과같은데이터는데이터베이스생성시의옵션에의해구별여부가결정됩니다.

테이블과같은 Object를참조할때모호성을제거하기위해 owner 명과같은 qualifier를사용할수있습니다.

Page 88: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

select

select-list는일반적으로콤마로분리된액세스를원하는컬럼, 산술식, aggregate 함수, 혹은모든컬럼을지칭하는 *로구성되어집니다.

질의결과에따르는각컬럼의헤딩은 select-list에사용되어지는 expression을디폴트로사용하는데이런헤딩을변경하기위해다음과같은 alias를사용하기도합니다.SELECT column-name AS aliasSELECT column-name aliasSELECT alias = column-name

alias에 space 또는 keyword를사용하고자한다면 "로양쪽을감싸주어야합니다.SELECT dept_id AS "integer"FROM …

select-list에데이터가출력되는방식을변경하거나사칙연산과같은계산을수행할때산술표현식을사용할수있습니다.SELECT name, ( quantity * unit_price ) - 5FROM …

concatenation 연산자 || 를사용하여문자열들을또다른문자열로만들수있습니다.SELECT trim(fname) || ',' || lname "성명"FROM customer;

Page 89: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

select

select-list에사용하는리터럴은 alias나컬럼명이아닌 select 절에포함된문자, 표현식, 숫자이지만컬럼과같이취급됩니다. 날짜와문자리터럴은단일인용부호(' ')로에워싸며숫자리터럴은그냥숫자만표현하면됩니다

SELECT trim(first_name) || ',' || trim(last_name) || ' ' || title "직원"FROM contact

NULL이란 0이나 space와달리알려지지않은또는적용불가능한값을의미하며이러한NULL 값을표현한산술식의결과는 NULL 입니다. 그래서일반적으로 select-list에NULL 값대신에다른값으로대치하기위해서 COALESCE라는함수를사용할수있습니다.

SELECT fname || lname, salary * COALESCE(comm,0)/100FROM …

SELECT 결과로부터중복된행을제거하기위해선택적으로 DISTINCT keyword 를사용할수있으며 NULL 값은실제 SELECT 결과가몇건인지관계없이한건으로취급됩니다. 또한 DISTINCT라는 keyword는항상 SELECT 바로뒤에기술하며그뒤에여러개의컬럼을기술했다면나타나는데이터는컬럼의조합들이중복되지않게나타납니다.

SELECT DISTINCT cityFROM …

Page 90: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

first, top

질의의결과로부터첫번째혹은기술된수만큼의데이터만반환합니다. FIRST은한건의데이터만반환하며 TOP은 1~32767 까지의데이터만반환합니다.

주로 ORDER BY 절과함께사용되어야원하는데이터를얻을수있고만약에 ORDER BY절없이사용한다면매질의할때다른결과를산출할수있습니다.

이함수는질의의제일바깥쪽 SELECT문에서만사용가능하므로 derived table이나VIEW의생성에는사용할수없습니다.

FIRST는 ROW_COUNT라는옵션의값을 1로, TOP n 은 ROW_COUNT 옵션을 n으로설정하고질의한것과같습니다. 그리고 TOP n에서 n의범위는 1~32767이지만ROW_COUNT 에서는그런제약이없습니다.

syntaxSELECT [ FIRST | TOP number-of-rows ] select-list

비고set temporary option Row_Count=number-of-rows;SELECT select-list

Page 91: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

from

select 절의 select-list에컬럼의기술이전혀없고단지산술표현식만사용되었다면from 절이하는생략되거나 sys.dummy 테이블을사용할수있습니다.SELECT 24 * 60 * 60[FROM sys.dummy];

테이블, 뷰, derived table, stored procedure를통해데이터를 SELECT 할때반드시필요하며콤마를이용하여여러개를나열할수있습니다.SELECT …FROM employee | ( SELECT … … ) b

테이블이름이나뷰이름은모호성을제거하기위해 owner 명과같은 qualifier를사용할수있습니다.SELECT …FROM dba.employee

타이핑의수고를줄이기위해테이블명에다른 correlation name을테이블이름을대신하여사용할수있으며그렇게 correlation name이한번사용되어진후에그테이블을참조하는표현으로는반드시 correlation name이사용되어야합니다.SELECT d.dept_id, d.dept_name //d 대신에 department 사용불가FROM department d

Page 92: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

where

where절에는 SELECT 하는데이터를제한하기위한 search condition이포함될수있으며 qualification 혹은 predicate라고도불리며다음과같은여러조건이사용됩니다

Comparison operator : =, > , <, <=, >=, !=, !>, !<

SELECT emp_lnameFROM employee WHERE salary > 50000

Range operator : BETWEEN, NOT BETWEEN

SELECT emp_lnameFROM employee WHERE salary BETWEEN 40000 AND 50000

List operator : IN, NOT IN

SELECT company_name, stateFROM customer WHERE state IN ('ON', 'PQ', 'MB')

Page 93: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

where

Character match : LIKE, NOT LIKE

SELECT company_name, phoneFROM customer WHERE phone LIKE '415%'

Unknown value : IS NULL, IS NOT NULL

SELECT dept_nameFROM department WHERE dept_head_id is NOT NULL

Combination : AND, OR, NOT

SELECT emp_fname, emp_lnameFROM employee WHERE salary > 50000AND emp_fname like 'A%'

Page 94: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

Summarizing, Grouping, Sorting

Page 95: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

group by

테이블에있는데이터를작은그룹으로분류하여보고자할때사용하며일반적으로aggregate 함수와함께사용됩니다. select 절에나타난어떠한컬럼이나표현식도aggregate 함수가아닌경우에는 group by절에나타나야합니다.

group by 절없이 aggregate 함수가사용된다면전테이블을하나의그룹으로취급하고그에대한한건의결과만을산출합니다. 이때 select-list에는 aggregation 함수만기술될수있습니다.

aggregate 함수는 select 절과 having 절에서사용가능하고 NULL 값은 COUNT(*)를제외한모든연산에서제외되며다음과같은함수들이있습니다

AVG(numeric-expr)SUM(numeric-expr)COUNT(*)COUNT(column-name)MAX(expr), MIN(expr)VARIANCE (numeric-expr), STDDEV(numeric-expr)

예)SELECT line_id, prod_id, SUM(quantity)FROM sales_order_itemsWHERE ship_date >= '1994/01/01'GROUP BY line_id, prod_id

Page 96: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

rollup

ROLLUP은 GROUP BY절과함께사용하여뒤에나오는 (컬럼수 - 1) 개까지의그룹별소계와총계를산출합니다.

현재까지는 COUNT DISTINCT, SUM DISTINCT는지원하지않고있으며 sub-query에서는사용할수없습니다.

12.6부터는 GROUP BY ROLLUP에기술된모든컬럼은괄호로양쪽을감싸주지않으면문법오류가발생하므로업그레이드할때주의해야합니다.

syntaxSELECT [ GROUPING (column-name)…] …GROUP BY ROLLUP (expression [,…..])

예)SELECT a.year, b.description, sum(a.amount)FROM fin_data a, fin_code bWHERE a.code = b.codeGROUP BY ROLLUP (a.year, b.description)// 년도별(a.year) 소계와총계를구함

6

세탁기 냉장고 계

1997

1998

1999

2000

총계

16

26

36

5

15

25

35

11

31

51

71

164

Page 97: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

cube

CUBE는 GROUP BY절과함께사용하여 rollup 기능에큐브형태의그룹별소계와총계를산출합니다.

현재까지는 COUNT DISTINCT, SUM DISTINCT는지원하지않고있으며 sub-query에서는사용할수없습니다.

12.6부터는 GROUP BY ROLLUP에기술된모든컬럼은괄호로양쪽을감싸주지않으면문법오류가발생하므로업그레이드할때주의해야합니다.

syntaxSELECT [ GROUPING (column-name)…] …GROUP BY CUBE (expression [,…..])

예)SELECT a.year, b.description, sum(a.amount)FROM fin_data a, fin_code bWHERE a.code = b.codeGROUP BY CUBE (a.year, b.description)// 년도별, 제품별소계와총계를구함

6

세탁기 냉장고 계

1997

1998

1999

2000

총계

16

26

36

84

5

15

25

35

80

11

31

51

71

164

Page 98: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

having

where 절에서 SELECT 하기위한데이터를제한하듯이 GROUP BY 한결과를제한하고자할때사용합니다. 즉 aggregation 함수를사용하는제한은문법상 where절에기술할수없으므로그룹에대한제한은 where절이아닌 having절에기술합니다.

예)SELECT line_id, prod_id, SUM(quantity)FROM sales_order_itemsWHERE ship_date >= '1994/01/01'GROUP BY line_id, prod_idHAVING SUM(quantity) > 200

Page 99: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

order by

SELECT한결과를어떤특정컬럼에의해정렬해서보여주기위해사용하며오름차순과내림차순으로선택해서보여줄수있습니다

ASC를사용해서오름차순으로, DESC를사용해서내림차순으로정렬해서보여줄수있으며 ASC 혹은 DESC를생략하면디폴트로는 ASC 입니다

하나이상의컬럼으로질의결과를정렬할수있으며이때 order by절의컬럼은콤마로분리되어야하며컬럼대신별명이나 select 절에서기술된컬럼의위치순서를기술해도됩니다.

일반적으로다른 RDBMS에서는 GROUP BY의결과로 group by절에기술된컬럼순으로자동으로정렬해주기때문에다른컬럼순으로정렬하고자했을때를제외하고는order by절을생략하지만 SYBASE IQ에서는 order by 절을사용하지않으면어떠한종류의질의도결코정렬해서볼수가없습니다.

예)SELECT id, name, quantityFROM productWHERE name LIKE '%shirt%'ORDER BY name, quantity DESC; // 또는 ORDER BY 2, 3 DESC

Page 100: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

전체그룹에대한순위를내주는순위형함수에는 DENSE_RANK, PERCENT_RANK, RANK가있으며순위에대한기준이되는 OVER ( ORDER BY ) 절을필요로합니다.

같은순위를어떻게처리하는지여부에따라 DENSE_RANK와 RANK는다릅니다. 즉RANK 함수는같은순위가존재하면존재하는수만큼의공백순위가존재하나DENSE_RANK는공백순위를인정하지않습니다.

PERCENT_RANK 함수는순위백분율을계산해주며 NTILE 함수는분위수를계산해줍니다. 또한비슷한방법의 PERCENT_CONT, PERCENT_DISC가있습니다.

위함수들은 sub-query에서사용할수없으며그룹별로별도의순위를만들어주는옵션인 PARTITION BY 가현재까지는제공되지않습니다.

syntaxSELECT DENSE_RANK | PERCENT_RANK | RANK

OVER ( ORDER BY expr [ ASC | DESC ] )

SELECT NTILE (expr1) OVER ( ORDER BY expr2 [ ASC | DESC ] )

SELECT PERCENT_CONT | PERCENT_DISC (expr1) WITHIN GROUP ( ORDER BY expr2 [ ASC | DESC ] )

Page 101: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

참고 : PARTITION BY 기능구현하기

SELECT district, grade, AVG(math_score),rank() over (partition by district order by avg(math_score) desc) as rank_d

FROM math_reportGROUP BY district, gradeORDER BY district;

SELECT district, grade, avg(math_score),rank() over (order by avg(math_score) desc) as rank_d

FROM math_report WHERE district = 'essex'GROUP BY district, gradeUNION ALLSELECT district, grade, avg(math_score),

rank() over (order by avg(math_score) desc) as rank_dFROM math_report WHERE district = 'middlesex'GROUP BY district, gradeUNION ALLSELECT district, grade, avg(math_score),

rank() over (order by avg(math_score) desc) as rank_dFROM math_report WHERE district = 'suffolk'GROUP BY district, gradeORDER BY 1,2;

Page 102: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

Retrieving data from several tables

Page 103: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

overview

syntaxSELECT select-list // select 절[ FROM table-expression ] // from 절[ ON join-condition ] // on 절[ WHERE search-condition ] // where 절[ GROUP BY column-list ] // group by 절[ HAVING search-condition ] // having 절[ ORDER BY column-list ] // order by 절

FROM table-name [ KEY | NATURAL [ INNER | FULL [ OUTER ] |LEFT [ OUTER ] | RIGHT [ OUTER ] JOIN | CROSS JOIN table-name

ON join-condition

Page 104: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

join

조인은관계를맺고있는두개이상의테이블을하나의 select statement에포함하여원하는정보를산출하는 SQL 이며일반적으로 PK와 FK를사용하여조인하는경우가대부분이지만때로는논리적인값들의연관으로조인하는경우도있습니다.

일반적으로 where절에조인조건을기술하여사용하지만WatcomSQL과 ANSI에서는from절에조인의방법을 on절에조인의조건을기술하여사용합니다.

일반적으로조인할때똑같은컬럼이름이존재하거나문장의명확성을위해컬럼이름앞에테이블이름이나혹은 correlation name을붙여서사용합니다.

일반적으로 N개의테이블을조인하려면 N-1개의조인조건이필요합니다.

참고조인에해당되는컬럼은데이터타입및길이가같아야최대성능을발휘합니다. 특히SYBASE IQ에서는조인에해당되는컬럼의데이터타입을 int계열특히 unsigned int계열로만들어사용하시면최대성능을발휘합니다.

예를들어 VARCHAR(4) 와 CHAR(4)를조인하면묵시적으로데이터형변환이발생한후에조인작업을진행합니다. 이런경우데이터형변환하는시간만큼성능이떨어집니다.

Page 105: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

equijoin vs. non-equijoin

equijoin은조인조건에서 =을사용하여값들이정확하게일치하는경우에사용하는조인을말하며대부분 PK와 FK의관계를이용하여조인합니다. equijoin은다른말로 inner-join 이라고도합니다.

예)SELECT *FROM sales_order a JOIN customer b ON a.cust_id = b.id

JOIN sales_order_items c ON a.id = c.id

조인조건에서연산자로 =이아닌 BETWEEN ~ AND 등과같은연산자가사용되어진다면이를 non-equijoin 이라고합니다.

예)SELECT e.emp_id, e.emp_lname, e,salary, s.low_salary, s.high_salaryFROM salary_grade s JOIN employee eON e.salary BETWEEN s.low_salary AND s.high_salary;

Page 106: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

inner-join vs. outer-join

equijoin은조인조건에서 =을사용하여값들이정확하게일치하는경우에사용하는조인을말하며대부분 PK와 FK의관계를이용하여조인합니다. equijoin은다른말로 inner-join 이라고도합니다.

예)SELECT *FROM sales_order a JOIN customer b ON a.cust_id = b.id

JOIN sales_order_items c ON a.id = c.id

일반적인 inner join에서는테이블들사이에조인조건을만족하는데이터만을결과로산출하는데반해비록조인조건을만족하지않는데이터라도전부출력하고자할경우에사용되는조인을 outer join이라고말하며전부출력하고자하는테이블을 outer, 그반대쪽을 inner라고합니다. 전부출력되는테이블의위치에따라 LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN이있습니다.

예)SELECT lname, order_date, cityFROM customer LEFT OUTER JOIN sales_orderON customer.id = sales_order.cust_idWHERE customer.state = 'NY';

Page 107: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

key join

테이블들간의조인은미리정의되어진 PK, FK에의해조인조건이자동으로생성되므로ON절이생략됩니다. 반드시사전에조인되어지는테이블에 PK, FK를선언해야합니다

예)SELECT a.fname, a.lname, b.order_date, b.regionFROM customer a KEY JOIN sales_order bWHERE a.city = 'New York'AND b.sales_rep = 902

SELECT a.fname, a.lname, b.order_date, b.regionFROM customer a, sales_order bWHERE a.id = b.cust_idAND a.city = 'New York'AND b.sales_rep = 902

Page 108: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

natural join

테이블간의이름이같은컬럼으로조인조건이자동으로생성되므로 ON절이생략됩니다. 테이블간의이름이같은컬럼이최소하나이상이존재해야하며만약일치하는이름이없다면오류가발생합니다.

예)SELECT b.emp_fname, b.emp_lname, a.dept_name, b.salaryFROM department a NATURAL JOIN employee bWHERE b.state = 'MA'AND a.dept_id = 200

SELECT b.emp_fname, b.emp_lname, a.dept_name, b.salaryFROM department a , employee bWHERE a.dept_id = b.dept_idAND b.state = 'MA'AND a.dept_id = 200

Page 109: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

general join

가장일반적으로사용되어지는형태로조인관련된컬럼정보를 on절에직접기술합니다

예)SELECT a.fname, a.lname, b.order_date, b.regionFROM customer a JOIN sales_order bON a.id = b.cust_idWHERE a.city = 'New York'AND b.sales_rep = 902

SELECT a.fname, a.lname, b.order_date, b.regionFROM customer a, sales_order bWHERE a.id = b.cust_idAND a.city = 'New York'AND b.sales_rep = 902

Page 110: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

cross join(cartesian product)

가능한모든경우를조합하여대단히많은결과를산출하며테이블들사이의조인절이기술되지않을때발생합니다.

조인조건을생략한경우나조인조건이잘못된경우에발생되며첫번째테이블의모든행이두번째테이블의모든행과조인이됩니다

대부분의경우그결과가거의유용하지못하므로 Max_Cartesian_Result 라는옵션을통해통제할수있습니다.

예)SELECT a.fname, a.lname, b.order_date, b.regionFROM customer a CROSS JOIN sales_order b

SELECT a.fname, a.lname, b.order_date, b.regionFROM customer a , sales_order b

Page 111: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

self join

같은테이블을조인에이용하는방법으로반드시 correlation name을사용해야합니다.

예)SELECT a.id, a.fname, a.lname, a.addressFROM customer a JOIN customer bON a.fname = b.fnameWHERE a.id != b.id// 동명이인을찾는 self join

Page 112: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

outer join

일반적인 inner join에서는테이블들사이에조인조건을만족하는데이터만을결과로산출하는데반해조인조건을만족하지않는데이터라도전부출력하고자할경우에사용되는조인을 outer join이라고말하며전부출력하고자하는테이블을 outer, 그반대쪽을inner라고합니다.

주의할점은 inner 테이블에대한제약조건이있다면이조건은반드시 where절이아닌on절에기술해야합니다. 만약 where 절에이제약조건을기술하면 OUTER JOIN이아닌 INNER JOIN으로결과를산출할것입니다.이는 ANSI 규약이며 outer 테이블에대한제약조건은어디에기술해도됩니다.

예)SELECT a.fname, a.lname, b.order_date, b.regionFROM customer a left outer join sales_order bON a.id = b.cust_idAND b.sales_rep = 902 // 만약이조건을 where절에사용한다면?WHERE a.city = 'New York' // outer join이아닌 inner join 결과산출

SELECT a.fname, a.lname, b.order_date, b.regionFROM customer a , sales_order bWHERE a.id *= b.cust_idAND a.city = 'New York'AND b.sales_rep = 902

Page 113: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

derived table join

from절에서뷰형태의임시테이블을생성한후다른테이블과조인을하는형태로편집성능을향상시킬수있는방법을제공합니다.

Oracle에서는 In-line-view 라고도하며대체할수있는다른방법으로는임시테이블을만들어서사용할수있습니다.

예)SELECT a.fname, a.lname, b.order_date, b.regionFROM customer a , (SELECT cust_id, order_date, region

FROM sales_orderWHERE sales_rep = 902) b

WHERE a.id = b.cust_idAND a.city = 'New York'

참고derived table의결과로많은수의데이터가산출된다면이를임시테이블형태로바꾸고인덱스를생성하여사용한다면조인에대한성능이향상될것입니다. 이렇게임시테이블을사용하여편집할때불편한점이조금은있을지모르지만성능상에는많은이점이있습니다.

Page 114: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

sub-query

sub-query는여러절에서사용가능하며 SELECT 문장안에기술된 SELECT 문장입니다. sub-query는 main query이전에한번만수행되며 sub-query의결과를 main query에의해조건으로사용됩니다.

sub-query는괄호로양쪽을묶어야하고연산자의오른쪽에나타나야하며 order by 절을포함할수없습니다. 또한 select-list에단지하나의컬러만을사용할수있습니다.

sub-query의결과가한건의데이터를산출한다면단일행연산자를사용해야하며 2건이상의데이터를산출한다면다중행연산자를사용해야합니다.단일행연산자 : =, >, <, >=, <=, !=다중행연산자 : IN, EXISTS

sub-query는 where절뿐만아니라 having절, from절에서도가능하지만특히 from절에서사용하는 sub-query는 derived-table이라고부릅니다.

syntaxSELECT select-listFROM table-expressionWHERE expression operator ( SELECT select-list

FROM table-expressionWHERE search-condition )

Page 115: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

sub-query

예) where절SELECT * FROM fin_data WHERE fin_data.code IN ( SELECT fin_code.code

FROM fin_code WHERE type = 'revenue' ) ;

예) select절SELECT sales_order.id, sales_order.order_date,

( SELECT company_name FROM customerWHERE customer.id = sales_order.cust_id) as comp_name// 컬럼을대신하는 sub-query는 12.6부터지원

FROM sales_orderWHERE order_date > '1994/01/01'ORDER BY order_date;

Page 116: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

union

연산자양쪽의질의에대한결과를하나의결과로합하여보여주는연산자로중복데이터를포함하여보여줄때는 ALL 이라는 Keyword가추가적으로덧붙여집니다.

연산자양쪽에서각각의결과를산출하는컬럼의수및데이터타입이기본적으로같아야합니다. 데이터타입이같지않은경우는묵시적으로변환작업이발생할수있습니다.

연산자양쪽의질의결과를논리적으로따져볼때중복데이터가존재하지않는다면실제연산할때중복데이터제거과정을생략하므로 UNION ALL이성능에아주좋습니다.

UNION 질의결과를정렬해서보고싶다면 UNION 연산자의가장아래쪽질의에 order by절을추가기술하면됩니다. 단, 컬럼이름이아니고컬럼의위치순서를기술해야합니다.

예) SELECT fname, lname, city, phoneFROM a_customerUNION [ALL]SELECT fname, lname, city, phoneFROM b_customerORDER BY 1, 2;// union의결과를첫번째, 두번째컬럼으로정렬

Page 117: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

minus, intersect

MINUS에대한연산자는직접제공되지않기때문에사용자가다음의보기처럼질의를직접기술해야합니다.

예) SELECT emp_id, emp_fname, emp_lnameFROM ( SELECT a.emp_id, a.emp_fname, a.emp_lname, b.sales_rep as bemp_id

FROM employee a LEFT OUTER JOIN sales_order bON a.emp_id = b.sales_rep ) tmp

WHERE bemp_id IS NULL;// employee - sales_order

INTERSECT에대한연산자도역시직접제공되지않기때문에사용자가다음의보기처럼질의를직접기술해야합니다.

예) SELECT a.emp_id, a.emp_fname, a.emp_lnameFROM employee a JOIN sales_order bON a.emp_id = b.sales_rep;

Page 118: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

sp_iqcolumn

syntaxsp_iqcolumn table-name;

Page 119: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

Adding, Changing, and Deleting data

Page 120: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

insert

아래처럼지원되는 syntax는 3 종류가있으며한테이블에 INSERT가진행되고있을때어떤사용자도그테이블에대해 INSERT/UPDATE/DELETE 할수있는권한은없습니다. 다만쓰기작업이전버전의데이터를 SELECT 할수는있습니다.

syntax1INSERT [INTO] [owner.]table-name [(column-name[,…])]

VALUES (expression …)

syntax2INSERT [INTO] [owner.]table-name [(column-name[,…])]

insert-load-optionselect-statement

syntax3INSERT [INTO] [owner.]table-name [(column-name[,…])]

insert-load-option [LOCATION 'server-name.db-name']

{select-statement}

Page 121: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

insert-manually insert

주어진값을가지고특정한테이블에한건한건데이터를입력하며주로 OLTP의운영환경에서많이사용하는방법입니다.

SYBASE IQ 영역에존재하는테이블에이런식의 INSERT는입력되는속도도느릴뿐만아니라서버에주는부담도매우높습니다. 가능하면이런 INSERT는자제해주십시오.

만약어쩔수없이사용할때에도컬럼과값에대한매핑을명시적으로하십시오

예)INSERT INTO department (dept_id, dept_name)

VALUES (230, 'Eastern Sales');

Page 122: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

insert-inserting from IQ main store

아래그림에서보듯이 SELECT하는테이블도 SYBASE IQ의main store에존재하고INSERT 하는테이블도 SYBASE IQ main store에존재합니다.

ETL 과정중에많이발생되는형태의입력방법이며다중쓰레드로동작되는 LOAD와달리입력되는동안에는한개의쓰레드가맡아서처리합니다.

시간이많이소요되고매우중요한트랜잭션이라면경우에따라 SAM 파일로추출한후에그파일을다시적재하는것도고려해보십시오.

예)INSERT INTO dept_head ( name, dept )SELECT emp_lname || ' ' || emp_fname as name,

dept_nameFROM employee JOIN departmentON emp_id = dept_head_id;

Page 123: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

insert-inserting directly from a foreign db

아래그림에서보듯이현재접속하고있는 SYBASE IQ가아닌다른 DB의테이블을읽어서현재접속하고있는 SYBASE IQ의테이블에입력할때사용합니다.

이렇게사용가능한 DB로는또다른 SYBASE IQ, ASE, Oracle, Informix 등이있습니다. 단 SYBASE 제품이아닌 Oracle, Informix등은중간에 SYBASE의 Gateway 제품이있어야가능합니다.

입력이되는 SYBASE IQ쪽에 OCDK가설치되어있어야하며그쪽 interfaces file에SELECT 가수행되는다른 DB에대한목록이등록되어있어야합니다.

예)INSERT INTO product

( id, name, description, size, color, quantity, unit_price)

LOCATION 'prod.asedb'{ SELECT id, name, description, size,

color, quantity, unit_priceFROM product } ;

참고로컬서버에리모트테이블을위한프록시테이블을만들어사용할수도있습니다.

?

Page 124: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

insert-partial width insert

한테이블에데이터를입력해서사용하다가업무의요구에따라특정한컬럼을첨가했을때다른 RDBMS 처럼데이터의재적재없이이첨가된컬럼에데이터를입력할수있는방법을 SYBASE IQ는제공합니다. SYBASE IQ는컬럼단위로데이터를저장하기때문에컬럼단위의처리에매우강한특성이있습니다.

예)INSERT INTO lineitem ( colC, colD )START ROW ID 1LOCATION 'prod.asedb'{ SELECT colC, colD FROM lineitem } ;

colA colB colC colD colA colB colC colD colA colB colC colD

Page 125: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

update

12.4이하의버전에서는 UPDATE에대한제약사항이있었지만 지금은모두제거되었을뿐만아니라다른테이블과조인을이용하여수정할수있는확장기능도제공하며 12.6부터는 set절에서 sub-query를사용할수있는기능도제공하고있습니다.

SYBASE IQ는컬럼별로데이터를저장하기때문에특정몇개의컬럼만을수정하는것은다른 RDBMS에비해월등히빠른성능을보장합니다.

syntaxUPDATE [owner.]table-name

SET [column-name = expression, …[ FROM table-expression, ][ WHERE search-condition [, join-condition ]] ……

예)UPDATE employeeSET dept_id = 400WHERE emp_id = 129;

UPDATE employeeSET emp.salary = emp.salary + dept.dept_head_idFROM employee emp, department deptWHERE WHERE emp.dept_idemp.dept_id = dept= dept.dept_id;.dept_id;

Page 126: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

delete

특정테이블에조건을주어데이터를삭제할수있을뿐만아니라다른테이블과조인을하여삭제할수있는확장기능도제공합니다.

조건없이전테이블을삭제할때는 TRUNCATE TABLE 명령어를사용하는편이로그를적게사용합니다.

syntaxDELETE [ FROM ] [owner.]table-name[ FROM table-list ][ WHERE search-condition ]

예)DELETE employeeWHERE emp_id = 105;

DELETE contactFROM contact, customerWHERE contact.last_name = WHERE contact.last_name = customer.lnamecustomer.lnameAND contact.first_name = AND contact.first_name = customer.fnamecustomer.fname;

TRUNCATE TABLE employee;

Page 127: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

DML message

INSERT, LOAD, UPDATE와같은 DML이발생하면기본적인환경에서 iqmsg파일에DML의시작, 대상테이블, 매 100,000건마다경과시간, Pass 구분, 총소요시간, 건수등을출력합니다.

12.5부터 DDL_Options2의옵션을 1 혹은 3으로변경하면 INSERT, LOAD, UPDATE할때 iqmsg파일에기본적인정보에메모리의상태등과같은좀더자세한정보를덧붙여출력합니다.

DELETE가발생하면 iqmsg파일에 DELETE의시작알림, 대상테이블, 총삭제건수, 총삭제시간 등을출력합니다.

12.5부터 DDL_Options2의옵션을 2 혹은 3으로변경하면 DELETE할때 iqmsg파일에기본적인정보에메모리의상태등과같은좀더자세한정보를덧붙여출력합니다.

참고로 DDL_Options2의기본값은 0이며기본적인정보만 iqmsg파일에출력합니다.

Page 128: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

Using procedure

Page 129: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

procedure

절차적인 SQL 언어에의해작성되어데이터베이스내에저장되며모든클라이언트의응용프로그램에서사용가능합니다.

반복문과조건문등제어문을포함할수있으며 CALL문에의해호출되고파라미터를주고받을수있습니다

프로시져를호출하는쪽에 SELECT의결과등여러가지정보를줄수있으며또다른프로시져를실행할수도있습니다.

처음호출될때메모리에상주하여반복적으로사용할때메모리에서바로실행됩니다.

종류

User-Defined Stored Procedure System-Defined Stored Procedure

장점

반복적인일을단순화/표준화시킬수있습니다네트워크트래픽을감소시킬수있습니다유지보수가간편합니다……

Page 130: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

creating stored procedure

resource 권한을가진사용자가 CREATE PROCEDURE 라는명령어를사용해서생성할수있습니다

12.6부터는 PROCEDURE에대한 DDL을시스템카다로그에저장할때스크립트에서사용된들여쓰기와같은원본그대로의내용을저장합니다.

프로시져의몸체는 BEGIN과 END로이루어진 compound statement 이며각문장은세미콜론(;)으로끝내야합니다.

생성하는프로시져의파라미터가존재하지않는다고하더라고 ( )는문법상반드시필요합니다.

syntaxCREATE PROCEDURE [owner.]procedure_name ( [parameter][,……] )[ RESULT (result-column,…) ]BEGIN

// Business Logic

END;

Compound statement

Page 131: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

declaring parameter

호출하는프로그램과호출되는프로시져사이에정보를주고받는방법이정의되어있으며호출하는쪽에서호출되는쪽으로정보를줄수있는방법은파라미터를통해서입니다.

또한호출하는쪽에서도받을수있는방법이있는데그중에하나가역시파라미터를통해서이며이런파라미터는 CREATE PROCEDURE문의괄호안에선언하며콤마로분리됩니다

테이블의컬럼처럼적절한데이터타입을가지고있고선언과동시에 DEFAULT 선언도가능하며이런파라미터이름앞에는다음과같은 3종류의 Keyword가사용됩니다.

IN : 호출하는쪽에서프로시져에게전달하는파라미터OUT : 프로시져에서호출하는쪽으로전달하는파라미터INOUT : IN 역할과 OUT 역할을동시에수행하는파라미터

syntaxCREATE PROCEDURE procedure-name

( IN | OUT | INOUT parameter-name data-type [ DEFAULT expression ],……)

예)CREATE PROCEDURE sp_product_info ( INOUT prod_id INT )BEGIN…………..

Page 132: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

checking parameter

NULL과상수등으로파라미터의디폴트값을지정하여프로시져를호출하는쪽에파라미터를넘기지않았을때처리를가능하게할수있습니다. 이런식의파라미터점검은논리오류를미연에방지할수있습니다.

예)CREATE PROCEDURE CustomerProducts_proc

( IN v_product_id INT DEFAULT NULL )BEGIN

IF v_product_id IS NULL THEN // 만약파라미터를받지못했다면RETURN -99000;

ELSESELECT a.id, SUM(b.quantity)FROM product a, sales_order_items b, sales_order cWHERE b.prod_id = v_ product _idAND c.id = b.idAND b.prod_id = a.idGROUP BY a.id;

END IF;END;

Page 133: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

calling stored procedure

프로시져는응용프로그램에서혹은다른프로시져에서 CALL 문에의해불려질수있습니다. 호출하는사용자는그프로시져에대해실행권한을가져야합니다.

프로시져의실행이끝났을때 OUT, INOUT으로선언된파라미터값이호출하는프로그램이나프로시져로되돌려집니다. 또한프로시져의실행결과상태값을받아참조할수있습니다.

syntax[variable=] CALL procedure_name ( [parameter][,……] );

예1)CALL sp_customer_list ();

예2)CREATE VARIABLE v_returnval INT;v_returnval = CALL sp_sales_order_items ( ord_id = 100, …… );SELECT v_returnval;

Page 134: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

passing parameter

creator CREATE PROCEDURE sp_sales_order ( IN customer_id INT,

IN product_id INT )BEGIN

……………………………END;

caller 위치에의한방법CREATE VARIABLE v_customer_id INT;CREATE VARIABLE v_product_id INT;

SET v_customer_id = 110; SET v_product_id = 400;

CALL sp_sales_order ( v_customer_id, v_product_id );

Page 135: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

passing parameter

이름에의한방법

CREATE VARIABLE v_customer_id INT;CREATE VARIABLE v_product_id INT;

SET v_customer_id = 110; SET v_product_id = 400;

CALL sp_sales_order ( customer_id = v_customer_id, product_id = v_product_id );

Page 136: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

returning results : case1

호출하는프로그램에서프로시져를호출할때 OUT 혹은 INOUT으로선언되어진파라미터를통해개별적으로값을받아볼수있습니다.

예)creatorCREATE PROCEDURE AverageSalary_proc ( OUT v_avgsal NUMERIC (20,3) )BEGIN

SELECT AVG(salary) INTO v_avgsalFROM employee;

END;

callerCREATE VARIABLE v_average NUMERIC(20,3);CALL AverageSalary_proc(v_average);SELECT v_average;

Page 137: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

returning results : case2

호출하는프로그램에서프로시져의 SELECT 한결과를받아볼수있습니다

예)creatorCREATE PROCEDURE SalaryList_proc ( IN v_dept_id INT )BEGIN

SELECT emp_id, salaryFROM employeeWHERE dept_id = v_dept_id;

END

callerCALL SalaryList_proc(100);

참고Interactive SQL사용시해당되는프로시져의종료후에 RESUME과같은커서를닫을수있는명령어를실행해야만해당되는프로시져가 DROP 되거나 ALTER 될수있습니다. 그프로시져에서 SELECT 대상이되는테이블도마찬가지경우입니다

Page 138: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

returning results : case3

호출하는프로그램에서프로시져의 RETURN문과함께사용된숫자상태값을결과로받아볼수있습니다.

syntaxRETURN [(expr)]

예)creatorCREATE PROCEDURE SalaryList_proc ( IN v_dept_id INT DEFAULT NULL)BEGIN

IF v_dept_id IS NULL THENRETURN -99000;

ELSESELECT emp_id, salaryFROM employeeWHERE dept_id = v_dept_id;

END IF;END

callerCREATE VARIABLE ret_value INT;ret_value = CALL SalaryList_proc(100);SELECT ret_value;

Page 139: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

result option

Embedded SQL이나 ODBC와같은프로그램에 RESULT 옵션을사용하여 SELECT 결과의컬럼이름과데이터타입을알려줄수있습니다.

예)creatorCREATE PROCEDURE SalaryList_proc ( IN v_dept_id INT DEFAULT NULL)RESULT ( "Employee ID" INT, Salary NUMERIC(20,3))BEGIN

IF v_dept_id IS NULL THENreturn -99000;

ELSESELECT emp_id, salaryFROM employeeWHERE dept_id = v_dept_id;

END IF;END

Page 140: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

Using in select statement

12.6 부터 SELECT 문의 FROM절에서 stored procedure를사용할수있게되어개발자들에게많은확장성과용이성을제공하고있습니다.

FROM절에서사용하는 stored procedure의모든파라미터는 in 형태로선언되어야하며 result절을사용했을경우 select-list에기술된컬럼과잘일치되어야합니다. 즉사용된 stored-procedure의결과는테이블형태의데이터를산출해야합니다.

FROM절에기술되는 stored-procedure의이름은 ASA 형태를따라야합니다. 즉존재하는파라미터가없더라도반드시괄호로양쪽을감싸주어야합니다.

syntaxSELECT select-listFROM stored-procedureWHERE search-condition……

예)SELECT column_name, domain_name, width, scale, nullsFROM sp_iqcolumn('contact') // 괄호에주의

Page 141: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

alter stored procedure

DROP후에 CREATE 하는경우에이를대신해서 ALTER PROCEDURE를사용할수있으며이렇게 ALTER를사용하면 stored procedure에대한권한을재설정할필요가없습니다.

PROCEDURE에대한 DDL을다른사용자가볼수없게암호화해서저장할수도있는데이때암호화된소스는복호화가되지않기때문에주의해서사용해야합니다.

syntax1ALTER PROCEDURE [owner.]procedure_name ( [parameter][,……] )[ RESULT (result-column,…) ]BEGIN

// Business LogicEND;

syntax2ALTER PROCEDURE [owner.]procedure-name SET HIDDEN

Page 142: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

dropping stored procedure

프로시져의생성자나혹은 dba권한을가진사용자가 DROP PROCEDURE 라는명령어를사용해서제거할수있습니다.

다른사용자가현재사용중인프로시져는삭제될수없지만실행이종료된후에커서가열려있는상태로된프로시져도역시삭제될수없습니다.

syntaxDROP PROCEDURE [owner.]procedure_name;

예1)DROP PROCEDURE customer_list_proc;

예2)IF EXISTS ( SELECT 1 FROM sysprocedure WHERE proc_name = 'proc_name' )THEN

DROP PROCEDURE procedure_name;END IF;

CREATE PROCEDURE ……

Page 143: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

creating function

resource 권한을가진사용자가 CREATE FUNCTION 이라는명령어를사용해서생성할수있습니다

12.6부터는 FUNCTION에대한 DDL을시스템카다로그에저장할때스크립트에서사용된들여쓰기와같은원본그대로의내용을저장합니다.

함수의몸체는 BEGIN과 END로이루어진 compound statement 이며모든 파라미터는IN 이기때문에 IN, OUT, INOUT 과같은 keyword가필요없습니다

return되는데이터타입을표현하기위한 RETURNS절이꼭필요하며하나의값을되돌려주기위한 RETURN문도반드시필요합니다

SyntaxCREATE FUNCTION [owner.]function_name ( [parameter][,……] )RETURNS data_typeBEGIN

// Business LogicRETURN (return_value);

END;

Compound statement

Page 144: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

calling function

시스템이제공하는 non-aggregation 함수가사용되는곳이면어디나사용가능합니다

호출하는사용자는그함수에대해실행권한을가져야합니다

syntaxSELECT function_name ( [parameter][,……] ), ……FROM table_name;

예)SELECT fullname ( emp_fname, emp_lname)FROM employee;

SELECT fullname ( 'John', 'Smith' );

Page 145: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

returning function result

RETURN문을사용하여하나의값을되돌릴수있습니다

예)creatorCREATE FUNCTION fullname ( v_fname CHAR(30), v_lname CHAR(30) )RETURNS CHAR(61)BEGIN

DECLARE name CHAR(61);SET name = trim(v_fname) || ', ' || v_lname;RETURN ( name );

END;

callerSELECT fullname (emp_fname, emp_lname)FROM employee;

참고INSERT … SELECT문에서사용자함수를사용하면내부적으로 INSERT~VALUES 문장이실행되어데이터가 1건씩입력됩니다. 그래서 SYBASE IQ 성능에지대한영향을미치며 EXTRACT 할때는사용이불가능합니다.

Page 146: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

alter function

DROP후에 CREATE 하는경우에이를대신해서 ALTER FUNCTION을사용할수있으며이렇게 ALTER를사용하면 function에대한권한을재설정할필요가없습니다.

FUNCTION에대한 DDL을다른사용자가볼수없게암호화해서저장할수도있는데이때암호화된소스는복호화가되지않기때문에주의해서사용해야합니다.

syntax1ALTER PROCEDURE [owner.]function_name ( [parameter][,……] )RETURNS data-typeBEGIN

// Business LogicRETURN (return-value);

END;

syntax2ALTER FUNCTION [owner.]function-name SET HIDDEN

Page 147: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

dropping function

함수의생성자나혹은 dba권한을가진사용자가 DROP FUNCTION 이라는명령어를사용해서제거할수있습니다

syntaxDROP FUNCTION [owner.]function_name;

예1)DROP FUNCTION customer_list_proc;

예2)IF EXISTS ( SELECT 1 FROM sysprocedure WHERE proc_name = 'func_name' )THEN

DROP FUNCTION function_name;END IF;

CREATE FUNCTION ……

Page 148: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

permission

dba나혹은 resource 권한을가진사용자만이프로시져나함수를생성할수있습니다

GRANT resource TO user_name;

호출하는사용자는그프로시져나함수에대해실행권한을가져야합니다

GRANT execute ON procedure_name TO user_name;

프로시져나함수의생성자혹은 dba권한을가진사용자가프로시져나함수를제거할수있습니다

Page 149: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

-

사용자정의함수를사용하는질의는 IQ 영역의데이터를 ASA 영역으로옮겨처리하므로이에따르는부담이발생합니다. 그러므로실행속도가중요한질의는이런사용자정의함수를피해주십시오.

12.6 부터특정한파라미터에항상똑같은결과를산출하는함수가사용되어질때이런파라미터와그에대응하는결과는메모리에저장되어하나의질의에서자주사용되는함수에대한처리속도를향상시킵니다.예외 : RAND와같이항상다른결과를산출하는함수

Page 150: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

sp_helptext

syntaxsp_helptext procedure-name;

Page 151: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

tip

stored procedure 내에서사용되어지는임시테이블의이름은해당 stored procedure의이름과연관성있게명명해야디버깅이편리합니다.

stored procedure에서사용되는파라미터와변수는해당되는컬럼의데이터타입과동일하게선언하여주십시오.

stored procedure에서사용하는변수는 v_와같은접두어를사용하여누가언제보아도알수있도록해주어야읽기에편리합니다.

stored procedure는만들어지는시점에기본적인오류점검만하고대부분의오류는실행할때에점검되어지기때문에반드시생성후에실행해보십시오.

T-SQL과혼용하지말고 SYBASE IQ의기본 SQL인WatcomSQL을사용하여프로그램하십시오.

데이터베이스복구불능과같은만약의사태에대비하여항상최신버전의 script를따로보관하며때에따라서는이런 script의 version 관리도직접하십시오.

Page 152: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

System function

Page 153: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

ASCII(string_expr) : string_expr첫번째문자의아스키값을출력합니다SELECT ASCII('A') 65

CHAR(integer_expr) : integer_expr을 character로변환합니다SELECT CHAR(65) A

INSERTSTR(integer_expr, string_expr1, string_expr2) : string2_expr2를string_expr1의 integer_expr번째에끼워넣습니다SELECT INSERTSTR(3,'ABCFG','DE') ABCDEFG

LCASE(string_expr) : string_expr를소문자로변환합니다(lower와동일)SELECT LCASE('JOHN SMITH') john smith

LEFT(string_expr, integer_expr) : string_expr의왼쪽부터 integer_expr자리만큼선택합니다SELECT LEFT('JOHN SMITH',3) JOH

LENGTH(string_expr) : string_expr의 character의길이를나타냅니다SELECT LENGTH('JOHN SMITH') 10

Page 154: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

LOCATE(string_expr1, string_expr2) : string_expr2가 string_expr1의몇번째위치하는가를표시합니다SELECT LOCATE('JOHN SMITH', 'SMITH') 6

LTRIM(string_expr) : string_expr의왼쪽 blank를제거합니다SELECT LTRIM(' SMITH') SMITH

REPLACE(string_expr1, string_expr2, string_expr3) : string_expr1에서 string_expr2를찾아 string_expr3으로변환합니다.SELECT REPLACE('abcdefghijk', 'abc', 'ABC') ABCdefghijk

RIGHT(string_expr, integer_expr) : string_expr의오른쪽부터 integer_expr자리만큼선택합니다SELECT RIGHT('JOHN SMITH',3) 'ITH'

RTRIM(string_expr) : string_expr의오른쪽 blank를제거합니다SELECT RTRIM('SMITH ') SMITH

SIMILAR(string_expr1, string_expr2) : string_expr1과 string_expr2의유사성이몇 % 인가를표현합니다SELECT SIMILAR('JOHN', 'JON') 85

Page 155: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

STRING(string1, [string2,……..string99]) : 나열된 string을연결합니다. ( || 가능)SELECT STRING('JOHN ', 'SMITH') JOHN SMITH

STUFF(string_expr1, start, length, string_expr2) : string_expr1의 start 부터 length 만큼버리고그자리에 string_expr2를채웁니다SELECT STUFF('JOHN SMITH', 6, 5, 'PHILLIPS') JOHN PHILLIPS

SUBSTR(string_expr, start, length) : string_expr에서 start 번째부터 length 만큼잘라서가져옵니다SELECT SUBSTR('JOHN SMITH', 6, 5) SMITH

TRIM(string_expr) : string_expr의처음과끝의 blank를제외시킵니다.SELECT TRIM(' JOHN SMITH ') JOHN SMITH

UCASE(string_expr) : string_expr를대문자로변환합니다(UPPER와동일)SELECT UCASE('John Smith') JOHN SMITH

그외의문자함수에대해서는매뉴얼을참조하시기바랍니다.

Page 156: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

ABS(numeric_expr) : 절대값을반환합니다SELECT ABS(-5206) 5206

CEILING(numeric_expr) : 소수점이하에서무조건올림합니다.SELECT CEILING(3451.5206) 3452

FLOOR(numeric_expr) : 소수점이하에서무조건내림합니다.SELECT CEILING(3451.5206) 3451

MOD(dividend, divisor) : dividend를 divisor로나눈나머지를반환합니다SELECT CEILING(3451, 4) 3 // 862 X 4 + 3

POWER(numeric_expr1, numeric_expr2) : numeric_expr1에 numeric_expr2 제곱한결과를반환합니다.SELECT POWER(2, 10) 1024

RAND([integer_expr]) : 0 이하임의의난수를발생시킵니다SELECT RAND() 0.~~~~~

Page 157: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

ROUND(numeric_expr, integer_expr) : numeric_expr을 integer_expr자리로반올림합니다SELECT ROUND(3451.5206, 3) 3451.5210

TRUNCNUM(numeric_expr, integer_expr) : numeric_expr에서소수점 integer_expr자리미만을내린값을산출합니다.SELECT TRUNCNUM(3451.5206, 1) 3451.5000

그외의숫자함수에대해서는매뉴얼을참조하시기바랍니다.

Page 158: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

DATE(expr) : expr의날짜데이터중에서 년-월-일만표시합니다.SELECT DATE('19980131 16:04:15') 1998-01-31

DATEFORMAT(date_expr, string_expr) : date_expr를 string_expr형으로변환SELECT DATEFORMAT('1998-01-31','mm, dd, yyyy') 01, 31, 1998

DAY(date_expr) : date_expr의날짜를수로표현 (1~31) 합니다SELECT DAY('19980131 16:04:15') 31

DAYNAME(date_expr) : date_expr의요일을영문으로나타냅니다SELECT DAYNAME('19980131 16:04:15') Saturday

DAYS(date_expr1, date_expr2) : date_expr1에서 date_expr2 까지의날짜수SELECT DAYS('19980131', '20040707') 2349

DOW(date_expr) : date_expr의요일을수로표현합니다. (1=Sunday, 2=Monday, ……7=Saturday)SELECT DOW('19980131 16:04:15') 7

Page 159: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

MONTH(date_expr) : date_expr의월을수로표현(1~12)합니다SELECT MONTH('19980131 16:04:15') 1

MONTHNAME(date_expr) : date_expr의월을영문으로나타냅니다SELECT MONTHNAME('19980131 16:04:15') January

MONTHS(date_expr1, date_expr2) : date_expr1에서 date_expr2 까지의총개월수를나타냅니다. 일수는관계없이단순히월만계산합니다.SELECT MONTHS('19980131', '20040707') 78

QUARTER(date_expr) : date_expr의분기를수로표현(1~4)합니다SELECT QUARTER('19980131 16:04:15') 1

WEEKS(date_expr1, date_expr2) : date_expr1에서 date_expr2까지의총주를나타냅니다.SELECT WEEKS('19980131', '20040707') 335

YEAR(date_expr) : date_expr의년도를수로표현합니다SELECT YEAR('19980131') 1998

Page 160: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

YEARS(date_expr1, date_expr2) : date_expr1에서 date_expr2 까지의총년수를표현합니다.SELECT YEARS('19980131', '20040707') 6

YMD(year_num, month_num, day_num) : year_num의년도에month_num의개월을더하고 day_num을더한일자를나타냅니다SELECT YMD(1997, 12, 62) 1998-01-31

NOW([*]) : 현재일자와시간, 분, 초,Millisecond를나타냅니다SELECT NOW() 2004-07-07 16:04:30.918

TODAY(*) : 시간, 분, 초,Millisecond를제외한현재일자만표시합니다SELECT TODAY() 2004-07-07

날짜연산SELECT YEARS(DATE('2000-04-11'), 1) 2001-04-11 00:00:00.000SELECT MONTHS(DATE('2000-04-11'), 1) 2000-05-11 00:00:00.000SELECT DAYS(DATE('2000-04-11'), 1) 2000-04-12 00:00:00.000

Page 161: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

HOUR(datetime_expr) : datetime_expr의시간을나타냅니다(0~23)SELECT HOUR('19980131 16:04:15') 16

HOURS(datetime_expr1, datetime_expr2) : datetime_expr1에서 datetime_expr2까지의총시간을나타냅니다SELECT HOURS('19980131 16:04:15', '20000411 09:40.15') 19217

MINUTE(datetime_expr) : datetime_expr의분을나타냅니다(0~59)SELECT MINUTE('19980131 16:04:15') 4

MINUTES(datetime_expr1, datetime_expr2) : datetime_expr1에서 datetime_expr2까지의총분을나타냅니다SELECT MINUTES('19980131 16:04:15', '20000411 09:40.15') 1153056

SECOND(datetime_expr) : datetime_expr의초를나타냅니다(0~59)SELECT SECOND('19980131 16:04:15') 15

SECONDS(datetime_expr1, datetime_expr2) : datetime_expr1에서datetime_expr2까지의총초를나타냅니다SELECT SECONDS('19980131 16:04:15', '20000411 09:40.15') 69183360

Page 162: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

NUMBER(*) : SELECT 결과값의각행에대해일련번호를부여하는함수입니다SELECT NUMBER(*) as SEQ, * FROM customer;

ROWID(table_name) : 각테이블에데이터가입력될때입력되는순서에의해각각의 ID가일련번호로저장됩니다. 그번호를참조하는함수입니다. 실제로데이터가입력된테이블에서만사용가능하여 derived table(in-line view) 에서는사용할수없습니다.SELECT ROWID(customer) as ROWNUM, * FROM customer;

COALESCE(expr1, expr2[, expr3,,,]) : expr1이 NULL 이면 expr2를아니면 expr1을반환합니다. 만약에 expr2도 NULL 이면 expr3을반환합니다.SELECT COALESCE(NULL, 0) 0

IFNULL(expr1, expr2 [,expr3]) : expr1의값이 NULL 이면 expr2를, 아니면 expr3을반환합니다.SELECT IFNULL(-1, 0, 1) 1

NULLIF(expr1, expr2) : expr1과 expr2가같으면 NULL을, 아니면 expr1을반환합니다.SELECT NULLIF(0, 0) [NULL]

ERRORMSG(sqlstate | sqlcode) : 문자타입의 sqlstate나숫자타입의 sqlcode에해당하는오류메시지를출력합니다. 단, ASA와 IQ에공통인오류로제한됩니다.SELECT ERRORMSG(-813) 'FOR UPDATE has been incorrectly ……'

Page 163: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

EXPRTYPE(string_expr, integer_expr) : string_expr의컬럼중에서 integer_expr컬럼의데이터타입을출력합니다.SELECT EXPRTYPE('SELECT line_id FROM sales_order_items', 1 ) smallint

VAREXISTS(string) : string의이름을갖는변수가선언혹은생성되었는지여부를점검합니다.SELECT VAREXISTS('start_time') 0 // 선언되지않은경우

ISDATE(string) : string이 date 타입으로변환가능한지여부를점검합니다.SELECT ISDATE('20040231') 0 // 변환되지않는경우

ISNUMERIC(string) : string이 numeric 타입으로변환가능한지여부를점검합니다.SELECT ISNUMERIC('123456') 1 // 변환되는경우

Page 164: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

CURRENT DATE : 현재일자를나타내는상수함수입니다.

CURRENT TIME : 현재시간을나타내는상수함수입니다.

CURRENT TIMESTAMP: 현재일자와현재시간을조합하여나타내는상수함수입니다.

CURRENT USER : 현재 connection 되어있는사용자의 ID, 즉자기의 ID 입니다.

SQLCODE : 현재의 SQLCODE값입니다.

SQLSTATE : 현재의 SQLSTATE값입니다. 예를들어 26501값은 'SQL statement error'를표시합니다.표준을준수하기위해사용합니다.

CONNECTION_PROPERTY(expr) : expr의 connection property 값을반환합니다. expr값은 sa_conn_properties의결과를참조하세요.

DB_PROPERTY(expr) : expr의 db property 값을반환합니다. expr값은sa_db_properties의결과를참조하세요.

PROPERTY(expr) : expr의 server property 값을반환합니다. expr값은sa_eng_properties의결과를참조하세요.

Page 165: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

CAST (expr AS data_type) : expr의데이터타입을 data_type으로변환합니다SELECT CAST('JOHN SMITH' AS char(2)) JO

DATE(expr) : expr을 DATE 타입으로변환합니다.SELECT DATE(20000411) 2000-04-11

DATETIME(expr) : expr을 DATETIME 타입으로변환합니다.SELECT DATETIME('20000411') 2000-04-11 00:00:00.000

Page 166: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

-

데이터타입은묵시적으로자동으로변경될수도있고 CAST와같이명시적으로타입을변경할수도있습니다. 산술연산에서묵시적데이터타입변경은아래규칙에따라적용됩니다.

수치형문자가산술표현식에사용되거나수치매개변수를요구하는함수에사용되었다면이문자는수치타입으로자동변환됩니다. SELECT 1000 + '1' 1001.000… // SELECT 1000 + CAST( '1' AS NUMERIC)

// 단, '1' 대신에문자형컬럼은명시적으로// 타입변경을해야함

수치가문자표현식에사용되거나문자함수의매개변수로사용되었다면그수치는문자로자동변환됩니다. SELECT RIGHT(123456, 3) 456 // 숫자 123456을문자취급

문자는날짜표현식에서자동으로날짜로변환됩니다.SELECT MONTH('19980131 16:04:15') 1

Page 167: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

:

ti si in ui bi ub nu rl dl bt dt tm ts ch vc bn vbtinyint I I I I I I I I I I X X X E E I I

smallint I I I I I I I I I I X X X E E I Iinteger I I I I I I I I I I X X X E E I I

unsigned int I I I I I I I I I I X X X E E I Ibigint I I I I I I I I I I X X X E E I I

unsigned bigint I I I I I I I I I I X X X E E I Inumeric I I I I I I I I I I X X X E E X X

real I I I I I I I I I I X X X E E X Xdouble I I I I I I I I I I X X X E E X X

bit I I I I I I I I I I X X X E E X Xdate X X X X X X X X X X X I X X X X Xtime X X X X X X X X X X I X X X X X X

timestamp X X X X X X X X X X X X X X X X Xchar E E E E E E E E E E X X X I I I I

varchar E E E E E E E E E E X X X I I I Ibinary I I I I I I X X X X X X X I I I I

varbinary I I I I I I X X X X X X X I I I I

I : implicit (묵시적) E : explicit(명시적) X : 지원되지않음

Page 168: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

-

데이터타입이서로다른 argument들을 =, <, > 등과같은비교연산자를이용하여비교할때묵시적으로타입변경이적용되는일반적인규칙은아래와같습니다.

argument들의데이터타입이공통의슈퍼타입을가지고있다면일단공통의슈퍼타입으로변경을된후에비교가이루어집니다. 예를들어 BIT 타입과 TINYINT 타입이비교된다면이두개의타입은공통된슈퍼타입인 NUMERIC으로변경된후에비교가이루어집니다.

대상데이터타입 슈퍼타입

BIT, TINYINT, SMALLINT, [UNSIGNED] INTEGER, [UNSIGNED] BIGINT, NUMERIC NUMERIC

REAL DOUBLE

CHAR LONG VARCHAR

BINARY LONG BINARY

DATE TIMESTAMP

TIME TIMESTAMP

Page 169: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

:

ti si in ui bi ub nu rl dl bt dt tm ts ch vc bn vbtinyint I I I I I I I I I I E E E E E I I

smallint I I I I I I I I I I E E E E E I Iinteger I I I I I I I I I I E E E E E I I

unsigned int I I I I I I I I I I E E E E E I Ibigint I I I I I I I I I I E E E E E I I

unsigned bigint I I I I I I I I I I E E E E E I Inumeric I I I I I I I I I I E E E E E X X

real I I I I I I I I I I E E E E E X Xdouble I I I I I I I I I I E E E E E X X

bit I I I I I I I I I I X X X E E X Xdate E E E E E E E E E X I X I E E X Xtime E E E E E E E E E X X I E E E X X

timestamp E E E E E E E E E X E I I E E X Xchar E E E E E E E E E E E E E I I I I

varchar E E E E E E E E E E E E E I I I Ibinary I I I I I I X X X X X X X I I I I

varbinary I I I I I I X X X X X X X I I I I

I : implicit (묵시적) E : explicit(명시적) X : 지원되지않음

Page 170: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

Creating table and index

Page 171: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

create table

syntaxCREATE [ GLOBAL TEMPORARY ] TABLE [owner].table-name(

column-definition [column-constraint],column-definition [column-constraint],. . . . . . . . [table-constraint],[table-constraint],. . . . . . . .

)[IN dbspace-name] // SYSTEM이면 catalog 영역[ON COMMIT DELETE | PRESERVE ROWS] // temporary table일경우만사용

- column-definition : column-name data-type [ [not] null ] identity- column-constraint : unique, primary key, references, iq unique, check- table-constraint : unique, primary key, foreign key

Page 172: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

create table-table name

global temporary 라는옵션을기술하였다면임시성테이블이생성되며생략하였다면지속성영구테이블이생성됩니다.

global temporary table 생성시에 table-name 앞에 owner 명을기술하였다면 12.6부터는임시테이블이생성되는것이아니라 permanent base 테이블이생성되므로 upgrade시에주의하시기바랍니다

global temporary 라는옵션을기술하면 systable이라는시스템테이블의 table_type에GBL TEMP로생략하면 BASE로입력됩니다.

예)CREATE TABLE product(

id UNSIGNED INT PRIMARY KEY IQ UNIQUE(10),name CHAR(15) NOT NULL IQ UNIQUE(5),………………

)

Page 173: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

create table-column definition

column-name, data-type, property로구성되며 property에는 NULL과 NOT NULL를선택할수있고생략하면클라이언트종류에따라 NULL과 NOT NULL이바뀔수있으므로테이블생성스크립트에반드시표현해주십시오.

예)CREATE TABLE product(

id UNSIGNED INT PRIMARY KEY IQ UNIQUE(10),name CHAR(15) NOT NULL IQ UNIQUE(5),description CHAR(30) NOT NULL IQ UNIQUE(10),size CHAR(18) NOT NULL IQ UNIQUE(4),color CHAR(06) NOT NULL IQ UNIQUE(5),quantity UNSIGNED INT NOT NULL IQ UNIQUE(9),unit_price NUMERIC(15,2) NOT NULL IQ UNIQUE(6)

)

참고NULL, NOT NULL 생략시 isql에서는 NOT NULL, dbisqlc에서는 NULL을기본값으로취급합니다.

Column-name

Data-type property constraint

Page 174: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

create table-identity

12.6부터추가된기능으로특정한컬럼에순차적인번호를 자동으로입력하고싶을때그컬럼을선언하여사용하는기능으로그컬럼의데이터타입은 int계열이나 scale이 0인numeric이어야합니다.

만약 Identity 컬럼을사용자임의의값으로입력하고자한다면 Identity_Insert라는옵션을통해대상테이블의설정을 On 으로변경하는선행작업을해야만합니다.

예)CREATE TABLE product(

id INT NULL IDENTITY | DEFAULT AUTOINCREMENT,……

)

참고identity 컬럼에 auto increment 기능으로 5건을입력한후에 Identity_Insert라는옵션을통해 identity 컬럼에자동이아닌강제적으로 10 이라는값을입력했다면다음에자동으로 identity 컬럼에입력되는값은 11입니다.

Page 175: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

create table-data type

Data Type RangeMax Prec.

Storage(byte)

CHAR (n)CHARACTER (n)

1 <= n <= 255 n

CHAR (n)CHARACTER (n)

256 <= n <= 32K 256 + (n - 255)

VARCHAR (n)CHARACTER VARYING (n)

1 <= n <= 255 n

VARCHAR (n)CHARACTER VARYING (n)

256 <= n <= 32K 256 + (n - 255)

INTEGERUNSIGNED INT

-2,147,483,648 ~ 2,147,483,6470 ~ 42,942,967,294

1011

4

TINYINT 0 ~ 255 3 1

Page 176: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

create table-data type

Data Type RangeMax Prec.

Storage(byte)

SMALLINT -32,768 ~ 32,767 5 2

BIGINTUNSIGNED BIGINT

-9,223,372,036,854,775,808 ~9,223,372,036,854,775,807

0 ~ 18,446,744,073,709,551,615

1920

8

FLOAT (n) Platform-dependent 16 4 or 8

REAL Platform-dependent 7 4

DOUBLE 2.22 (^308) ~ 1.79 (^308) 15 8

DECIMAL (p,s)NUMERIC (p,s)

-10^38 ~ 10^38 - 1 126 2 to 69

BINARY (n) 1 <= n <= 255 256

Page 177: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

create table-data type

Data Type RangeMax Prec.

Storage(byte)

VARBINARY (n) 1 <= n <= (32k - 1) 32K - 1

BIT 0, 1, NULL 1

DATE 0001/01/01 ~ 9999/12/31 4

DATETIMESMALLDATETIMETIMESTAMP

0001/01/01 00:00:00.000000 ~9999/12/31 23:59:59.999999

8

TIME 00:00:00.000000 ~ 23:59.59.999999 8

Page 178: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

create table-data type

기본적으로각컬럼의데이터타입선택할때 INT 계열을최우선순위로고려할것을적극권장합니다. ( INT 계열 : TINYINT, SMALLINT, INT, UNSIGNED INT, BININT, UNSIGNED BIGINT )

CHAR/VARCHAR : VARCHAR에데이터가입력되면그뒤에생성시에기술한크기만큼의공백데이터가채워져기존시스템의 VARCHAR를사용할때의저장공간절약이라는이점은사라지고오히려가변길이중실데이터길이를저장하는추가 1Byte라는오버헤드가발생합니다. 그래서 255 Byte이하는 CHAR 사용하기를권장합니다.

날짜 : 일반적으로 CHAR(8)로선언하여사용하는데 DATE 형태로선언하여사용하는것이 SYBASE IQ의특성상인덱스의검색속도를향상시키므로특별한이유가없으면DATE를권장합니다. 특히 12.5 이상에서소개된 DATE INDEX의성능은그대상데이터타입이 DATE 일경우에만해당됩니다. 또한데이터로서시간에대한표현이필요없고날짜에대한표현만필요하다면 8Byte의 DATETIME 보다는 4Byte의 DATE을사용하는편이공간절약측면에서유리합니다.

소수점이하가없는숫자타입은 NUMERIC/DECIMAL로선언하는것보다 INT 형태로선언하는것이인덱스검색속도및조인속도를향상시킵니다. 특히조인컬럼은 TINYINT, SMALLINT, UNSIGNED INT, UNSIGNED BIGINT가가장좋습니다.

Page 179: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

create table-data type

NUMERIC(p,s) 의 precision : 아래표를참조하여확장성고려해충분한 precision 정의하시기바랍니다. DECIMAL은 NUMERIC과같습니다.

참고대용량을취급하는팩트형태의테이블에서는데이터타입의크기선택이디스크절감에지대한영향을미칩니다. 예를들어 1,000만건의데이터가들어갈팩트테이블의특정컬럼을 INT에서 TINYINT 나 SMALLINT로바꿀수있다면어떻게될까요?

Precision Length(byte)

1 - 4 2

5 - 9 4

10 - 18 8

19 이상 4 + 2 * (int(((prec - scale) + 3) / 4) + int((scale + 3) / 4) + 1)

Page 180: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

create table-data type

Column 범주 DataType Bytes 비고

SystemKey (Dummy Sequence) Unsigned int 4

1~30

8

4

Long String Varchar 256이상 Index 만들수없음

코드 Char 단, 숫자형태로된코드는 int형을사용한다. 가능하면코드값은숫자형으로변경한다.

일수/건수Unsigned Int,Smallint,tinyint

42,1

Int : 999,999,999 지원

숫자 255이하 Tinyint 1 연령, 가족수등

날짜 Date 4 IQ UNIQUE 적용최우선순위

여부 Tinyint 1 Y=1/N=0

기타숫자칼럼

Tinyint, Smallint,Int, unsigned int,Unsigned bigint

소수점이하없는수

소수점이하숫자 Numeric(p,s) Precision은 4,9,18 rule에적용됨

0 ~ 42억

30 Bytes까지 Concatenate 권장

Amount [Unsigned]Bigint금액, 이자, 세금등소수점이하없는수Bigint : 999,999,999,999,999,999 지원

Ratio Numeric(9,6) 이율, 0% ~ 999%

Business Key Concatenation Char

Page 181: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

create table-domain

시스템이제공하는 built-in 데이터타입을근간으로해서사용자가임의로만든단순한형태의사용자정의데이터타입으로데이터베이스일치성향상및편이성을제공합니다.

syntaxCREATE DOMAIN domain-name data-type [ [ not ] null ];

예)CREATE DOMAIN street_address char(35) ;CREATE TABLE twocol ( id int, street street_address );

해당하는도메인을사용한 object 가없는경우에한해서삭제가가능합니다.

syntax DROP DOMAIN domain-name;

예)DROP DOMAIN street_address;

Page 182: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

: IQ domain

SYBASE IQ는 ASE, ASA, ANSI 등과의호환성을유지하기위해다음과같은내부적으로도메인을만들어서사용하고있습니다.

Name Base Type Allow null

BLOB LONG BINARY Yes

CLOB LONG VARCHAR Yes

DATETIME TIMESTAMP Yes

SMALLDATETIME TIMESTAMP Yes

IMAGE LONG BINARY Yes

TEXT LONG VARCHAR Yes

MONEY NUMERIC(19,4) Yes

SYSNAME VARCHAR(30) No

XACT_ID UNSIGNED BIGINT Yes

Page 183: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

create table-constraint

IQ UNIQUE디폴트인덱스인 FP 인덱스의타입을컬럼의카디날리티에따라선택할수있도록합니다. 카디날리티가 255 이하이면 FFP 인덱스가, 256~65536 이면 FFFP 인덱스가, 65536이상이나생략하면 Flat FP 인덱스가자동으로생성됩니다. 이렇게 IQ UNIQUE를적용하면더좋은압축률과더좋은실행계획을산출할수있도록도와줍니다.

alphaalphabeta

gammabetabeta

.

.

112322..

alphaalphabetabeta

gammagamma......

123..

256

Flat FP FFP Index000000..

alphaalphabetabeta

gammagamma........

0 10 20 3...

65536

112322..

FFFP Index

OROR

Lookup table (256까지표현)

1byte 데이터

Lookup table(65536까지표현)

2byte 데이터

Page 184: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

- iq unique

옵션중 Minimize_Storage의값이 On이면만들어지는모든컬럼의 constraint가 IQ UNIQUE(255)와같습니다. 그렇지만이옵션값은경우에따라적재속도를떨어뜨릴수있으므로충분히고려하여적용하여주십시오.

SYBASE IQ의 cost-based 옵티마이저가실행계획을작성할때 catalog로부터여러가지정보를취합하게되는데여기서중요한인자중의하나가바로각컬럼의카디날리티입니다. 이런카디날리티정보는 HG, LF 인덱스와 IQ UNIQUE에의해서생성됩니다

12.6 부터는테이블생성시에만가능했던 IQ UNIQUE 값의변경을테이블의재생성없이sp_iqrebuildindex라는 stored procedure를통해 FP 인덱스의선택을변경할수있습니다.

압축율과전체적인성능향상에도움이되는 IQ UNIQUE의사용을아래와같은경우에적극권장합니다. 길이가 2 byte 이상이며카디날리티가 255 이하인컬럼길이가 3 byte 이상이며카디날리티가 256 ~ 65536 이하인컬럼

Page 185: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

create table-constraint

UNIQUEunique HG 인덱스가내부적으로자동으로생성되며데이터의유일성체크와옵티마이져에게보다많은정보를주어좋은실행계획을생성하도록도와줍니다. 그렇지만관리상가능하면 CREATE INDEX로사용하시는편이좋을듯합니다.

PRIMARY KEYunique HG 인덱스가내부적으로만들어지며 2개이상의컬럼을조합하여인덱스를만들수있습니다. 데이터의유일성체크와옵티마이져에게보다많은정보를주어좋은실행계획을생성하도록도와줍니다. 조합인덱스의경우라도각컬럼에대한인덱스는별도로다시만들어합니다. 디멘션테이블에서는반드시사용을권장합니다. 조합인덱스를사용하여조인질의실행시인덱스로서기능을발휘합니다. 단, PK, FK의선언이선행되어야하며조합인덱스로사용된모든컬럼이 Equal 질의로사용되어야만합니다.

FOREIGN KEYnon-unique HG 인덱스가내부적으로만들어지며 2개이상의컬럼을조합하여인덱스를만들수있습니다. 이렇게 FK가생성되어지면참조무결성규칙이적용됩니다. 단, Disable_RI_Check 옵션이 Off 일경우에만해당됩니다.

Page 186: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

create table-constraint

CHECK12.6부터제공되는기능으로데이터의정합성을위해입력이허락되어야하는특정한조건을 check constraint를통해구현할수있습니다.

RULE, DEFAULT와같은 CONSTRAINT는현재버전의 SYBASE IQ에서는제공되지않습니다.

Page 187: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

referential integrity

참조무결성규칙은 12.5 버전부터도입되었으며다음과같이동작합니다. FK를포함한테이블에 INSERT/UPDATE가발생하면 FK 컬럼의데이터를 PK와비교하여위반되면ROLLBACK하고아니며 INSERT/UPDATE를실행합니다.

PK를포함한테이블에 DELETE가발생할때이테이블을참조하는 FK 값이존재하면ROLLBACK하며이테이블에존재하지않는값으로의 UPDATE도역시 ROLLBACK 합니다. 단, CASCADE DELETE와 FK 값을 NULL로변경하는기능은향후제공예정입니다.

데이터가존재하는테이블에 ALTER TABLE ADD FOREIGN KEY 명령어를실행할때RI 위반이발생하면명령어가실행되지않을것입니다.

LOAD TABLE 할때 RI 위반이발생하면옵션에따라 ROLLBACK 혹은재처리파일로저장됩니다. 재처리파일로의데이터저장기능은 12.5 이상의기능이며추후확인과정을거쳐재입력할수있습니다.

BASE TABLE를참조하는 FK를임시테이블에생성할수없으며임시테이블을참조하는 FK 역시 BASE TABLE에생성할수없습니다.

여러가지조건에따라달라질수있으나 RI 검사를위해일반적으로 5% 정도의오버헤드가존재하고 M:M 조인성능향상과같은추가적인성능향상이점도있으므로상황에따라적절히선택하여사용하시기바랍니다.

Page 188: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

create table in system

예)CREATE TABLE product(

id UNSIGNED INT PRIMARY KEY,name CHAR(15) NOT NULL,description CHAR(30) NOT NULL,size CHAR(18) NOT NULL,color CHAR(06) NOT NULL,quantity UNSIGNED INT NOT NULL,unit_price NUMERIC(15,2) NOT NULL

) IN SYSTEM

참고위의테이블은 IQ Main Store 영역에생성되지않고 Catalog Store에생성되며파일크기한계를가지고있습니다. 이한계값에도달하면 IQ Server가 down되거나 hang 상태가되는등여러가지부작용이많습니다.SYBASE IQ에서 ASA는단순히 Catalog를위한공간이므로사용자들의사용을금하여주십시오.

Page 189: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

create table

예)CREATE TABLE employee(

emp_id UNSIGNED INTEGER NOT NULL IQ UNIQUE(75),manager_id UNSIGNED INTEGER NULL IQ UNIQUE(5),emp_fname CHAR(20) NOT NULL IQ UNIQUE(66),emp_lname CHAR(20) NOT NULL IQ UNIQUE(75),dept_id UNSIGNED INTEGER NOT NULL IQ UNIQUE(5),street CHAR(40) NOT NULL IQ UNIQUE(75),city CHAR(20) NOT NULL IQ UNIQUE(25),state CHAR(4) NOT NULL IQ UNIQUE(4),zip_code CHAR(9) NOT NULL IQ UNIQUE(27),phone CHAR(10) NULL IQ UNIQUE(72),status CHAR(1) NULL ,ss_number CHAR(11) NOT NULL IQ UNIQUE(75),salary NUMERIC(20,3) NOT NULL IQ UNIQUE(73),start_date DATETIME NOT NULL IQ UNIQUE(73),termination_date DATE NULL IQ UNIQUE(73),birth_date DATETIME NULL IQ UNIQUE(75),bene_health_ins CHAR(1) NULL ,bene_life_ins CHAR(1) NULL ,bene_day_care CHAR(1) NULL ,sex CHAR(1) NULL ,PRIMARY KEY (emp_id),FOREIGN KEY (dept_id) REFERENCES department(dept_id)

);

Page 190: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

select into

12.6 이상버전에서는이미존재하는테이블에특정조건을만족하는데이터를선택해서새로운테이블혹은임시테이블을생성하고이테이블에선택된데이터를입력하는기능을 select into라는방법을통해구현할수있습니다.

이렇게새로생성되는목적테이블에는소스테이블에서가지고있던 identity 컬럼속성,인덱스, IQ UNIQUE, constraint 등은상속되지않고오직컬럼, 데이터타입, null property 등과같은기초적인테이블상태만복제됩니다.

resource 권한을가진사용자만이이명령어를사용할수있고데이터는 rollback될수있지만생성된테이블은 auto commit 됩니다.

syntaxSELECT column-list INTO [ owner ].[#] table-nameFROM table-listWHERE search-condition

예)SELECT last_name, first_name, title, phone, faxINTO contact_maFROM contactWHERE state = 'MA';// contact_ma 라는새로운테이블이만들어지고 state가 MA인데이터가입력됩니다

Page 191: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

select into vs. variable

select-list에기술된이름이두개이상이며 into절에사용되는 target 이름이하나일때이는테이블이생성됩니다.

select-list에기술된이름이두개이상이며 into절에사용되는 target 이름이 select-list 와같은수로일치될때이는변수에데이터가할당됩니다.

예) SELECT column1, column2 INTO [#]target…… //[임시]테이블생성vs.SELECT column1, column2 INTO target1, target2…… //변수에값할당

select-list에기술된이름이하나이고 into절에사용되는 target 이름도하나이면변수에데이터가할당됩니다.

select-list에기술된이름이하나이고 into절에사용되는 target 이름도하나이지만target 이름앞에 owner 이름이명시되면테이블이생성됩니다.

예) SELECT column1 INTO target…… //변수에값할당vs.SELECT column1 INTO owner.target…… //테이블생성

Page 192: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

alter table

syntaxALTER TABLE [owner.]table-name{ADD column-definition [column-constraint]…| ADD table-constraint| MODIFY column-name [not] null| DROP column-name| DROP unique| DROP primary key| DROP foreign key| RENAME new-table-name| RENAME old-column-name TO new-column-name}

예)ALTER TABLE employeeADD OFFICE CHAR(20) NOT NULL; // 데이터가없을때만가능

ALTER TABLE employeeMODIFY office NULL;

ALTER TABLE employeeDROP office;

Page 193: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

drop table

syntax DROP TABLE [owner.]table-name

이테이블과연관되어진 JOIN INDEX가존재한다면먼저 DROP 하고그후에 DROP TABLE을해야합니다.

다른사용자가현재액세스하고있다면다음과같은에러가발생합니다.

User 'xxx_user' has the row in 'xxx_table' locked

Page 194: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

create table locking

12.5 까지는 DBMS(IQ) 전체적으로특정한사용자가특정한테이블에대해 DDL을수행하고있다면다른어떤사용자도그작업이종료될때까지 local temporary table과인덱스에대한 DDL은제외한어떤종류의 DDL도허용되지않았습니다.

그러나 12.6 부터는대상이되는테이블이같지않다면동시에수행되는 DDL이허락되는구조로바뀌었습니다.

Page 195: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

comment

테이블이나뷰와같은데이터베이스 object에대해시스템카다로그내에추가정보를저장하기위해사용합니다

syntax COMMENT ON{ COLUMN [owner.]table-name.column-name

| EVENT event-name | USER userid| INDEX [[owner.]table-name.]index-name| PROCEDURE [owner.]procedure-name| TABLE [owner.]table-name | VIEW [owner.]view-name….

IS comment;

예)COMMENT ON TABLE employee is "Employee Information"; // 주석생성COMMENT ON TABLE employee is null; // 주석제거

참고이렇게저장된정보는 sp_iqtable이나 sp_iqcolumn등과같은 stored procedure 결과의 remarks 컬럼에출력됩니다.

Page 196: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

sp_iqtable

syntaxsp_iqtable table-name;

Page 197: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

sp_iqcolumn

syntaxsp_iqcolumn table-name;

Page 198: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

sp_iqtablesize

syntaxsp_iqtablesize '[owner.]table-name';

Page 199: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

: Proxy table(CIS)

CIS는 Component Integration Service의 줄임말로 SYBASE IQ에 외부 데이터베이스의테이블을볼수있는위치투명성을제공하는기능입니다.

SYBASE IQ에 외부 데이터베이스에 존재하는 테이블을 대신하는 프록시 테이블을 생성하고두개의연결고리를만들어주면그후부터는마치 IQ의테이블처럼사용할수있습니다.

링크형태로연결되어있기때문에성능은다소떨어지나 SYBASE IQ에서처리할수없는 OLTP 업무혹은주기가짧고데이터양이적은 ETL에대한보안책으로사용할수있습니다.

지원가능한 DBMS 로는 SYBASE IQ, ASE, ASA, Oracle, DB2, MS SQL Server 등이있습니다.

SYBASE IQASEASAOracleDB2MS SQL

Proxy_TBL Org_TBL

select *from Proxy_TBLwhere …

Local RemoteDirectConnect

?………………………………………………………………………………………………

Page 200: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

: Proxy table -1

먼저 SYBASE IQ쪽에연결을원하는데이터베이스를등록합니다. 단, ODBC/JDBC에대한환경설정은미리되어있다고가정합니다.

syntaxCREATE SERVER server-nameCLASS 'ASAJDBC' | 'ASAODBC' |

'ASEJDBC' | 'ASEODBC' |'DB2ODBC' | 'MSSODBC' | 'ORAODBC' | 'ODBC'

USING ' ip-address:port-number [/db-name ] | data-source-name'[ READ ONLY ]

JDBC로 연결할 때는 using절에 ip-address:port-number /db-name을 사용해야 하며ODBC를 사용할 때는 using절에 data source name(DSN)을 사용해야 합니다. 이때/db-name은기능적으로는옵션이지만성능으로는필수입니다.

UNIX에존재하는 ASE를연결할때는 ASEJDBC만가능하며 Win 계열의 ASE를연결할때는 ASEODBC를권장합니다.

예)CREATE SERVER IQ2ASE CREATE SERVER IQ2ORACLASS 'ASEJDBC' CLASS 'ORAODBC'USING '158.77.50.165:4100 /pubs2'; USING 'ORA_PROD';

Page 201: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

: Proxy table -1

참고SYBASE IQ가 Window에설치된환경에서 ODBC를 통한 프록시 설정은 연결하고자 하는 DBMS의 위치가 Unix나 Window 등 어디나 관계없지만 SYBASE IQ가 Unix에 설치된 환경이라면 IQ와 연결하고자 하는 DBMS의 중간에 DirectConnect 라는 미들웨어가반드시필요합니다. 이때 CREATE SERVER의 CLASS절에는 ASEJDBC만기술가능합니다.

Page 202: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

: Proxy table -2

먼저 SYBASE IQ쪽의사용자가연결을원하는외부데이터베이스로접속할수있도록사용자를생성합니다.

syntaxCREATE EXTERNLOGIN login-name // resource 권한소유TO remote-server // 1단계에서등록된서버REMOTE LOGIN remote-user;

SYBASE IQ와 remote-user는 미리 생성되어 있어야 하며 remote-user는 대상 테이블에적절한권한을가지고있어야합니다.

Remote-server가 ASE라면 remote-user에 대한 default db는 master db를 피해야 합니다.

예)CREATE EXTERNLOGIN cis_user CREATE EXTERNLOGIN cis_userTO IQ2ASE TO IQ2ORAREMOTE LOGIN ase_user; REMOTE LOGIN ora_user;

Page 203: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

: Proxy table -3

먼저 SYBASE IQ쪽에외부데이터베이스테이블에대한프록시테이블을생성합니다.

syntaxCREATE EXISTING TABLE [owner].table-name [ (column-definition,…) ]AT remote-server-name.[db-name].[owner].table-name;

새로운 로컬 프록시 테이블을 생성하는 명령어이며 remote쪽의 테이블과 로컬의 프록시테이블을연결하는역할을수행합니다.

여기서 remote-server-name은 create server할때생성한 server-name 입니다.

만약에 remote-server 쪽의테이블이존재하지않는다면이명령어는오류메시지를출력하고취소됩니다.

column-definition을 생략하면 remote-server 쪽의 메타 데이터를 IQ가 직접 읽어서 처리하며생략하지않았다면다음규칙에따릅니다.컬럼이름 : 반드시일치data type : 상호 convert 가능한 data type 사용null : 가능하면일치, 상호일치되지않으면경고메시지만출력length : 가능하면 일치, varchar, char, binary, varbinary, decimal, numeric등의길이가일치되지않으면경고메시지만출력

Page 204: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

: Proxy table -3

예) ASECREATE EXISTING TABLE publishers(

pub_id CHAR(4) NOT NULL,pub_name CHAR(40) NULL,city CHAR(20) NULL,state CHAR(2) NULL

)AT 'IQ2ASE.pubs2.dbo.publishers';// 미리생성된 IQ2ASE라는리모트서버의 pubs2라는데이터베이스내의 dbo라는// 사용자의 publishers라는테이블을로컬서버의 publishers라는프록시테이블로설정

예) OracleCREATE EXISTING TABLE BONUS(

ENAME CHAR(10) NULL,JOB CHAR(9) NULL,SAL INTEGER NULL,COMM INTEGER NULL

)AT 'IQ2ORA..scott.BONUS';

Page 205: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

: Proxy table -

sp_remote_tables 라는 stored procedure를 이용해서 리모트 서버내의 테이블 목록을확인할수있습니다.sp_remote_tables server-name [, table-name] [, owner] [, db-name]

sp_remote_columns 라는 stored procedure를이용해서리모트테이블의컬럼정보를확인할수있습니다.sp_remote_columns server-name ,table-name [, owner] [, db-name]

FORWARD TO를 이용 passthrough 모드로 접속해서 리모트 서버의 native SQL을 사용할수있습니다.FORWARD TO server-name; // passthrough모드시작

native-SQL; // remote server의 native SQLFORWARD TO // passthrough모드해제

리모트 서버에서 사용 중인 stored procedure를 실행할 수 있는 RPC 기능도 제공하고있습니다.

Page 206: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

create view

실제데이터를저장하지는않으면서마치테이블처럼사용되어지는가상의테이블입니다. 뷰가참조되는시점에카다로그로부터뷰의정의를읽어뷰를형성하는기본테이블이참조합니다.

syntaxCREATE VIEW view-name [ (column-name,…) ]AS select-statement-without-order-by[ with check option ];

예)CREATE VIEW emp_deptAS SELECT emp_lname,

emp_fname, dept_name

FROM employee e, department dWHERE e.dept_id = d.dept_id;

Table 1 Table 2

View

Page 207: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

create view-partition table

12.5 이상버전에서는매우큰팩트와같은테이블을 UNION ALL VIEW를통해파티션처리하여질의및로딩에대한성능을향상하였습니다. 단, 이때테이블생성및데이터관리는 DBA가모두수동으로작업해야합니다.

질의는각각의테이블을하나로묶어주는뷰를통해가능하고질의실행시각파티션별로병렬처리합니다. 각파티션된팩트테이블들은디멘션테이블에대한 FK 선언이선행되어야합니다.

매우커다란테이블에대한로딩작업시발생하던 HG 인덱스에대한오버헤드를감소시킬수있는방법입니다.

t1

t2

t3

Partitioned tableBig Fact Table

CREATE VIEW bigtable AS

SELECT * FROM t1UNION ALLSELECT * FROM t2UNION ALLSELECT * FROM t3

UNION ALL VIEW

Page 208: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

alter/drop view

DROP후에 CREATE 하는경우에이를대신해서 ALTER VIEW를사용할수있으며이렇게 ALTER를사용하면 VIEW에대한권한을재설정할필요가없습니다.

VIEW에대한 DDL을다른사용자가볼수없게암호화해서저장할수도있는데이때암호화된소스는복호화가되지않기때문에주의해서사용해야합니다.

syntax1ALTER VIEW view-name [ (column-name,…) ]AS select-statement-without-order-by[ with check option ];

syntax2ALTER VIEW view-name SET HIDDEN

VIEW를삭제하고자할때 DROP VIEW를통해삭제할수있습니다.

syntaxDROP VIEW view-name;

예)DROP VIEW emp_dept;

Page 209: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

sp_iqview

syntaxsp_iqview view-name;

Page 210: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

create index

syntaxCREATE [ UNIQUE ] [index-type] INDEX index-nameON [owner.]table-name(column-name) [notify interger]

index-type : CMP, HG, HNG, LF, WD, DATE, TIME, DTTM

UNIQUE를생략하면 NON_UNIQUE한인덱스가, index-type을생략하면 HG 인덱스가생성됩니다.

각인덱스는데이터의적재전/후에만들어질수있으나데이터적재전에인덱스를먼저만들고그후에로딩하는편이데이터를로딩한후에인덱스를만드는것보다빠릅니다.

복합인덱스는 UNIQUE/NON_UNIQUE HG 인덱스인경우를제외하고는현재버전까지는만들수없으며복합인덱스로 HG 인덱스를생성하는경우에도그복합인덱스를구성하는개별컬럼또한인덱스생성조건에맞춰인덱스를생성해야합니다.

FP 인덱스는 CREATE TABLE를통해서생성가능하며 sp_iqrebuildindex라는 stored procedure를통해추가생성및생성된값에대한변경도가능합니다

PRIMARY KEY constraint와 UNIQUE constraint에의해서 UNIQUE HG 인덱스가자동으로만들어집니다.

Page 211: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

create index-LF index

카디날리티가비교적낮은(1,500 이하) 컬럼에가장적합한인덱스이고데이터를 Bit-Map으로저장하며처리또한 Bit Processing으로수행하므로 HG 인덱스와함께가장빠른처리속도를나타냅니다.

조인등과같은대부분의질의에적합하지만특별히단일테이블에대한 SUM, AVG, COUNT, COUNT DISTINCT, MIN, MAX 연산에서절대적인성능을자랑합니다.

기술적으로는대상컬럼의카디날리티 10,000까지지원가능하나 1,500 이하인경우사용을권장합니다. 단, 25,000건이하인테이블의컬럼에는 HG 인덱스를권장합니다.

서울

1

0

0

0

00

부산

0

0

0

1

00

광주

0

0

0

0

00

인천

0

0

1

0

00

대전

0

0

0

0

10

대구

0

0

0

0

00

전주

0

1

0

0

00

성남

0

0

0

0

01

row-id

1

2

3

4

56

지점

Page 212: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

create index-HG index

카디날리티가 1,500 이상이고 JOIN, GROUP BY, equality 연산을수행하는컬럼에적합한인덱스로 B-Tree구조로되어있습니다.

유일성을보장하는경우에는 UNIQUE 옵션을사용할것을권장하고 데이터적재, 삭제, 디스크소요량등에많은부담을주는인덱스이므로한테이블에너무많은 HG 인덱스가만들어지지않도록주의바랍니다.

CREATE TABLE의 UNIQUE, PK, FK constraint에의해 unique 혹은 non-unique HG 인덱스가자동생성됩니다.

서울 경기 충청 강원

1,2,30,38,50, 73

35,36,44,60,61,53

11,24,29,51,81,83

21,54,59,65,91,93

row-id

Page 213: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

create index-HNG index

SUM(), AVG()와같은 aggregate 함수의대상이되는수치컬럼이나범위질의에사용되는컬럼에유용한인덱스로카디날리티가 1,500 이상일때사용하며선호하는데이터타입은 INT 계열입니다. 만약 DATE 계열의컬럼에대한범위질의가발생한다면 HNG보다는 DATE 인덱스의사용을권장합니다.

이미 LF 혹은 HG와같은인덱스가생성된컬럼이라고해도그컬럼이위와같은조건을만족하면생성할것을권장합니다. 또한 GROUP BY나조인컬럼이아니라면 HG 인덱스를대체할수도있습니다.

4*2 + 4*2 + 4*2 + 6*2

0

1

1

1

1

1

1

1

0

0

1

0

1

1

1

0

1

0

0

0

1

0

1

0

1

1

0

0

0011

6

9

5

11

9

3

7

12

0

1

1

1

1

1

1

1

0

0

1

0

1

1

1

0

1

0

0

0

1

0

1

0

1

1

0

0

0011

sale 8bit 4bit 2bit 1bit

3 2 1 0

2진수 표현

Page 214: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

create index-CMP, WD index

CMP 인덱스는카디날리티와무관하고컬럼간크기를비교할때사용되는인덱스로동일한데이터타입간의비교를보다빠르게하는인덱싱기법이며일반적으로원시데이터의70%로인덱스를생성합니다.

WD 인덱스는카디날리티와무관하며주소나설명과같이 long varchar컬럼에특정문자를빠르게검색할수있는인덱싱기법으로컬럼의사이즈가너무커서인덱싱하기어려운그러나반드시필요한컬럼을위한인덱스입니다.

6

9

5

11

9

3

7

colA

7

3

9

11

5

9

6

colB

0

1

0

0

1

0

1

0

0

0

1

0

0

0

1

0

1

0

0

1

0

>=< Address

1234 Main St. Columbus, OH 25613

1234 Main Columbus 25613

……………………………………………

…. ….. ……….. …….

……………………………………………

…. ….. ……….. …….

WD indexCMP index

Page 215: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

create index-DATE, TIME, DTTM

DATE 계열의데이터타입을사용하는컬럼을위해사용가능한인덱스로 날짜관련함수적용시기존인덱스를사용하면인덱스를사용하지못하는단점을보완하기위해만들었습니다. ( DATE 계열 : DATE, DATETIME, TIME )

카디날리티와무관하며 UNIQUE를선언할수없고오직 DATE 계열컬럼에만적용가능합니다.

DATE 계열컬럼에대한범위질의, datepart함수질의에사용되며범위질의에서는HNG 인덱스보다빠른성능을보이지만 datepart함수가없는 EQUALITY 질의는LF/HG 보다느립니다.

지원되는질의는다음과같습니다.datepart함수SELECT id, cust_id, region, sales_rep FROM sales_order WHERE YEAR(order_date) = 1994 // YEAR, MONTH, DAY, WEEK…

// =, >, <, <=, >=, IN, BETWEENdatepart함수없는범위SELECT id, cust_id, region, sales_rep FROM sales_order WHERE order_date > '1994-01-01' // >, <, <=, >=, BETWEEN

Page 216: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

create index-

인덱스 생성불가능한데이터타입

LF BIT, VARBINARY > 255, CHAR > 255, VARCHAR > 255

HG BIT, VARBINARY > 255, CHAR > 255, VARCHAR > 255, FLOAT, REAL, DOUBLE

HNG BIT, BINARY, VARBINARY, CHAR > 255, VARCHAR > 255, FLOAT, REAL, DOUBLE

WD CHAR, VARCHAR만사용가능

CMP 데이터타입이서로다른컬럼

DATE/TIME/DTTM DATE, TIME, DATETIME, TIMESTAMP만사용가능

Page 217: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

create index-

syntaxBEGIN PARALLEL IQ

create-index-statement-list;END PARALLEL IQ

SYBASE IQ는인덱스를생성한후에데이터를로딩하는속도가데이터를로딩한후인덱스를만드는속도보다빠릅니다. 그래서일반적으로데이터적재전에인덱스를생성합니다.

하지만이미데이터가존재하는상황에서인덱스를만들필요성이있을때사용할수있는명령어입니다. 이명령어를사용하면 create-index-statement-list에기술된명령어는기본적으로병렬로처리됩니다.

이명령어는 create-index-statement-list 전체에대한어떤오류가발생해도롤백되는ATOMIC 형태로동작되며한컬럼에대한여러개의인덱스를생성하는것은직렬로처리됩니다.

참고create-index-statement-list의적정수치는 CPU수 - 1 이며이명령어가실행중에는대상테이블에대한어떤 DDL도실행이불가능합니다.

Page 218: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

drop index

syntaxDROP INDEX [[owner.]table-name.] index-name

PRIMARY KEY constraint와 UNIQUE constraint에의해서만들어진인덱스는 DROP INDEX에의해삭제될수없고 ALTER TABLE을통해서만삭제가능합니다.

참고CREATE INDEX에의해생성된 LF, HG 인덱스는대상컬럼의카디날리티정보를카다로그에저장하여실행계획작성시옵티마이저에게해당정보를제공합니다. 이런컬럼에대한카디날리티정보는 sp_iqcolumn의 cardinality 컬럼에서볼수있습니다.

Page 219: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

create join index

조인의결과를미리테이블형태로보관하여대상이된테이블에대한조인질의를수행할때이조인인덱스에서처리하도록합니다.

성능적으로좋은측면이있으나대량의공간을소비하므로튜닝의최후의수단으로사용할것을권장합니다.

조인에참여하는테이블은 1:1, 1:m의관계를형성해야합니다. 즉m:n의관계는지원하지않습니다.

syntaxCREATE JOIN INDEX join-index-nameFOR join-clause;

예)CREATE JOIN INDEX customer_order_joinFOR customer FULL OUTER JOIN sales_orderON customer.id = sales_order.cust_id;

Page 220: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

drop join index

조인인덱스를형성하고있는테이블은조인인덱스를먼저삭제한후에해당테이블을삭제해야합니다

syntaxDROP JOIN INDEX join-index-name;

예)DROP JOIN INDEX customer_order_join;

연관된 stored proceduresp_iqjoinindexsizesp_iqestjoin

Page 221: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

sp_iqindex

syntaxsp_iqindex table-name;

Page 222: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

sp_iqindexsize

syntaxsp_iqindexsize index-name;

Page 223: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

Loading and Extracting data

Page 224: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

load

DW 는 OLTP시스템과달리데이터입력방법이실시간이아니라업무의특성에따라일정주기를갖고대량으로적재하는것이일반적입니다. SYBASE IQ도데이터를대량으로적재하는것을기본으로구성하고있습니다.

적재를위한원시데이터는일정한포맷을갖추고 flat file 형태로제공되며포맷형태에따라 binary file과 ascii file로구분됩니다.

한테이블에적재가진행되고있을때다른어떤사용자도그테이블에대해쓸수있는권한은없습니다. 물론읽기는 snapshot versioning 이라는기법을통해모든사용자가가능합니다.

적재작업은대상이되는테이블의데이터존재여부에관계없이추가입력됩니다. 즉존재하는데이터를 replace 하는 UPSERT 기능은제공되지않습니다.

LOAD 명령어는옵션에따라적재되는데이터가모두다입력되거나아니면전혀입력되지않을수있습니다.

또한 LOAD 명령어는옵션에따라적재시오류가발생한데이터와오류원인에대해파일로저장할수있는기능을제공합니다.

임시테이블도일반영구적인다른테이블처럼적재가가능합니다.

Page 225: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

load

syntaxLOAD TABLE [owner.] table-name[ ( column-name [column-spec] | filler (filler-type) ) ] // column-specFROM 'file-name'[, . . . . . . ] // 적재대상파일이름[ FORMAT 'ascii' | 'binary' ] // 적재대상파일포맷[ DELIMITED BY 'string' ] // 필드분리구분자QUOTES OFF // 반드시 offESCAPES OFF // 반드시 off[ WITH CHECKPOINT ON | OFF ] // checkpoint 실행여부[ ROW DELIMITED BY 'string' ] // 레코드분리구분자[ LIMIT number-of-rows ] // 총입력건수제한[ NOTIFY number-of-rows ] // message display 건수[ ON FILE ERROR rollback | finish | continue ] // multi-file인경우사용[ SKIP number-of-row ] // 처음부터몇건생략[ START ROW ID number-of-row ] // 몇번째 row 부터입력[ BLOCK FACTOR number | BLOCK SIZE number ] // block당 row 수[ IGNORE CONSTRAINT constraint-type [,…]] // 제약사항위반횟수정의[ MESSAGE LOG 'file-name' // 오류기록파일정의ROW LOG 'file-name' // 오류데이터기록파일정의[ONLY LOG log-what, […]] // 오류정의[ LOG DELIMITED BY 'string' ] // 오류데이터필드분리자

. . . . . .

Page 226: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

load-column spec

FROM절에기술한적재대상파일의필드포맷과 LOAD TABLE절에서기술한테이블컬럼의매핑정보를기술합니다. (주의 : 필드 vs. 컬럼)

column-name : 적재대상테이블의컬럼이름ASCII(numer-of-byte) : number-of-byte 크기의필드값을대상컬럼으로적재'field delimiter' : field delimiter 전까지의값을대상컬럼으로적재DATE | TIME(format) : format 형태의필드값을 DATE 계열의대상컬럼으로적재NULL ( BLANKS | ZEROS | 'literal' [,'literal'] . . ) : 괄호안의내용을 NULL로적재FILLER(number-of-byte) : 적재대상파일의 number-of-byte 만큼의길이를생략

예)LOAD TABLE sales( l_orderkey '|',

l_quantity ASCII(4) NULL(BLANKS, ZEROS, '9999'),FILLER(1),l_shipdate DATE('YYYY/MM/DD') NULL(BLANKS, ZEROS, '0000/00/00') )

FROM '/data/sales.dat'…………….0001|100002003/10/150002|200000000/00/000003|999902003/10/150004|100002003/10/11…………….

/data/sales.dat file format

Page 227: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

: NULL

NULL(BLANKS)대상컬럼의데이터타입에관계없이 empty string('')이 NULL 값으로입력됩니다. 만약이옵션을사용하지않는다면대상컬럼의데이터타입이 CHAR, VARCHAR 일경우 empty string('')이 space나 zero length 문자로입력됩니다. (ANSI 규정)이렇게잘못입력된 empty string('') 값은 SQL 프로그램처리할때논리오류를발생시킬수있으니주의하시기바랍니다.NON_ANSI_NULL_VARCHAR 옵션을통해변경할수있습니다.

NULL(ZEROS)소스파일의포맷이바이너리이며대상컬럼의데이터가 binary zero (all bit 0) 일경우에대상컬럼의값이 NULL 값으로입력됩니다.대상컬럼이 CHAR 타입인문자 0000은문자 0000으로입력되며, 소스파일의포맷이 ASCII 이고대상컬럼이숫자형인 0000은숫자 0으로입력됩니다.

NULL('literal')대상컬럼의타입에관계없이 '로둘러쌓인문자혹은문자열은 NULL 값으로입력됩니다.

Page 228: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

load-from clause

여러개의적재대상파일을콤마로분리하여하나의 FROM절에사용할수있습니다. 즉여러개의파일을하나의 LOAD 명령어로적재할수있습니다.

이렇게여러개의파일을통해적재작업을수행할때연관있는옵션으로는 ON FILE ERROR 라고하는것이있는데이는적재작업을진행하고있을때오류가발생하면어떻게할것인지기술해주는옵션입니다. 단, 여기서의오류는해당되는파일이없다거나읽기권한이없을때발생하는오류만을지칭합니다.

ON FILE ERROR ROLLBACK : 디폴트옵션으로서적재전체를취소합니다ON FILE ERROR FINISH : 현재까지수행되어진파일까지만작업을인정합니다ON FILE ERROR CONTINUE : 오류가발생된파일을건너뛰어작업을계속합니다

예)LOAD TABLE sales(

l_orderkey '|',l_quantity ASCII(4) NULL(BLANKS, ZEROS, '9999'),FILLER(1),l_shipdate DATE('YYYY/MM/DD') NULL(BLANKS, ZEROS, '0000/00/00')

)FROM '/data/sales1.dat', '/data/sales2.dat', '/data/sales3.dat'ON FILE ERROR FINISH. . . . . .

Page 229: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

load-delimited by option

column-spec에각각의컬럼에해당하는분리자를기술하는방법이아니고적재하는테이블의모든컬럼을하나의분리자로표현하는방법입니다.만약분리자가 2 Byte 이상이면옵션에서처리하지못하고 column spec에기술해야합니다.

필드분리자의기본값은콤마이며 row delimited by 옵션과병행하여사용해야합니다

주의해야할점은마지막필드뒤에도필드분리자가있어야하며그뒤에반드시행분리자도포함되어야합니다.

특수문자는다음과같이 16진수로표현가능합니다tab : \x09, newline : \x0a, carriage return : \x0d, null : \x00

예)LOAD TABLE sales(

l_orderkey,l_quantity,l_shipdate

)FROM '/data/sales.dat'DELIMITED BY '|'ROW DELIMITED BY '\n'. . . . . .

Page 230: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

load-row delimited by option

column-spec에마지막 컬럼에해당하는분리자를기술하는방법이아니고적재하는파일의행분리자를옵션으로표현하는방법입니다

문법적으로이옵션을사용해야만기본적으로병렬적재가가능합니다. 만약분리자가 2 Byte 이상이면옵션에서처리하지못하고 column spec에기술해야합니다

주의해야할점은마지막필드뒤에도필드분리자가있어야하며그뒤에반드시행분리자가표현되어야합니다.

특수문자는다음과같이 16진수로표현가능합니다tab : \x09, newline : \x0a, carriage return : \x0d, null : \x00

예)LOAD TABLE sales(

l_orderkey,l_quantity,l_shipdate

)FROM '/data/sales.dat'DELIMITED BY '|'ROW DELIMITED BY '\n'. . . . . .

sales.dat

0001|1000|20031015|0002|2000|20031012|0003|9999|20031015|0004|1000|20031011|………………….

Page 231: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

load-ignore constraint option

선언된 constraint에대한위반이지정된횟수보다많이발생하면적재작업이취소되며지정된횟수보다위반이적게발생하면위반된데이터만적재되지않습니다. 만약각constraint에대한위반횟수를 0으로한다면위반된모든데이터만적재되지않고나머지데이터는적재됩니다.

일반적으로 MESSAGE LOG 절과함께사용되어제약사항이위반된데이터를특정한로그파일에기록하는용도로사용합니다.

대상이되는 constraint 종류는다음과같습니다. CHECK : CHECK constraint에위반되는지여부를점검UNIQUE : 유일성이위반되는지여부를점검NULL : NOT NULL 컬럼에 NULL 데이터가입력되는지여부를점검FOREIGN KEY : 참조무결성을위반하는데이터가입력되는지여부를점검DATA VALUE : 선언된데이터타입에위반되는데이터가입력되는지여부를점검ALL : CHECK, UNIQUE, NULL, FOREIGN KEY, DATA VALUE 모두를포함

예)LOAD TABLE sales………….IGNORE CONSTRAINT NULL 50, UNIQUE 100, ALL 125// 51번이상의 NULL 값위반이발생하거나 101번이상의 UNIQUE 값위반이발생// 하거나조합해서총 126번이상의위반이발생하면적재작업이취소됩니다.

Page 232: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

load-message log option

MESSAGE LOG 파일에는위반된 row, constraint 종류, 컬럼을기록하며 ROW LOG파일에는필드분리자로구분된오류데이터를기록합니다. 물론적재시작시간과종료시간은두파일모두에기록됩니다.

오류데이터의필드분리자는기본값으로콤마를사용하고 LOG DELIMITED BY 옵션에의해다른값으로변경할수있습니다.

ONLY LOG절에표기할수있는항목으로는 CHECK, NULL, UNIQUE, FOREIGN KEY, DATA VALUE, ALL이있으며그내용은 IGNORE CONSTRAINT절과같습니다. 만약생략된다면적재시작시간과종료시간만이 MESSAGE LOG 파일에기록됩니다.

여기서말하는 MESSAGE LOG는 SYBASE IQ의기본적인 IQ message log 와는별도의파일입니다.

MESSAGE LOG나 ROW LOG가이미존재한다면새로기록되는정보는현재기록된정보뒤에추가기록됩니다.

적재작업이끝나면 IQ message log 파일에 constraint 위반횟수와 skip된데이터건수와같은메시지가기록됩니다.

Page 233: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

load-message log option

예)LOAD TABLE sales …………IGNORE CONSTRAINT ALL 0MESSAGE LOG '/log/error_msg.log' ROW LOG '/log/error_data.log'ONLY LOG ALLLOG DELIMITED BY '|'

error_msg.log2002-07-15 15:00:23 Load Table sales: Integrity Constraint Violations1267 DATA VALUE 43126 UNIQUE 13216 NULL 32002-07-15 16:00:10 LOAD TABLE sales Completed

error_data.log2002-07-15 15:00:23 Load Table sales: Integrity Constraint Violations1267 |Mary Smith|56|M|ABCDEFG|1943/03/31|MC|3216 |John Jones|NULL|NULL|S|1945/02/28|NULL…2002-07-15 16:00:10 LOAD TABLE sales Completed

rowid, type, column number

rowid, delimiter, data

Page 234: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

load-etc

WITH CHECKPOINT : 이옵션은적재가끝난후에 CHECKPOINT의실행여부를결정합니다. 이옵션이 on 으로설정되면적재후에메모리상에존재하던데이터들이모두디스크에반영됩니다.

ESCAPSES : 적재대상파일의데이터중에역슬래시뒤에나오는문자를특수문자로인정할지여부를결정하는옵션으로 ASA 에서는 on/off 설정이가능했지만 SYBASE IQ 에서는문법상 off로만설정해야합니다. 이부분을생략하면역슬래시뒤에나오는문자를특수문자로인식하는 on으로설정되며 SYBASE IQ에서는문법상오류가발생합니다

QUOTES : 적재대상파일의데이터중에 quote(') 문자를데이터로인정할지여부를결정하는옵션으로 ASA 에서는 on/off 설정이가능했지만 SYBASE IQ에서는문법상 off로만설정해야합니다. 이부분을생략하면 quote 문자를데이터자체로인정하지않는 on으로설정되며 SYBASE IQ에서는문법상오류가발생합니다.

LIMIT : 입력하기를원하는최대건수를기술할수있으며기본값은 0으로입력건수에대한제약이없습니다. 주로테스트할때많이사용합니다. 이옵션을사용하면단일쓰레드모드로적재작업이진행됩니다.

Page 235: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

load-etc

NOTIFY : 몇건의데이터가적재될때한번씩메시지를로그파일에기록할것인지를기술합니다. 기본값은 100,000 건이며 NOTIFY_MODULUS 라는옵션값이그렇게설정되었기때문입니다.

SKIP : 몇건의데이터를제외하고적재작업을할것인지를기술하며기본값은 0으로모든데이터를적재합니다. 이옵션을사용하면단일쓰레드모드로적재작업이진행됩니다.

START ROW ID : partial width insert 처럼특정몇개컬럼의적재작업을첫번째행부터다시시작합니다. 명령이 LOAD 일뿐기본원리는 INSERT와같습니다. 이옵션을사용하면단일쓰레드모드로적재작업이진행됩니다.

FORMAT : BINARY와 ASCII를선택할수있으며수치데이터값이많으면많을수록BINARY 형태의파일이빠른적재성능을나타냅니다. 또한 BINARY 파일형태의데이터를적재할때각 column 뒤에WITH NULL BYTE 라는옵션을주어 NULL 값에대한처리를기술합니다.

그외 : 매뉴얼을참조하시기바랍니다.

Page 236: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

load-mode

SYBASE IQ의적재작업은두가지모드로진행됩니다. 하나는단일쓰레드모드이고또다른하나는다중쓰레드모드입니다. 일반적으로 SYBASE IQ는각컬럼당 1개의쓰레드와각인덱스당 1개의쓰레드가동시에작업을진행하는다중쓰레드모드에서적재작업을진행합니다.

하지만여러가지이유로단일쓰레드모드로동작할수있으며이렇게동작할때에는적재작업의속도가매우떨어지게됩니다. 이럴때는단일쓰레드모드로동작하는원인을파악하여그원인을제거하고정상적인작업이될수있도록해야합니다.

SYBASE IQ가적재작업을단일쓰레드모드로진행하는대표적인경우는쓰레드의부족, partial width load 작업(컬럼의부족), ROW DELIMITED BY 옵션의생략입니다.

참고1전체쓰레드와관련된옵션으로는엔진을기동할때사용하는 -iqmt라는옵션이있으며이옵션에대한최대설정값은일반적으로 4096 입니다.

참고2connection별쓰레드와관련된옵션은다음과같으며이렇게설정된쓰레드수가적재작업에필요한수를충족하지못하면단일쓰레드모드로적재작업이진행됩니다.

Max_IQ_Threads_Per_Connections Max_IQ_Threads_Per_Teams

Page 237: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

load-message file

100,000 건당걸린시간을표현하며notify option 으로조절가능합니다

SALES_FACT 테이블에 5,000,000건을 103초에적재/완료하였다는메시지입니다

18 개컬럼의 SALES_FACT 라는테이블에full width 적재가시작되며 multi threadmode로동작하고있습니다. (참고 105Byte)

Page 238: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

load-message file

18 개컬럼의 SALES_FACT 라는테이블에partial width 적재가시작되며 single threadmode로동작하고있습니다. (참고 105Byte)즉테이블의컬럼수보다파일의필드수가적어 single thread 적재작업을실행한다는경고메시지입니다

Page 239: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

load-big picture

Main CacheASCII Flat File Load Memory

Temp. Cache

Main IQ Store Temp. IQ Store

Raw IO Buffers

Singlethread

Intermediate Buffers

Multithread

22

11

Write of Completed HG B-trees, G-Arrays and Bitmaps to Main Cache

2

Write of completed HNG, LF and FP Pages to Main IQ Store

1

Write of Completed HG B-trees, G-Arrays and Bitmaps to Main IQ Store

3

33

Single threadper HNG,LF,FP

Single threadper HG

Sorting HG

Paging

Page 240: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

Case study - ASCII

사용되는테이블의레이아웃과데이터의포맷은아래와같습니다.

테이블CREATE TABLE sales_order(

id unsigned integer PRIMARY KEY IQ UNIQUE(648),cust_id unsigned integer NOT NULL IQ UNIQUE(111),order_date datetime NOT NULL IQ UNIQUE(376),fin_code_id char(2) NULL IQ UNIQUE(1),region char(7) NULL IQ UNIQUE(5),sales_rep unsigned integer NOT NULL IQ UNIQUE(75)

);

파일포맷 (sales_order.dat)………2006|105|1994-03-30 00:00:00.000|r1|Central|299|2007|106|1994-03-30 00:00:00.000|r1|Eastern|667|2008|107|1994-04-02 00:00:00.000|r1|Eastern|129|2009|108|1994-04-05 00:00:00.000|r1|Eastern|1142|2010|109|1994-04-06 00:00:00.000|r1|Eastern|195|2011|110|1994-04-07 00:00:00.000|r1|Central|690|2012|111|1994-04-07 00:00:00.000|r1|Eastern|1596|………

Page 241: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

두경우모두가변길이포맷의파일을 ROW DELIMITED BY라는옵션을사용했기때문에다중쓰레드모드로작업이진행되며주의할점은 sales_order.dat라는파일의포맷에서마지막컬럼뒤에도반드시필드분리자 | 가존재해야합니다.

필드분리자가 1 바이트인경우에는 case1, case2 어떤방법도가능하지만필드분리자가 2바이트이상이면반드시 case2 방법으로기술해야합니다.

Case 1) 옵션에서처리LOAD TABLE sales_order(

id,cust_id,order_date,fin_code_id,region,sales_rep

)FROM 'sales_order.dat'QUOTES off ESCAPES offDELIMITED BY '|'ROW DELIMITED BY '\n' ;

Case 2) column-spec 에서처리LOAD TABLE sales_order(

id '|',cust_id '|',order_date '|',fin_code_id '|',region '|',sales_rep '|'

)FROM 'sales_order.dat'QUOTES off ESCAPES off

ROW DELIMITED BY '\n' ;

Page 242: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

두경우모두가변길이포맷을사용하고마지막필드뒤에도필드분리자를사용하였으나처리속도나모드는서로달랐습니다.

case1은 ROW DELIMITED BY라는옵션을사용하여다중쓰레드모드로작업이진행되었고 case2는 column-spec에서 filler로서처리하여단일쓰레드모드로동작하였습니다. 꼭주의하시기바랍니다

Case 1) 옵션에서처리LOAD TABLE sales_order(

id,cust_id,order_date,fin_code_id,region,sales_rep

)FROM 'sales_order.dat'QUOTES off ESCAPES offDELIMITED BY '|'ROW DELIMITED BY '\n' ;

Case 2) column-spec 에서처리LOAD TABLE sales_order(

id,cust_id,order_date,fin_code_id,region,sales_rep,filler('\n')

)FROM 'sales_order.dat'QUOTES off ESCAPES offDELIMITED BY '|';

Page 243: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

\n

두경우모두가변길이포맷을사용하고마지막필드뒤에도필드분리자를사용하였으나\n에대한처리방법이달라 case1은정상처리되고 case2는오류처리됩니다.

\n에대한처리가유닉스와윈도우계열에서달라 ROW DELIMITED BY 에대한값으로\n을윈도우계열에서사용하려면반드시 0x0d0a로기술해야합니다.

Case 1) UNIX에서LOAD TABLE sales_order(

id,cust_id,order_date,fin_code_id,region,sales_rep

)FROM 'sales_order.dat'QUOTES off ESCAPES offDELIMITED BY '|'ROW DELIMITED BY '\n' ; // '0x0a'

Case 2) Win NT 계열에서LOAD TABLE sales_order(

id,cust_id,order_date,fin_code_id,region,sales_rep

)FROM 'sales_order.dat'QUOTES off ESCAPES offDELIMITED BY '|'ROW DELIMITED BY '\n'; // 0x0d0a

Page 244: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

isql

isql로 LOAD 작업을할때 case2 처럼 '\n'으로기술할수없고 case1처럼인용부호없이0x0a로기술해야합니다.

만약 case2처럼 '\n'으로기술하고싶다면 ESCAPE_CHARACTER 옵션값을 On으로설정하고사용하시면됩니다.

Case 1) 정상LOAD TABLE sales_order(

id,cust_id,order_date,fin_code_id,region,sales_rep

)FROM 'sales_order.dat'QUOTES off ESCAPES offDELIMITED BY '|'ROW DELIMITED BY 0x0ago

Case 2) 오류LOAD TABLE sales_order(

id,cust_id,order_date,fin_code_id,region,sales_rep

)FROM 'sales_order.dat'QUOTES off ESCAPES offDELIMITED BY '|'ROW DELIMITED BY '\n'go

Page 245: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

날짜데이터의포맷이 YYYY*MM*DD 형태로저장되었다면 case1의경우처럼추가적인변환과정의기술없이자동으로내부적으로변환되어적재됩니다. 단여기서 *는 1 바이트의분리기호이며두경우모두다중쓰레드모드로동작됩니다.

날짜데이터포맷이 YYYY*MM*DD 형태가아니라면 case2처럼 column-spec에그포맷을명시해야하기때문에 DELIMITED BY 옵션을사용할수없습니다.단, Date_Order 옵션이 YMD인경우에만적용됩니다.

Case 1) 자동으로변환되는경우LOAD TABLE sales_order(

id,cust_id,order_date,fin_code_id,region,sales_rep

)FROM 'sales_order.dat'QUOTES off ESCAPES offDELIMITED BY '|'ROW DELIMITED BY '\n';

Case 2) 수동으로변환되는경우LOAD TABLE sales_order(

id '|',cust_id '|',order_date datetime('MM-DD-

YYYY hh:mm:ss.sss', filler(1),fin_code_id '|',region '|',sales_rep '|'

)FROM 'sales_order.dat'QUOTES off ESCAPES offROW DELIMITED BY '\n';

Page 246: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

Case study - Binary

바이너리포맷의데이터를생성하는툴및방법에따라여러가지다양한경우가발생할수있겠지만아래의예제는 SYBASE IQ의 sales_order라는테이블을바이너리포맷으로추출한데이터를적재작업에사용하였습니다.

SYBASE IQ의추출방법을가지고생성된데이터는각필드뒤에 1 바이트의 NULL 값이원래데이터뒤에첨가됩니다. 이 NULL 값을어떻게처리해줄것인지를 LOAD 명령어에적절히기술하면됩니다.

바이너리데이터생성set temporary option Temp_Extract_Name1='sales_order.bin';set temporary option Temp_Extract_Binary='On';select * from sales_order;set temporary option Temp_Extract_Name1='';

Page 247: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

filler vs.

Case 1) filler로처리하는경우LOAD TABLE sales_order(

id ,filler(1),cust_id ,filler(1),order_date ,filler(1),fin_code_id ASCII(2),filler(1),region ASCII(7),filler(1),sales_rep ,filler(1)

)FROM 'sales_order.bin'QUOTES off ESCAPES offFORMAT 'binary';

Case 2) 옵션으로처리하는경우LOAD TABLE sales_order(

id binary with null byte,cust_id binary with null byte,order_date binary with null byte,fin_code_id binary with null byte,region binary with null byte,sales_rep binary with null byte

)FROM 'sales_order.bin'QUOTES off ESCAPES offFORMAT 'binary';

Page 248: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

load-

Number of bytes (512) for a column from an input file has exceeded the maximum allowed

원인 : 일반적으로테이블의컬럼수와데이터파일의필드수가서로다른경우에발생

원인 : 논리적으로는필드수와컬럼수는같으나필드의데이터중간에필드분리자가존재하여실질적으로는컬럼수와필드수가서로달라발생

원인 : 데이터파일에특수문자가결합하여불완전한레코드를이루어읽을수없는경우도 있습니다. 이럴 경우는 Ultra Edit와 같은 편집기를 이용하여 16진수로 데이터를 변경하여확인해보면발견할수있습니다.

Missing row delimiter detected during a row delimited insert

원인 : 마지막필드라고생각하여행분리자를예상하고있는데행분리자가아닌다른문자를발견한경우에발생

원인 : 주로파일의필드수가테이블의컬럼수보다많은경우발생

원인 : 논리적으로는필드수와컬럼수는같으나필드의데이터중간에행분리자가존재하여실질적으로는컬럼수와필드수가서로달라발생

Page 249: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

load-

Expected 'column' delimited column type on input, but encountered a row delimiter instead. Probable cause is a mismatch between the specified column delimiter and the column delimiter used in the input file

원인 : 데이터파일의어떤필드값을읽고필드분리자를찾으려고했으나행분리자를만난 경우로서 특정 레코드에 필드 분리자가 부족한 경우에 발생하거나 마지막 필드 뒤에필드분리자없이곧바로행분리자가나오는경우발생

Cannot convert 12345678912 to a int(4) (column col1)

원인 : col1 컬럼에 들어갈 데이터 파일의 필드 값이 integer가 표현할 수 있는 값보다 커서 Overflow된경우에발생

Cannot convert to a int(4) (column col1)

col1 컬럼에들어갈데이터파일의필드값이 Integer가아닌경우발생

이경우는해당레코드의앞부분이나이전레코드에서밀리거나당겨진경우에발생

Page 250: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

load-tip

데이터적재작업전에테이블에필요한인덱스를미리생성하시고한테이블에 HG 인덱스가너무많다면파티션을고려해보세요.

테이블의컬럼수와적재대상파일의필드수를반드시일치하십시오.

가능하다면대상파일의포맷은수치데이터가많으면많을수록 BINARY 로하시고ASCII로하실경우에도고정길이형태로사용하십시오.

만약고정길이형태만을사용할수없다면고정길이와변동길이등을혼합하여사용하지말고차라리필드의분리자를사용하는변동길이형태를사용하십시오. 이때에마지막필드에도컬럼분리자를사용하여주십시오.

각컬럼의 column-spec에 NULL( ) 옵션을사용하여 NULL 데이터에대한정의를기술하십시오. 일종의데이터클린징로직이될수있습니다.

적재중잘못된데이터에대한추후점검을위해 IGNORE CONSTRAINT 옵션과MESSAGE LOG 옵션을사용하십시오.

적재작업을진행하면message log 파일을참조하여정상적으로데이터를들어가고있는지확인하여주십시오.

적재작업은가능하면사용자수가적은시간을고려하여실행하고사용자가많은경우에도가능하다면적재후에각사용자의재접속을지시하십시오.

Page 251: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

client-side extract

sam파일데이터를테이블로적재하는방법의반대로테이블의데이터를 sam파일형태로추출하는방식을말하며 UNLOAD, EXPORT라고도합니다. 이렇게저장된데이터는또다른시스템으로의이동및백업용도로도사용가능합니다.

추출되는 sam파일의위치에따라 CLIENT-SIDE EXTRACT과 SERVER-SIDE EXTRACT로나눌수있습니다. 방법에따라적용되는옵션과출력가능한파일포맷등이다르므로주의하시기바랍니다.

CLIENT-SIDE EXTRACT에사용하는툴은 dbisql제품에국한된내용입니다. 혹시클라이언트로다른툴을사용하시면해당툴의매뉴얼을참조하세요.

추출되는파일의형태는 ASCII,dBaseII, dBaseIII, Excel, Fixed, FoxPro, HTML, Lotus 1-2-3, XML 등다양하지만대량의데이터를추출할때는 SERVER-SIDE EXTRACT를권장합니다.

CHAR형데이터타입은데이터여부에관계없이정의된바이트만큼 SPACE가뒤에채워지고 VARCHAR를포함한그외의데이터타입은입력된데이터만큼만추출됩니다

syntaxselect-statement ># | >& | >># | >>& file-name

># : 신규파일에데이터출력 (>>#은 append mode)>& : 신규파일에데이터와건수등과같은메시지출력 (>>&은 append mode)

Page 252: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

client-side extract-option

ISQL_Escape_Character추출되는데이터중에 \n과같은문자를출력할때이를표시하는 Escape Character 로기본값은 \입니다. ASCII 포맷일때만효력이발생하며 \n에대한기본설정의값은 \x0A입니다. 옵션의변경은툴에존재하는옵션메뉴를선택해도되고 SET OPTION 명령어를사용해도됩니다.

ISQL_Field_SeparatorASCII 형태로추출되는파일에한해적용이가능하고필드의분리자를설정합니다. 기본값은콤마(,)이며주의할점은마지막컬럼에는필드분리자가없다는것입니다.

ISQL_QuoteASCII 형태로추출되는파일에한해적용이가능하고문자형데이터의시작과끝을묶어주는역할을하며기본값은 ' 입니다.

Output_Format추출되는파일의형태를선택할수있으며 ASCII,dBaseII, dBaseIII, Excel, Fixed, FoxPro, HTML, Lotus 1-2-3, XML중에서선택가능하며기본값은 ASCII 입니다.

Output_LengthASCII, HTML 형태로추출되는파일에한해적용가능하고필드의추출최대자리수를선택할수있습니다. 기본값은 0으로제한이없습니다.

Page 253: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

client-side extract-option

Output_NULLSASCII, HTML 형태로추출되는파일에한해적용가능하고 NULL 값에대한표현형태를선택합니다. 기본값은 'NULL'로데이터타입에관계없이문자 NULL로추출됩니다.

예)set temporary option Output_Format = 'ASCII';set temporary option Output_Length = 0;set temporary option Output_Nulls = '';set temporary option ISQL_Field_Separator = '|';

SELECT * FROM employee># c:\data\My_emp.dat // 주의 : 파일이름에 '이나 "이없음

Page 254: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

server-side extract

SYBASE IQ의 EXTRACT 방법은무척간단하며많은확장성을가지고있습니다. 먼저여러가지옵션을설정한후에 SELECT문을실행합니다. 그러면화면에출력되던혹은클라이언트에게보내지던 SELECT문의결과가옵션에서정한형태와이름을가지고추출됩니다. 단, 출력은 SYBASE IQ의서버모듈이존재하는곳에서만가능합니다.

SELECT문뒤에옵션을취소시키거나옵션을임시적으로설정하지않았다면해당사용자의모든질의는선언된파일로추출되므로특별한목적이없다면 temporary option 사용하기를권장합니다.

CHAR형데이터타입은데이터여부에관계없이정의된바이트만큼 SPACE가뒤에채워지고 VARCHAR를포함한그외의데이터타입은입력된데이터만큼만추출됩니다

추출되는파일의형태는 ASCII, BINARY, BINARY/SWAP로옵션설정에따라달라질수있으며최대 8개까지의파일로추출할수있습니다.

추출될데이터는 IQ 영역에포함된데이터만가능하며시스템테이블, 시스템테이블과의조인, 사용자정의함수를사용한질의에대한데이터추출은불가능합니다.

만약병렬로데이터를추출하고싶다면WHERE 절의조건을바꾼질의를여러개실행해주면되며추출가능한파일타입은파일시스템상의일반파일과 FIFO 파일입니다.

Page 255: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

server-side extract

syntax SET TEMPORARY OPTION Temp_Extract_Name1 = '…./…./….'; // 추출모드시작SET TEMPORARY OPTION . . . . . . ;SET TEMPORARY OPTION . . . . . . ;select-statement;

SET TEMPORARY OPTION Temp_Extract_Name1 = ''; // 추출모드해제

Page 256: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

server-side extract-option

Temp_Extract_NameN추출하는파일에대한이름과경로를지정합니다. 여기서 N은 1,2,3,4,5,6,7,8이며Temp_Extract_SizeN옵션과같이사용하여한파일시스템에수용하기어려운파일도여러개의파일로나눠서저장할수있습니다.단, 여러개의파일로나눠서저장할때에도파일별로병렬로처리되는것이아니라직렬로진행됨을주의하십시오. 또한Temp_Extract_Name1이설정되면대상테이블의 LOAD, DELETE, INSERT 명령어를실행할수없습니다.

Temp_Extract_SizeN추출하는대상파일의최대크기를 KB 단위로지정하며그크기는 AIX & HP-UX인경우64GB, Sun Solaris인경우 512GB, Window, Linux인경우 128GB 까지입니다.

Temp_Extract_Column_Delimiter추출되는각필드에대한구분자를지정하며디폴트는콤마(,) 입니다. 만약옵션값이empty string('')일때는고정길이파일이생성됩니다.

Temp_Extract_Row_Delimiter추출되는각행에대한구분자를지정하며디폴트는유닉스에서는 '\n' ('0x0a') 이며윈도우에서는 '0x0d0a' 입니다.

Page 257: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

server-side extract-option

Temp_Extract_Binary설정값이 on일경우추출되는파일의형태를바이너리형태로설정합니다.

Temp_Extract_Swap설정값이 on일경우추출되는파일의형태를 binary swap 형태로설정합니다. 단, 선행되어야할조건으로 Temp_Extract_Binary이 on 으로설정되어야합니다. 다른 Endian을사용하는시스템에데이터를이동할목적으로추출할때사용합니다.

Temp_Extract_Null_As_ZeroASCII 형태로추출할때 NULL 값에대한표현을어떻게처리할지를결정하며 on으로설정되면 NULL 값에대한데이터를숫자타입은 0으로문자타입이나날짜계열의타입은empty string ('')으로변환하며 off일경우는데이터타입에관계없이문자열 'NULL'로출력합니다. 기본값은 off 이며만약기본값으로설정하고추출한파일을다시 LOAD할때주의하시기바랍니다.

Temp_Extract_Null_As_Empty이옵션이 on으로설정되면숫자타입도 empty string('')으로처리한다는사항을제외하고 Temp_Extract_Null_As_Zero 옵션과같습니다. Temp_Extract_Null_As_Zero 와Temp_Extract_Null_As_Empty 모두 on 으로설정된다면전자옵션에따라숫자는 0, 문자와날짜는 empty string('')으로처리합니다.

Page 258: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

: Endian

Endian이란?엔디안이란컴퓨터에서데이터가저장되는순서를말하는것입니다. 컴퓨터에서데이터저장은여러분도잘아시다시피 byte 단위로저장이됩니다. 그런데이단위저장을할때각 CPU 제조업체에따라서저장이되는순서가서로다릅니다. 예를들어우리가자주사용하는 32bit 정수의경우한번에 4byte 의데이터가저장이되는데, 이때가장낮은바이트부터저장을하는방식이있고, 가장높은바이트부터저장을하는방식이존재합니다. 전자를 Little Endian이라고하며, 후자를 Big Endian이라고합니다.

Little Endian을적용하는가장대표적인 CPU는 Intel 계열 CPU 이며Big Endian을적용하는가장대표적인 CPU 는 Sparc계열 CPU 입니다

Page 259: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

server-side extract-option

Temp_Extract_Append설정값이 on일경우이미존재하는파일의뒤에첨삭하여추출되며만약파일이존재하지않는다면새로운파일이만들어집니다.

Temp_Extract_QuoteTemp_Extract_Quotes, Temp_Extract_Quotes_All과함께사용되며이두가지옵션중에하나라도 on 으로설정되면컬럼데이터의양쪽을여기서설정한기호로감싸줍니다. 단, 추출되는파일형태가 ASCII 일경우만유효합니다.

Temp_Extract_Quotes이옵션이 on으로설정된다면추출할때테이블의컬럼중문자나날짜형태의데이터를각필드의시작과끝양쪽에 Temp_Extract_Quote에서설정한기호로감싸줍니다. Temp_Extract_Quote 옵션을따로설정하지않았다면 ' 가사용됩니다.

Temp_Extract_Quote_All이옵션이 on으로설정된다면추출할때테이블의컬럼중문자나날짜형태의데이터뿐만아니라모든데이터를각필드의시작과끝양쪽에 Temp_Extract_Quote에서설정한기호로감싸줍니다. Temp_Extract_Quote 옵션을따로설정하지않았다면 ' 가사용됩니다.

Page 260: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

server-side extract-option

Temp_Extract_Directorysam파일로의데이터추출할수있는 extract 기능의사용을제어할수있습니다. 특정사용자를위한값이 FORBIDDEN으로설정되면대상사용자는 extract 기능을수행할수없습니다.기본설정값은 empty string('')으로모든사용자에게추출기능을허용하고있습니다.

Page 261: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

server-side extract-example

예)SET TEMPORARY OPTION Temp_Extract_Name1 = '/data/orders1.dat';SET TEMPORARY OPTION Temp_Extract_Name2 = '/data/orders2.dat';SET TEMPORARY OPTION Temp_Extract_Name3 = ''; // 중요SET TEMPORARY OPTION Temp_Extract_Size1 = '1024000';SET TEMPORARY OPTION Temp_Extract_Size2 = '1024000';SET TEMPORARY OPTION Temp_Extract_Delimiter = '|' ;SET TEMPORARY OPTION Temp_Extract_Row_Delimiter = '\n' ;SET TEMPORARY OPTION Temp_Extract_Null_As_Zero = 'on' ;

SELECT * FROM orders ;SET TEMPORARY OPTION Temp_Extract_Name1 = ''; // 추출모드해제

orders 테이블을 1,024,000KB 크기의두개의파일에나누어서 UNLOAD 하는데파일은| 로필드분리되었으며레코드분리자는 \n 입니다. 또한출력데이터중숫자컬럼의NULL 값은 0으로, 문자/날짜컬럼의 NULL 값은 empty string('') 으로표현됩니다.

만약만약 TEMPORARY TEMPORARY 옵션이옵션이 생략되었다면생략되었다면 어떤어떤 일이일이 일어날까요일어날까요??

Page 262: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

Transaction, Versioning and Etc.

Page 263: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

transaction

단일사건으로처리되어야하며발생되어진변경사항을영구적으로데이터베이스에게반영시켜줍니다. 오직 COMMIT 되거나 ROLLBACK 될수있습니다.

autocommit mode (unchained mode)개별적인 INSERT, UPDATE, DELETE, SELECT를개별트랜잭션으로처리합니다. 만약여러개의 statement를한트랜잭션으로묶으려면명시적으로 BEGIN TRAN과COMMIT(혹은 ROLLBACK)으로트랜잭션의처음과끝을지정해주어야합니다.ASE와 isql의기본적인트랜잭션모드입니다.

manual commit mode (chained mode)서버와연결혹은또다른트랜잭션이종료됨과동시에 BEGIN TRAN이암시적으로수행됩니다.사용자가명시적으로트랜잭션의 COMMIT을통해종료를나타내주어야합니다.ANSI 표준, SYBASE IQ, ASA, dbisql의디폴트트랜잭션모드입니다.

Chained 라는옵션을통해트랜잭션모드를변경할수있습니다SET [TEMPORARY] OPTION Chained = 'off'; // unchained modeSET [TEMPORARY] OPTION Chained = 'on'; // chained mode

Page 264: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

transaction command

BEGIN TRANSACTION : unchained mode에서사용자가임의로정의하는트랜잭션의시작을표시합니다.BEGIN TRAN[SACTION] [transaction-name];

COMMIT : 트랜잭션의종료를표시하며데이터베이스의변경사항을취소없이영원히반영합니다COMMIT [WORK];

ROLLBACK : 트랜잭션의종료를표시하며이전의발생된변경사항을취소합니다ROLLBACK [WORK];

SAVEPOINT : 현재의트랜잭션에 breakpoint를만들어줍니다SAVEPOINT [savepoint-name];

ROLLBACK TO SAVEPOINT : SAVEPOINT 이후의변경사항만취소합니다.ROLLBACK TO SAVEPOINT [savepoint-name];

CHECKPOINT : 메모리내의변경사항을디스크에반영합니다.CHECKPOINT;

Page 265: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

option

Auto_Commit : Interactive SQL 혹은 dbisql과같은 SYBASE IQ의기본클라이언트에서만동작하는옵션으로모든명령실행후에묵시적으로 COMMIT의실행여부를조절합니다. 기본값은 off로자동으로 COMMIT을하지않습니다. 단, on으로설정할때compound statement, batch 뒤에서 COMMIT 실행합니다.SET [TEMPORARY] OPTION Auto_Commit = 'off';

Chained : chained 모드와 unchained 모드의변경을조절하며기본값은 on, 즉chained 모드입니다. 이옵션에대한각클라이언트툴의기본값을점검하십시오.SET [TEMPORARY] OPTION Chained = 'on';

Commit_On_Exit : Interactive SQL, dbisql과같은 SYBASE IQ의기본클라이언트에서만동작하는옵션으로툴종료시 COMMIT의실행여부를조절합니다. 기본값은 on, 즉툴종료시자동으로 COMMIT을실핼합니다. 각클라이언트툴에서의지원여부를점검하십시오.SET [TEMPORARY] OPTION Commit_on_exit = 'on';

AutoPreCommit : 이옵션은다른옵션과달리 ODBC 환경파일에저장하는connection level 옵션이며모든명령어전에 COMMIT의실행여부를조절합니다. 기본값은 off 즉자동으로 COMMIT하지않으며 Interactive SQL, dbisql과같은 SYBASE IQ의기본클라이언트에서는동작하지않습니다.

Page 266: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

transaction

Auto_Commit Chained 내용 Rollback 비고

O

X

compound statement

on, off offupdate test set a = 1;rollback;

X

on, off onupdate test set a = 1rollback;

O

1 statement per 1 batch

2 statement per 1 batch

X

O

on, off offupdate test set a = 1rollback;

X

on, off on

BEGINupdate test set a = 1;rollback;

END;

on, off off

BEGINupdate test set a = 1;rollback;

END;

on onupdate test set a = 1;rollback;

off onupdate test set a = 1;rollback;

Commit이실행되는시점

Page 267: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

snapshot versioning

SYBASE IQ의테이블에대한변경을관리하기위한방법으로 table-level versioning이라고도합니다.

ANSI isolation level 3을지원하며읽고있는동안에도쓸수있는기능을제공합니다. 특정한시점에하나의테이블에대해쓸수있는사용자는 SYBASE IQ에의해자동으로1명으로제한되며조절불가능합니다.

어떤테이블이수정되어지면그페이지들의이전데이터들은그대로남겨두고새로운페이지에새로운데이터들이쓰여지며각페이지헤더에는 blockmap이라는버전정보를보관하는데이터구조가있습니다. 그래서이전페이지의 blockmap에는이전버전이새로운페이지의 blockmap에는새로운버전이저장됩니다.

이전버전들은더이상이전데이터를보는사용자가존재하지않으면삭제되며이런버전관리가다른 RDBMS에서의 log와비슷합니다.

사용자가현재버전의테이블내용을보고싶으면먼저 COMMIT을실행시키고질의를하시면됩니다. 즉 SYBASE IQ의 COMMIT에는두가지의의미가있습니다.

Page 268: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

versioning example

t1 시점에 User1, User2는 customer,order, product 테이블로부터데이터를조회합니다.

customer(v1)

order(v1)

product(v1)

ReadUser 1

ReadUser 2

t1 t2 t3 t4 t5

Page 269: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

versioning example

t2 시점에 write user가들어와서 customer 테이블을수정하고있으며같은시간에다른사용자들은아직도여전히 customer,order,product 테이블을조회하고있습니다.

customer(v1)

order(v1)

product(v1)

ReadUser 1

ReadUser 2

t1 t2 t3 t4 t5

customer(v2)

WriteUser

Page 270: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

versioning example

t3 시점에 write user의 customer 테이블에대한수정이 COMMIT 되었습니다. 같은시간에다른사용자들은아직도여전히 customer,order,product 테이블의원래버전을조회하고있습니다.

customer(v1)

order(v1)

product(v1)

ReadUser 1

ReadUser 2

t1 t2 t3 t4 t5

customer(v2)

WriteUser

Page 271: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

versioning example

t4 시점에 User 3이 login 해서 customer 테이블의새버전과 order, product의원래버전을조회하고있습니다. 같은시간에다른사용자들은아직도여전히 customer, order, product 테이블의원래버전을조회하고있습니다.

order(v1)

product(v1)

ReadUser 1

ReadUser 2

t1 t2 t3 t4 t5

customer(v2)

ReadUser 3

Page 272: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

versioning example

t5 시점에 User 1, User 2가 COMMIT을수행하거나아니면재접속하여새로운버전의customer 테이블과원래버전의 order, product 테이블을읽고있습니다. 이시점에customer의원래버전은삭제됩니다.

order(v1)

product(v1)

ReadUser 1

ReadUser 2

t1 t2 t3 t4 t5

customer(v2)

ReadUser 3

Page 273: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

재연Interactive SQL Classic을이용하여 A,B 두개의세션을동시에연결합니다A 세션에서기존테이블 sample에컬럼을하나더추가합니다B 세션에서 A세션에서만든 sample 테이블을조회합니다참고 : B세션에서접속한후에처음조회를한다면이때는 versioning이없습니다두세션모두 Auto_Commit 옵션이 off로설정되었다고가정합니다.두세션모두 Chained 옵션이 on로설정되었다고가정합니다

해결방법이문제는 SYBASE IQ의 versioning과관련한문제로 B 세션의연결시점에 혹은마지막 COMMIT를실행한후에 sample이라는테이블은없었습니다. 이시점에 B 세션에서COMMIT을실행하면 B 세션에서도 sample 이라는테이블을액세스할수있습니다.

Page 274: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

재연Interactive SQL Classic을이용하여 A,B 두개의세션을동시에연결합니다A 세션에서 sample 테이블을 SELECT 하고그냥그상태를유지합니다B 세션에서 sample 테이블을 DROP 하거나 ALTER 합니다.두세션모두 Auto_Commit 옵션이 off로설정되었다고가정합니다.두세션모두 Chained 옵션이 on로설정되었다고가정합니다

해결방법이것은 SYBASE IQ의 locking 메카니즘때문에발생합니다. Chained 모드에서 A 세션에서 sample 테이블을 SELECT 하고있는상태는트랜잭션이시작된상태이며Auto_Commit 옵션이 off 이고 chanined모드이기때문에아직트랜잭션은종료되지않았습니다. SYBASE IQ는 isolation 3레벨의테이블단위의 locking을지원하기때문에한트랜잭션에서사용된모든테이블은 shared lock이그트랜잭션동안계속유지됩니다. 결과적으로트랜잭션을종료하면 shared lock이풀리기때문에 A 세션에서트랜잭션을종료하는 commit을실행하면 locking문제는해결됩니다.

Page 275: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

재연Interactive SQL Classic을이용하여 A,B 두개의세션을동시에연결합니다A 세션에서 sample 테이블을 SELECT하고 COMMIT를실행합니다. B 세션에서 sample 테이블을 DROP 하거나 ALTER 합니다두세션모두 Auto_Commit 옵션이 off로설정되었다고가정합니다.두세션모두 Chained 옵션이 on로설정되었다고가정합니다

해결방법이것은 Interactive SQL Classic 클라이언트툴의커서방식프로그램기법때문에발생하는현상으로 A세션에서 SELECT한후에 COMMIT을실행하면잠긴 sample 테이블에lock 현상은종료가되나 sample 테이블에대한 point를계속해서유지하기위해커서가열려있습니다. 이커서를종료하기위해서는 A 세션에서 RESUME 명령어를사용하거나아니면다른 SELECT를사용하면됩니다.혹은 A 세션을종료한후다시연결하면됩니다. 근본적으로는 Interactive SQL Java로클라이언트툴을변경하시면됩니다.

Page 276: Fast track to SYBASE IQ - cfs4.tistory.comcfs4.tistory.com/upload_control/...track_to_SYBASE_IQ.pdf · Sybase RDBMS Sybase가제

Transaction Tip

READ 사용자와WRITE 사용자를분리하여생성하고WRITE 작업은가능하면 READ 사용자가없는시간에수행합니다.

READ 사용자는 READ 명령전후에 COMMIT 을실행합니다.dbisqlc을사용하는 READ 사용자는 Auto_Commit='On' 으로변경합니다OLAP Tool을포함한 ODBC 환경에서는 AutoPreCommit='Y'로변경하고각질의뒤에 OLAP Tool 의후처리기능을이용하여 COMMIT을실행합니다 (단, dbisqlc는위조건에서제외됩니다)그외 isql과같은 OCDK 환경의 READ 사용자는디폴트상태로사용합니다.

위와같이사용하면 versioning과 transaction으로부터발생하는개발부작용을최소화시킬수있습니다