레이블이 오라클 물리뷰인 게시물을 표시합니다. 모든 게시물 표시
레이블이 오라클 물리뷰인 게시물을 표시합니다. 모든 게시물 표시

2013년 10월 23일 수요일

오라클 테이블 단편화(행이행, 행연쇄) 체크 (Oracle Table chain )

오라클 테이블 단편화(행이행, 행연쇄) 체크 (Oracle Table chain )



블록사이즈가 4K인데 레코드의 한행이 4K이상이라면 여러 블럭에 나누어 저장되게 되는데 이를
행연쇄 라고 하구요, 처음 insert문에서 입력되는 데이터는 작았는데 추후 많은 량의 데이터로 update
하게되어 해당 불록에 다 기록할 수 없어 다른 블록에 기록할 수 있는 데 이를 행이동 이라고 합니다.

행이행의 경우 원래의 블록에 새로운 블록을 가리키는 포인터를 두며 갱신전 데이터가 있는 영역은 사용하지 못하게 됩니다. 이 처럼 재이용되지 못하는 영역이 생기는 것을 단편화라고 하며 이를 확인하는 방법은 다음과 같습니다.

먼저 Analyze를 이용하여 통계 데이터를 추출 합니다.

SQL>analyze table emp compute statistics


행이행과 행연쇄가 있는지 조사 합니다. 아래에서 chain_cnt 값은 행이행이나 행연쇄로 인해
여러 블록으로 쪼개져 있는 행의 수를 의미합니다.

SQL> SELECT table_name, num_rows, blocks, empty_blocks, avg_space, chain_cnt
        FROM    dba_table
        WHERE chain_cnt > 0; 

[닷넷4.0, ADO.NET]OleDB Oracle을 이용한 grid select, insert예제 OleDB 공급자를 이용하여 오라클 데이터베이스에 접속했으며 EMP 테이블의 데이터를 읽어 그리드에 채우는 간단한 예제다.

[닷넷4.0, ADO.NET]OleDB Oracle을 이용한 grid select, insert예제
 
OleDB 공급자를 이용하여 오라클 데이터베이스에 접속했으며 EMP 테이블의 데이터를 읽어 그리드에 채우는 간단한 예제다.
 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        OleDbConnection conn = null;
        OleDbDataAdapter adapter = null;
        DataSet ds = null;
        
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                ds = new DataSet("emp");
//아래 onj는 $ORACLE_HOME/network/admin에 있는 tnsnames.ora 파일에 정의된 이름!
   string conStr = "Provider=MSDAORA;data source=onj;User ID=scott;Password=tiger";
   conn = new OleDbConnection(conStr);
                conn.Open();
                adapter = new OleDbDataAdapter("select * from emp", conn);
                adapter.Fill(ds);
                dataGridView1.DataSource = ds.Tables[0];
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "emp Table Loading Error");
            }
            finally        {
                conn.Close();
            }
        }
    }
}
new라는 클래스 Constructor 키워드를 사용하여, .NET Framework에서 제공하는 클래스 중의 'OleDbConnection'의 인스턴스를 만들면서 string타입의 파라미터(Parameter)를 취다. 그 stirng(접속 문자열)은 바로 윗줄에서 선언 되고 값이 주어졌다. 마지막에는 인스턴스인 Connection의 원래클래스, 즉 OleDbConnection이 멤버로 포함하고 있는 메쏘드 중의 대표적인 Open()을 호출하여 DataBase와 연결을 설정하고 연결을 얻음. 그런다음 어댑터를 하나 만들어 "select" 명령을 실행 시킨 결과 DataSet으로 fill 시키고  DataGrid의 Datasource로 ds.Tables[0]을 지정했다.
 
 
[간단한 입력 예제, 오라클 scott계정의 EMP Table에 한건의 데이터를 간단히 입력]
 
public partial class Form1 : Form
    {
        OleDbConnection conn = null;
        OleDbDataAdapter adapter = null;
        DataSet ds = null;
        
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                ds = new DataSet("emp");
                //아래 onj는 $ORACLE_HOME/network/admin에 있는 tnsnames.ora 파일에 정의된 이름!
                string conStr = "Provider=MSDAORA;data source=onj;User ID=scott;Password=tiger";
                conn = new OleDbConnection(conStr);
                conn.Open();
                OleDbCommand command = new OleDbCommand("insert into emp(empno, ename) values(777, '오라클자바')", conn);
                command.ExecuteNonQuery();
                adapter = new OleDbDataAdapter("select * from emp where ename='오라클자바'", conn);
                adapter.Fill(ds);
                dataGridView1.DataSource = ds.Tables[0];
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "emp Table Loading Error");
            }
            finally
            {
                conn.Close();
            }

        }
    }

