Wednesday, June 19, 2013

Out of box: Oracle proxy user with ADF Application

I was facing long time with oracle proxy user and ADF application module problem. Therefore, i need to share how i resolved that problem. Main purpose of that proxy connection: We need to audit user action in oracle database side (audit trail).

Problem: I have an implemented Oracle Proxy User connection into Application Module. Same as this (https://blogs.oracle.com/imc/entry/how_to_use_database_proxy). But after i implemented, there is coming one strange problem with application module session. It means, Our application module always replicated by different session and connection.

Solution: First of all, many thanks for Vijai, who is helped me on Oracle Forum.
This is our piece of code for Proxy Connection in the Application Module implementation class:


    @Override
    protected void prepareSession(Session session) {
        String username =
            ADFContext.getCurrent().getSecurityContext().getUserName().toUpperCase();

        Statement st =
            getDBTransaction().createPreparedStatement("rollback", 0);

        try {
            if (st.getConnection() instanceof PoolConnection) {
                PoolConnection poolConnection =
                    (PoolConnection)st.getConnection();
                OracleConnection connection =
                    (OracleConnection)poolConnection.checkConnection();


                if (connection.isProxySession() &&
                    username.equals(connection.getUserName())) {
                    // no proxying required, we already have a connection that is proxied for this user
                    super.prepareSession(session);
                    return;
                }

                clearStatementCache(poolConnection);

                if (connection.isProxySession()) {
                    connection.close(OracleConnection.PROXY_SESSION);
                }

                Properties properties = new Properties();
                properties.put(OracleConnection.PROXY_USER_NAME, username);
                connection.openProxySession(OracleConnection.PROXYTYPE_USER_NAME,
                                            properties);

                clearStatementCache(poolConnection);

            } else {
                throw new JboException("Not Pool Connection");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        super.prepareSession(session);
    }


    /**
     * Clear out any cached statements
     */
    @Override
    protected void beforeDisconnect() {
        Statement st =
            getDBTransaction().createPreparedStatement("rollback", 0);
        try {
            PoolConnection poolConnection = (PoolConnection)st.getConnection();
            clearStatementCache(poolConnection);
            poolConnection.close(OracleConnection.PROXY_SESSION);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        super.beforeDisconnect();
    }


    private void clearStatementCache(PoolConnection poolConnection) throws SQLException {
        poolConnection.clearStatementCache();

        OracleConnection connection =
            (OracleConnection)poolConnection.checkConnection();

        if (connection.getExplicitCachingEnabled()) {
            connection.purgeExplicitCache();
        }
        if (connection.getImplicitCachingEnabled()) {
            connection.purgeImplicitCache();
        }
    }

And if you want use one connection, you can make all AM to child connection of that AM.

Tips:
1. Before i could not import weblogic.jdbc.wrapper.PoolConnection class. Problem is my model project hasn't any technology scope. It means, We have to select ADF Business Component in technology scope of project properties.

2. Also we was getting different error from weblogic side. (Error: java.lang.ClassCastException: weblogic.jdbc.wrapper.JTAConnection_weblogic_jdbc_wrapper_XAConnection_oracle_jdbc_driver_LogicalConnection cannot be cast to weblogic.jdbc.wrapper.PoolConnection). After i changed XA datasource to NON-XA connection, it was work. In our case, it must be (oracle.jdbc.OracleDriver).

3. Additional tip: Regarding to http://javaosdev.blogspot.com/2011/01/adf-closed-statement-again.html that post. Because i get following error "Caused By: java.sql.SQLRecoverableException: Closed Statement". In this case, We have to turn off statement cache from connection pool. (Give parameter Statement Cache Size : 0).



If i found additional tips from real world problem, i will update it.

Thank you,
Erdenebayar

Linkedin: http://www.linkedin.com/in/erdenebayare
Twitter: http://twitter.com/#!/erdenebayare

Friday, June 7, 2013

Java Mail Client with GMAIL SMTP and PURE SMTP

This post shows you small example of java mail client with gmail smtp and pure smtp server.

 package ia.demo.utils;  
 import ia.demo.exception.fault.EmptyRecipientException;  
 import java.util.Properties;  
 import javax.mail.AuthenticationFailedException;  
 import javax.mail.Authenticator;  
 import javax.mail.Message;  
 import javax.mail.MessagingException;  
 import javax.mail.PasswordAuthentication;  
 import javax.mail.Session;  
 import javax.mail.Transport;  
 import javax.mail.internet.InternetAddress;  
 import javax.mail.internet.MimeMessage;  
 /**  
  * Mail sending class  
  *  
  * @author Erdenebayar  
  */  
 public class MailUtil {  
  /* GMAIL SMTP CONFIGURATION */  
  static String GMAIL_HOST = "smtp.gmail.com";  
  static String GMAIL_FROM = "yourmail@gmail.com";  
  static String GMAIL_PASS = "yourpass";  
  static String GMAIL_PORT = "587";  
  
/* PURE SMTP CONFIGURATION */  
  static final String SMTP_HOST_NAME = "mail.server.com";  
  static final String SMTP_AUTH_USER = "yourmail@server.com";  
  static final String SMTP_FROM_ADDRESS = "yourmail@server.com";  
  static final String SMTP_AUTH_PWD = "yourpass";  
 
public static void main(String[] aaa) throws MessagingException {  
   String emailMsgTxt = "Message from Java";  
   final String emailSubjectTxt = "You are receiving mail from Java system";  
   String[] to = {"recipient1@yahoo.com", "recipient2@outlook.com"};  
   sendMailWithGmail(to, emailMsgTxt, emailSubjectTxt);  
   sendMailWithSmtp(to, emailMsgTxt, emailSubjectTxt);  
  }

  /**  
   * Email configured with GMAIL SMTP server  
   *  
   * @param recipients - List of recipients mail address  
   * @param subjectText - Subject of mail  
   * @param bodyText - Body of mail  
   * @throws MessagingException  
   */
public static void sendMailWithGmail(String[] recipients, String subjectText, String bodyText) throws MessagingException {  
   if (recipients.length > 0) {  
    Properties props = System.getProperties();  
    props.put("mail.smtp.starttls.enable", "true"); // added this line  
    props.put("mail.smtp.host", GMAIL_HOST);  
    props.put("mail.smtp.user", GMAIL_FROM);  
    props.put("mail.smtp.password", GMAIL_PASS);  
    props.put("mail.smtp.port", GMAIL_PORT);  
    props.put("mail.smtp.auth", "true");  
    Session session = Session.getDefaultInstance(props, null);  
    MimeMessage message = new MimeMessage(session);  
    message.setFrom(new InternetAddress(GMAIL_FROM));  
    InternetAddress[] toAddress = new InternetAddress[recipients.length];  
    // To get the array of addresses  
    for (int i = 0; i < recipients.length; i++) { // changed from a while loop  
     toAddress[i] = new InternetAddress(recipients[i]);  
    }  
    System.out.println(Message.RecipientType.TO);  
    for (int i = 0; i < toAddress.length; i++) { // changed from a while loop  
     message.addRecipient(Message.RecipientType.TO, toAddress[i]);  
    }  
    message.setSubject(subjectText);  
    message.setText(bodyText);  
    Transport transport = session.getTransport("smtp");  
    transport.connect(GMAIL_HOST, GMAIL_FROM, GMAIL_PASS);  
    transport.sendMessage(message, message.getAllRecipients());  
    transport.close();  
   } else {  
    throw new EmptyRecipientException("There are no recipient");  
   }  
  }

  /**  
   * Email configured with PURE SMTP server  
   *  
   * @param recipients - List of recipients mail address  
   * @param subjectText - Subject of mail  
   * @param bodyText - Body of mail  
   * @throws MessagingException  
   * @throws AuthenticationFailedException  
   */  
  public static void sendMailWithSmtp(String recipients[], String subjectText, String bodyText) throws MessagingException, AuthenticationFailedException {  
   if (recipients.length > 0) {  
    boolean debug = false;  
    //Set the host smtp address  
    Properties props = new Properties();  
    props.put("mail.smtp.host", SMTP_HOST_NAME);  
    props.put("mail.smtp.auth", "true");  
    Authenticator auth = new SMTPAuthenticator();  
    Session session = Session.getDefaultInstance(props, auth);  
    session.setDebug(debug);  
    // create a message  
    Message msg = new MimeMessage(session);  
    // set the from and to address  
    InternetAddress addressFrom = new InternetAddress(SMTP_FROM_ADDRESS);  
    msg.setFrom(addressFrom);  
    InternetAddress[] addressTo = new InternetAddress[recipients.length];  
    for (int i = 0; i < recipients.length; i++) {  
     addressTo[i] = new InternetAddress(recipients[i]);  
    }  
    msg.setRecipients(Message.RecipientType.TO, addressTo);  
    // Setting the Subject and Content Type  
    msg.setSubject(subjectText);  
    msg.setContent(bodyText, "text/plain");  
    Transport.send(msg);  
   } else {  
    throw new EmptyRecipientException("There are no recipient");  
   }  
  }  
  private static class SMTPAuthenticator extends javax.mail.Authenticator {  
   @Override  
   public PasswordAuthentication getPasswordAuthentication() {  
    String username = SMTP_AUTH_USER;  
    String password = SMTP_AUTH_PWD;  
    return new PasswordAuthentication(username, password);  
   }  
  }  
 }  

Thank you,
Erdenebayar

Linkedin: http://www.linkedin.com/in/erdenebayare
Twitter: http://twitter.com/#!/erdenebayare

Friday, May 24, 2013

Out of box: Database TNS Ping Tester using ADF and Java

I have a implement Database TNS Ping tester using ADF View Controller and Java backing bean. It is just required IP Address and Port of your database. I used JDeveloper 11.2.3.0 and only ViewController project and very small project.

This is my backing bean class. It connected with my JSPX:
package mn.view;

import java.io.IOException;

import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;

/**
 * @author Erdenebayar.E
 * @link erdenebayare.blogspot.com
 */
public class TNSPingTester {
    static String CONN_SUCCESSFULLY = "Connection is healthy";
    static String CONN_UNSUCCESSFULLY = "Please check your connection";

    String ipAddress = "192.168.100.5";
    Integer dbPort = 1521;

    String finalResult = "";

    public String checkDBConnection() {
        //pass in a byte array with the ipv4 address, the port & the max time out required;
        String[] ipAddresses = getIpAddress().split("\\.");
        long start = -1; //default check value
        long end = -1; //default check value
        long total = -1; // default for bad connection
        byte[] addr1 = new byte[] { };
        try {
            addr1 =
                    new byte[] { (byte)Integer.parseInt((ipAddresses[0])), (byte)Integer.parseInt((ipAddresses[1])), (byte)Integer.parseInt((ipAddresses[2])),
                                 (byte)Integer.parseInt((ipAddresses[3])) };
        } catch (Exception ex) {
            setFinalResult(ex.getMessage());
            return getFinalResult();
        }
        
        int timeoutMs = 5000; // 5 seconds

        //make an unbound socket
        Socket theSock = new Socket();

        try {
            InetAddress addr = InetAddress.getByAddress(addr1);

            SocketAddress sockaddr = new InetSocketAddress(addr, getDbPort());

            // Create the socket with a timeout
            //when a timeout occurs, we will get timout exp.
            //also time our connection this gets very close to the real time
            start = System.currentTimeMillis();
            theSock.connect(sockaddr, timeoutMs);
            end = System.currentTimeMillis();
        } catch (UnknownHostException e) {
            start = -1;
            end = -1;
        } catch (SocketTimeoutException e) {
            start = -1;
            end = -1;
        } catch (IOException e) {
            start = -1;
            end = -1;
        } finally {
            if (theSock != null) {
                try {
                    theSock.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if ((start != -1) && (end != -1)) {
                total = end - start;
            }
        }

        if (total == -1) {
            setFinalResult(CONN_UNSUCCESSFULLY);
        } else {
            setFinalResult(CONN_SUCCESSFULLY);
        }

        System.out.println(getFinalResult());

        return getFinalResult();
    }

    public void setIpAddress(String ipAddress) {
        this.ipAddress = ipAddress;
    }

    public String getIpAddress() {
        return ipAddress;
    }

    public void setDbPort(Integer dbPort) {
        this.dbPort = dbPort;
    }

    public Integer getDbPort() {
        return dbPort;
    }

    public void setFinalResult(String finalResult) {
        this.finalResult = finalResult;
    }

    public String getFinalResult() {
        return finalResult;
    }

}

I have a attached final result of web result.

Connection is healthy.


Connection is unhealthy.
 

If you want source code: Source Code TNS Ping Tester.




Wednesday, January 30, 2013

Oracle Data Integrator Installation Guide on Linux_64bit

Dear All,

I just published Oracle Data Integrator 11.1.1.6.0 installation guide on Oracle Enterprise Linux 64bit operation system. Before you have to configure RCU on database (RCU Installation Guide).

1. First you have to run your setup. Go to Disk1 directory and run following command:

[Disk1]$ ./runInstaller

And specify your java home directory



2. Welcome page. Click on Next button.



3. If you have an Oracle support, configure it. But now i just skipped and click on next button.



4. Select your installation type. I installed all components of ODI on server side. Go to Next.



5. After ODI will your prerequisite checks. If everything is OK, click on next button.



6. Specify your middleware directory. Go to next.



7. In this step, you have to choose your repository configuration type.
- if you already created repository using RCU (Described in RCU Installation Guide), select first type.
- If didn't, select skip type.

In my guide, i have already configured and go to next.



8. Now let's specify your repository information. Go to next step.
Connection string should be following format: HOST:PORT@SERVICE_NAME



9. Enter supervisor user details. Which you created in RCU configuration.



10. Select and specify work repository details. And go to next.



11. Specify first agent details. Go to next.
We will use agent when we schedule ODI jobs (Interface, procedure, package etc...).



12. Now we are ready to install ODI. Click on Install button.




13. Let's see installation progress. Wait for Next button will appear :).




14. Let's see configuration progress. Go to next button.



15. Okey. We finished our installation. Let's click finish button.



Next post should be focues ODI domain configuration and ODI Studio installation on client side.

Thank you for my installation guide.
If you have an any questions, please comment here.

Best regards,
Erdenebayar

Linkedin: http://www.linkedin.com/in/erdenebayare
Twitter: http://twitter.com/#!/erdenebayare

Friday, January 18, 2013

B-Tree болон Bitmap индексийг хэрхэн зөв ашиглах


Та бүхэнд Oracle мэдээлэл сангийн систем дээр B-Tree индекс болон Bitmap индексийн харицуулсан судалгааг  (B-Tree and Bitmap index) хийж үзсэнээ хуваалцаж байна. Ямар нөхцөлд аль индексийг хэрхэн хэрэглэх вэ гэдэг нь их чухал юм. Энэ бол эхний харицуулалт ба цааш нь үргэлжлүүлэн үзэх шаардлагатай болсон. Тайлбар тодорхойлолт зэргийг бусад эх үүсвэрүүдээс аван оруулсан.

Хэрвээ зав байвал Туршилтын хэсгийг оруулсан байгаа. 1 сая өгөгдөл оруулаад индексүүдийг үүсгэн, үр дүнг харах. :-)

1. Индекс гэж юу вэ?

Мэдээллийг хайх, хадгалах, өөрчлөх үед хурдан бөгөөд чанартай ажиллахад ашиглагддаг. Энэхүү аргачлал нь бүхий л шинжлэх ухаанд ашиглагдах боломжтой. Ихэнх индекс нь текстийн, бичиг баримтын болон медиа төрлийн эх үүсвэр лүү чиглэж байна. 

Индексгүйгээр тухайн хайх зүйлийг бүх хэсгээс хайна. Энэ нь их хугацаа болон тооцоолол хэрэгтэй болно. Хайлтын архитектур нь дотроо дараах аргуудыг багтаасан байдаг.
  • Suffix tree: Нэг ёсны модны бүтэц ба шугаман байдлаар ханддаг. Текстийг мод хэлбэрт оруулахдаа боломж бүрээр нь задлан оруулдаг. $A, $NA, $ANA, $NANA, $ANANA, $BANANA
  • Inverted index
  • Citation index
  • Ngram index
  • Document-term index

2. Oracle индексийн тухай

Oracle компаны мэдээллийн сан нь мэдээллийн хадгалах хэмжээ, түүн дээрх мэдээллийн боловсруулалт зэргээрээ ижил төстэй системүүдээс дээгүүр ордог. Түүний нэг онцлог нь мэдээллийг хурдан хайх, олох аргалчлал юм. Их хэмжээний өгөгдлөөс тухайн шаардлагатай мэдээллийг олохын тулд индексийн алгоритмыг өргөнөөр хэрэглэдэг. Индексүүд нь дараах ойлголтуудыг өөртөө агуулдаг. Үүнд:
  • Block: Хатуу дискны баг нэгж бөгөөд Oracle уншиж бичихэд ашиглагддаг. Oracle – н table, index cluster зэрэг нь энэхүү block-д хадгалагддаг. Block – н хэмжээн нь 4kb, 8kb, 16kb, 32kb зэрэг байж болно. Мэдээллийн санг суулгахдаа дээрх хэмжээг тохируулан өгдөг.
  • Oracle –н мэдээллийн сан нь b-tree болон bitmap-index гэсэн 2 төрлийн индексийг ашиглагддаг.
  • Cluster Index, bitmap join indexes, function-based indexes, reverse key indexes болон text index нь дээр дурьдсан 2т хуваагддаг.

2.1. B-Tree индекс буюу Balanced Tree

Oracle мэдээллийн сангийн Balanced Tree индекс нь индекс хийж буй талбаруудыг модны бүтцэд оруулдаг. Оруулахдаа нэг модон дахь навчны тоо тэнцүү байхаар оруулах ёстой. Дараах ойлголтуудыг өөртөө агуулдаг. Үүнд:
  • Мэдээллийн сангийн блокуудыг мод бүтэцтэй болгоно. Хүснэгтийн мөрүүд биш.
  • Тухайн бичлэгийн хаана байгааг заадаг. 
    • Хамгийн эхний цэгийг Root гэж нэрлэнэ. Нэг node-д байх хамгийн их тоог Order гэнэ. 
    • Навчинд (leaf) хандах Хамгийн их хандалтыг тоог Depth (Level) гэнэ.
  • Balanced Tree индексийн Order нь бүх Leaf болон Depth-т ижил тоотой байдаг.
  • Том хэмжээний Index-г санах ойд хадгалах нь хүндрэлтэй, тийм ч учраас дискэнд хадгалхаар болсон. 
  • Мэдээллийн сангийн хүснэгтийн талбараар Index үүсгэдэг ба тухайн мэдээллийг хайж олох хурдыг нэмдэг.
Доорх хүснэгтэнд бодит амьдрал дээрх мод, мэдээллийн технологи дахь нэршлийг харуулсан болно.

Харин доорх зурганд хоёртын мод болон Balanced B-Tree модны ялгааг харуулав.

* *



2.2. Bitmap индекс

Oracle мэдээллийн сангийн энэхүү индекс нь B-Tree индексээс маш өөр болно. Энэхүү индексийн бүтэц нь хүснэгтийн баганад зориулан мөр болгоноор хоёр хэмжээст массив үүсгэдэг. Bitmap индексийн давуу тал бол хүснэгтийн маш олон баганаар индекс үүсхэд гарна. Хэрэглэгчээс ирж буй бүх төрлийн хүсэлтэнд саадгүй хариу үзүүлнэ. Жишээ нь: School гэсэн хүснэгтийн SchoolNo, SchoolName, SchoolAddress зэрэг баганаар үүсгэсэн бол энэ гурван талбарын альч талбаруудаар компинац зохион хайх боломжтой юм. Харин B-Tree индексийн хувьд ийм боломж байдаггүй.

Доорх зурагт энэхүү индексийн логик бүтцийг харуулсан болно.
Bitmap индексийн хамгийн тохиромжтой тохиолдолд нь статик хүснэгт болон materialized view тохиолдол юм. Нэг ёсны дээр нь ажиллаж байгаа тохиолдолд бичлэг шинээр нэмэгдэхгүй гэсэн үг юм. Мөн Bitmap индексийг үүсгэхдээ тухайн багана дахь өгөгдлийн давхацахгүй байх өгөгдлийн тоо юм. Жишээ нь: Primary талбар болон Gender талбар юм. Доорх статистикийг гаргасан байдаг. Жишээлбэл:
  • 1 – 7 н давхацахгүй талбар байгаа бол query ажиллагаа маш хурдан болно.
  • 8 – 100 н давхацахгүй талбар байгаа буюу давхацахгүй талбар ихсэж чадамж нь буурдаг болно.
  • 100 – 10000 н давхацахгүй талбар байгаа буюу 100 аас даваад ирвэл чадамж нь хурдан буурна.
  • 10000 аас их давхацахгүй талбартай бол маш удаан болно.

2.3. B-Tree болон Bitmap индексийн давуу болон сул тал

Oracle мэдээллийн сангийн B-Tree болон Bitmap индекс нь өөр өөрийн давуу болон сул талыг агуулж байдаг.

  • Давуу
    • Bitmap нь хайлт хурдан болно
    • Bitmap нь тухайн баганаас хамаарч диск хэмжээ бага байна (Gender)
    • Bitmap нь AD Hoc queryнд давуу талтай
    • B-Tree нь диск хэмжээ бага байна
    • B-Tree нь хайлтын баганууд тодорхой бол тухайн багануудаар үүсгэх боломжтой
  • Сул
    • Bitmap нь тухайн баганаас хамаарч диск хэмжээ их байна (Primary Key)
    • Давхацахгүй талбарын тоо бага байснаар хурдан байна. Харин давхацахгүй талбар нь их бол маш удааг болно. 
    • B-Tree нь AD Hoc query – д тохиромжгүй
Мөн аль аль индексийн хувьд compress буюу үүсгэсэн индексийг шахаж кластер хэлбэртэй болгосноор хэмжээ болон хурданд шууд нөлөөтэй.

Доорх зурагт compress хийж хэрхэн мэдээллийг цэгцлэсэнг Bitmap индекс дээр харууллаа.
 

Дээрх хоёр төрлийн индексийг хариуцуулсан туршилтыг 1 сая өгөгдөл дээр хийсэн болно.


3. Туршилт

Oracle мэдээллийн сан дээр 1 сая бичлэгтэй хүснэгтийг дараах скриптээр үүсгэнэ.
Хүснэгт үүсгэх:
-----------------------------begin------------------------------------
Create table test_normal (empno number(10), ename varchar2(30), sal number(10));
-----------------------------end-------------------------------------

1 сая өгөгдлийг оруулах:
-----------------------------begin------------------------------------
Begin
For i in 1..1000000
Loop
Insert into test_normal 
values(i, dbms_random.string('U',30), dbms_random.value(1000,7000));
If mod(i, 10000) = 0 then
Commit;
End if;
End loop;
End;
-----------------------------end-------------------------------------


3.1. Нарийвчлан харах хэсэг

Үүний дараа туршилтыг хэсгийг эхлүүлнэ. Ажиллуулсан query – н нарийвчлалтай гаргахын тулд доорх query – г ашиглана.
-----------------------------begin------------------------------------
declare

ltimestamp_start timestamp;
ltimestamp_stop timestamp;
linterval_diff interval day to second;

ldt_temp date;
empno NUMBER;
begin

ltimestamp_start := systimestamp;
dbms_output.put_line(ltimestamp_start);

Шалгах QUERY энэ хэсэгт байна.

ltimestamp_stop := systimestamp;
dbms_output.put_line(ltimestamp_stop);

linterval_diff := ltimestamp_stop - ltimestamp_start;

dbms_output.put_line(CHR(10)||LPAD('=',22,'=')||CHR(10));
dbms_output.put_line(' Runtime Difference'||CHR(10)||LPAD('=',22,'='));
dbms_output.put_line(
' Days : '||EXTRACT(DAY FROM linterval_diff)||CHR(10)||
' Hours : '||EXTRACT(HOUR FROM linterval_diff)||CHR(10)||
' Minutes : '||EXTRACT(MINUTE FROM linterval_diff)||CHR(10)||
' Seconds : '||EXTRACT(SECOND FROM linterval_diff) );
end;
-----------------------------end-------------------------------------


3.2. Туршилт 1


  • Бичлэгийн тоо 1 сая
  • B-Tree болон Bitmap индексийг Primary Key талбар дээр үүсгэсэн

Индексүүд          Хэмжээ       Хурд
B-Tree индекс    18MB           0.001 sec
Bitmap индекс    28MB           0.000 sec

3.2.1. Bitmap индекс үүсгэх болон үр дүнг харах

Доорх скриптүүдийг ажиллуулж индекс болон хэмжээг харна.
-----------------------------begin------------------------------------
create bitmap index normal_empno_bmx on test_normal(empno);

analyze table test_normal compute statistics for table for all indexes for all indexed columns;

select substr(segment_name,1,30) segment_name, bytes/1024/1024 "Size in MB" from user_segments where segment_name in ('TEST_NORMAL','NORMAL_EMPNO_BMX');
-----------------------------end--------------------------------------

Үүний дараа хайлтыг хийж үзэх шаардлагатай. Ингэснээр үр дүн гарна.

-----------------------------begin------------------------------------
Нарийвчлан харах хэсэг энд байна ….

select empno from test_normal where empno =565656;

Нарийвчлан харах хэсэг энд байна ….
-----------------------------end--------------------------------------


Bitmap индексийн үр дүн



3.2.2. B-Tree индекс үүсгэх болон үр дүнг харах

Доорх скриптүүдийг ажиллуулж индекс болон хэмжээг харна.
-----------------------------begin------------------------------------
drop index NORMAL_EMPNO_BMX;

create index normal_empno_idx on test_normal(empno);

analyze table test_normal compute statistics for table for all indexes for all indexed columns;

select substr(segment_name,1,30) segment_name, bytes/1024/1024 "Size in MB" from user_segments where segment_name in ('TEST_NORMAL','NORMAL_EMPNO_IDX');
-----------------------------end--------------------------------------

Үүний дараа хайлтыг хийж үзэх шаардлагатай. Ингэснээр үр дүн гарна.
-----------------------------begin------------------------------------
Нарийвчлан харах хэсэг энд байна ….

select empno from test_normal where empno =565656;

Нарийвчлан харах хэсэг энд байна ….
-----------------------------end--------------------------------------

B-Tree индексийн үр дүн




3.3. Туршилт 2


  • Бичлэгийн тоо 1 сая
  • B-Tree болон Bitmap индексийг Gender талбар дээр үүсгэсэн

Индексүүд          Хэмжээ     Хурд
B-Tree индекс    15MB         0.046 sec
Bitmap индекс    0.25MB      0.001 sec


3.3.1. Bitmap индекс үүсгэх болон үр дүнг харах

Доорх скриптүүдийг ажиллуулж индекс болон хэмжээг харна.

-----------------------------begin------------------------------------
alter table test_normal add GENDER varchar2(1);

update test_normal set gender = 'F' where empno >= 0 and empno <= 560000;

update test_normal set gender = 'M' where empno >= 560001 and empno <= 1000000;

create bitmap index normal_GENDER_idx on test_normal(GENDER);

select substr(segment_name,1,30) segment_name, bytes/1024/1024 "Size in MB" from user_segments where segment_name in ('TEST_NORMAL','NORMAL_GENDER_BMX');
-----------------------------end--------------------------------------

Үүний дараа хайлтыг хийж үзэх шаардлагатай. Ингэснээр үр дүн гарна.

-----------------------------begin------------------------------------
Нарийвчлан харах хэсэг энд байна ….

select count(*) into empno from test_normal where gender = 'F';

Нарийвчлан харах хэсэг энд байна ….

-----------------------------end--------------------------------------

Bitmap индексийн үр дүн



3.3.2. B-Tree индекс үүсгэх болон үр дүнг харах

Доорх скриптүүдийг ажиллуулж индекс болон хэмжээг харна.

-----------------------------begin------------------------------------
drop index normal_GENDER_idx;

create index normal_GENDER_idx on test_normal(GENDER);

analyze table test_normal compute statistics for table for all indexes for all indexed columns;

select substr(segment_name,1,30) segment_name, bytes/1024/1024 "Size in MB" from user_segments where segment_name in ('TEST_NORMAL','NORMAL_GENDER_IDX');
-----------------------------end--------------------------------------

Үүний дараа хайлтыг хийж үзэх шаардлагатай. Ингэснээр үр дүн гарна.

-----------------------------begin------------------------------------
Нарийвчлан харах хэсэг энд байна ….

select count(*) into empno from test_normal where gender = 'F';

Нарийвчлан харах хэсэг энд байна ….
-----------------------------end--------------------------------------

B-Tree индексийн үр дүн



3.4. Туршилт 3


  • Бичлэгийн тоо 1 сая
  • B-Tree болон Bitmap индексийг Primary Key болон Gender талбар дээр үүсгэсэн

Индексүүд          Хэмжээ       Хурд
B-Tree индекс    20MB          0.075 sec
Bitmap индекс    28.25MB     0.063 sec


3.4.1. Bitmap индекс үүсгэх болон үр дүнг харах

Индексийг үүсгэхдээ 3.2.1 болон 3.3.1 алхамуудыг хийнэ. Өмнөх үүсгэсэн индексүүдээ устгах шаардлагатай. Үүний дараа доорх QUERY ажиллуулна.


-----------------------------begin------------------------------------
select count(*) into empno from test_normal where gender = 'F' and empno between 15000 and 360000;
-----------------------------end--------------------------------------

Bitmap индексийн үр дүн


3.4.2. Bitmap индекс үүсгэх болон үр дүнг харах

Өмнөх үүсгэсэн индексүүдээ устгах шаардлагатай. Доорх скриптүүдийг ажиллуулж индекс болон хэмжээг харна.

-----------------------------begin------------------------------------
create index normal_GENDER_idx on test_normal(EMPNO, GENDER);

analyze table test_normal compute statistics for table for all indexes for all indexed columns;

select substr(segment_name,1,30) segment_name, bytes/1024/1024 "Size in MB" from user_segments where segment_name in ('TEST_NORMAL','NORMAL_GENDER_IDX');
-----------------------------end--------------------------------------

Үүний дараа хайлтыг хийж үзэх шаардлагатай. Ингэснээр үр дүн гарна.

-----------------------------begin------------------------------------
select count(*) into empno from test_normal where gender = 'F' and empno between 15000 and 360000;
-----------------------------end--------------------------------------

B-Tree индексийн үр дүн


Дүгнэлт

Oracle мэдээллийн системийн индексүүд нь бүгд хүчирхэг арга, техникүүд бөгөөд хэрэглэхдээ тухайн онцлого байдлаасаа хамааран хэрэглэх шаардлага гарна.

Bitmap индексийн хувьд:

Тухайн хэрэглэх гэж буй талбарын давхацахгүй өгөгдөл нь бага тохиодолд хамгийн тохиромжтой. Gender буюу цөөн төрлийн өгөгдөлтэй үед (Male, Female) тохиромжтой болсон. Хэмжээ бага, хурд өндөр. Давхацахгүй өгөгдөл нь 10000 дээш болбол хэрэглэх шаардлагагүй.

B-Tree индексийн хувьд:

Хэмжээний хувьд ямар ч төрөл байсан хоорондоо ойролцоо гарч байна. Харин хурдан байх, хэмжээ бага байх нөхцөл Primary Key талбар буюу хоорондоо давтагдахгүй байх тусмаа сайн. Мөн гаднаас ямар ямар талбараар хайх нь тодорхой бол хэрэглэвэл хамгийн тохиромжтой болно.

Зочилсонд баярлалаа. Ямар нэгэн асуулт байвал, коммент бичээрэй.

Хүндэтгэсэн,
Эрдэнэбаяр

Linkedin: http://www.linkedin.com/in/erdenebayare
Twitter: http://twitter.com/#!/erdenebayare

Thursday, January 17, 2013

Oracle Repository Creation Utility Installation Guide

Dear All,

If you are trying to use Oracle Fusion products, you have to configure Oracle Repository Creation utility first. This post shows, how to run RCU and Configure ODI and BI components. This installation guide is RCU 11.1.1.5.0.

First of all you have to change some configurations on database side using following commands:

alter system set processes=500 scope=spfile;
alter system set open_cursors=800 scope=spfile;
shutdown immediate;
startup;


1. First you have to run your RCU. Go to rcuHome->rcu.bat.



2. Select your configuration type



3. Provide your database connection information. Database user should be as sysdba privilege.



4. After RCU will check your prerequisites.

 

5. Now select your fusion components, which are you will use. Also provide your schema prefix using Create a new prefix section.



6. After again RCU will check your components prerequisites.


7. Let's provide schema passwords for each schema. But i selected Use same passwords for all schemas. 



8. Next step is: If you select Oracle Data Integrator component, you need to provide additional information, which are Master Repository and Work Repository information. This information will be require when ODI Studio connect



9. Now review your tablespaces mapping.



10. Next step is: RCU will create tablespaces for selected components.



11. Now we finished our RCU installation and configuration. Let's review and check.



12. Last step is completion summary. Database details and log file locations.





Thank you for my installation and configuration guide.
If you have an any questions, please comment here.


Best regards,
Erdenebayar

Linkedin: http://www.linkedin.com/in/erdenebayare