Posts Tagged ‘ Performance

Oracle and WITH clause

สืบเนื่องด้วยมีปัญหาเรื่อง Performance ในการทำงานกับข้อมูล transaction log เจ้านายท่านก็ให้ไปหา Solution มาแก้ปัญหา แต่เนื่องด้วยความสามารถน้อยไปหน่อย เจ้านายก็เลยไปวานให้ DBA แก้ไขปัญหาให้ (นั่นละหน้าที่จริงๆของ DBA) DBA ก็ให้เปลี่ยนพวก Sub Query ที่เรียกใช้บ่อยๆ และ ไม่ได้เปลี่ยน Parameter ในเงื่อนไข where ให้มาใช้ WITH แทน จาการอ่านมาคร่าวๆ WITH จะสร้างข้อมูลของ Query ขึ้นมาโดยทำงานคล้ายๆ กับ Global temporary tables (GTT) (อย่าถามผมเลย ผมไม่รู้มันคืออะไรเหมือนกัน) รูปแบบของคำสั่ง WITH เป็นดังนี้ครับ
1. แบบประกาศตัวเดียว

WITH <alias_name> AS (subquery_sql_statement)
SELECT <column_name_list> FROM <alias>;

เช่น

WITH QR AS (SELECT col1,col2 FROM tb)
SELECT col1 FROM QR;

2. แบบประกาศหลายๆตัว

WITH <alias_one> AS 
  (subquery_sql_statement),
    <alias_two> AS
  (sql_statement_from_alias_one)
SELECT <column_name_list>
FROM <alias_one>, <alias_two>
WHERE <join_condition>;

ตัวอย่างเช่น

WITH Q1 AS
  (SELECT col1 FROM tb1),
  Q2 AS
  (SELECT col2 FROM tb2)
SELECT /*+ MATERIALIZE */ *
FROM Q1, Q2
WHERE Q1.col1 = Q2.col2;

แหล่งข้อมูลที่ลอกมา
Oracle With Clause
Oracle SQL-99 WITH clause

วิธีเขียนโปรแกรมวน Loop แล้ว CPU ขึ้นไม่ถึง 100%

จากการได้ไปอ่านที่เว็บพี่ไท้มาเกี่ยวกับ วิธีเขียนโปรแกรมวน Loop แล้ว CPU ขึ้นไม่ถึง 100%
แล้วเห็นว่ามีประโยชน์มาก เลยถือโอกาสทดลอง ว่าวิธีนี้จะช่วยได้มากแค่ไหนครับ เลยมา Note เป็นตัวอย่างไว้ครับ
1. แบบธรรมดาให้ loop 1,000,000,000 รอบ

/**
 * File Name : SleepTest.java
 * Created Date : Nov 13, 2009 : 1:34:13 PM
 * Copyright © 2009 www.fun4station.com
 */
package com.fun4station.example;
import java.math.BigDecimal;

/**
 * @Author Supot Saelao
 * @Version 1.0
 */
public class SleepTest {
	public static void main(String[] args) {
		long start = System.currentTimeMillis();
		BigDecimal amount = new BigDecimal(0);
		for (int i = 0; i < 1000000000; i++) {
			amount = amount.add(new BigDecimal(i));
		}
		System.out.println("Amount : " + amount);
		long end = System.currentTimeMillis();
		System.out.println("Start time : " + start);
		System.out.println("End time : " + end);
		System.out.println("Diff time : " + (end - start));
	}
}

ตัวอย่าง output

cpu100-normal

Amount : 499999999500000000
Start time : 1258094775765
End time : 1258094827484
Diff time : 51719

Read more