오라클자바커뮤니티에서 설립한 개발자교육6년차 오엔제이프로그래밍 실무교육센터(오라클SQL,튜닝,힌트,자바프레임워크,안드로이드,아이폰,닷넷 실무개발강의)  



[개강확정강좌]오라클자바커뮤니티에서 운영하는 개발자 전문교육 ,개인80%환급(www.onjprogramming.co.kr)




[해당 카테고리로 이동합니다]

2013년 8월 4일 일요일

Oracle View...(오라클 뷰)

A. . 정의
- View는 하나 이상의 Table또는 다른 View에 포함된 데이터를 원하는대로 나타낸 것
- View는 내장질의또는 가상 Table등으로 표현할수 있다.
- View는 Table에서 파생되므로 둘사이에는 많은 유사성이 있다. 예를들어 Table과 같이 최대
254개의 Column이 있는 View를 정의할수 있고 뷰를 질의하고 몇가지 제한 사항을 사용하여 뷰를
갱신,삽입,삭제를 할수있다.  뷰에대해 수행되는 모든 작업은 뷰의 기본 Table에 있는 Data에
실제 영향을 주며 기본 Table의 무결성 제약조건과 트리거를 따른다.
- 뷰에는 저장영역이 할당되지 않으며 실제로 Data를 포함하지도 않는다.
B. 처리방법
- Oracle은 View를 정의하는 질의 Text를 Data Dictionary(user_views)에 저장한다,
- Oracle은 기존공유 SQL영역에 동일한 멸령이 들어있지 않을때만 새로운 공유 SQL영역에 뷰를
참조하는 명령문을 Parsing합니다. 따라서 뷰를 사용시 공유 SQL영역과 관련하여 메모리 사용이
감소하는 이익이 있다.
- Oracle은 원래 질의를 뷰정의 질의와 병합할 때 원래 뷰를 변형하여 뷰에 대한 질의에 인덱스를
사용할지를 결정한다.

Create view emp_view as
    Select emp_no, ename, sal, loc
    From emp
    Where emp.deptno = dept.deptno
    And dept.deptno = 10;

<사용자 Query>
select ename from emp_view
where empno = 9876;


select ename
from emp, dept
where emp.deptno = dept.deptno
and  dept.deptno = 10
and  emp.empno = 9876;

Oracle은 가능한 모든 경우에 뷰에대한 질의를 뷰정의 질의 및 기본뷰 질의와 병합한다. 또한 뷰를
참조하지않고 질의를 발생하는 것 처럼 병합된 질의를 최적화한다.
따라서 Column이 뷰 정의 또는 뷰에대한 사용자정의에서 참조되는지의 여부에 관계없이 모든 참조된
기본 Table의 Column에 대한 Index를 사용한다.
만약 뷰에대한 정의와 사용자 질의를 병합할수 없다면 Index를 사용하지 않을수 있다.

C. 갱신가능한 Join View
- Join View란 From절에 하나이상의 Table또는 View를 가지며, Distinct, group by, start with,
connect by, rownum, union all, intersect, for update등의 절에서는 사용하지 않는다.

- 갱신가능한 Join View는 둘이상의 기본 Table 및 View를 포함하며 Update/Insert/Delete등의
작업이 가능하다.

- Dictionary View인 all_updatable_columns,윰_updatable_columns, user_updatable_colums
에는 갱신가능한 View의 Column을 나타낸다.

- Join View에 대한 Insert/Update/Delete등의 작업은 한번에 하나의 기본 Table에서만 가능하며,
With Check Option을 사용하여 View를 정의하는 경우에는 반복된 Table의 모든 Join Column과 모
든 Column은 갱신할수 없으며, Insert명령문은 허용되지 않는다.또한 with Check Option을
사용하여 뷰를 정의하고 키예약 Table이 반복되는 경우에는 뷰에서 행을 삭제할수 없다.

D. View생성
 - Create View명령을 사용한다.
예] create view sales_staff as
      select empno, ename, deptno
      from emp
      where deptno =10
      with check option constraint sales_staff_cnst;

    위에서 check option은 뷰가 선택할수 없는 행에 대해서는 Insert와 Update명령문이
    실행되지 않는다는 제약 조건을 갖는다.
    만약 위의 View에 deptno가 30인 행을 Insert하려고 하면 RollBack되고 오류가 발
    생한다.
E. View수정하기
위에서 만든 staff View를 재정의 하는경우
create or replace view sales_staff_view as
      select empno, ename, deptno
      from emp
      where deptno =30
      with check option constraint sales_staff_cnst;
F. View의 삭제
 - drop view sales_staff_view; 

[출처] 오라클자바커뮤니티, 오엔제이프로그래밍