Archive

Archive for April, 2010

ตารางสรุป Data Type ของ SQL Server Integration Service (SSIS)


สำหรับท่านที่ใช้งาน SQL Server Integration Service อยู่ อาจจะมีปัญหาเรื่อง Data Type เพราะว่าเมื่อเปิดหน้าจอเข้าไปแล้ว กลับพบว่าเป็น Data Type ที่ไม่คุ้ยเคย เช่น DT_WSTR หรือ DT_TEXT ก็ไม่ทราบว่าเป็น Data Type ชนิดใดกันแน่ ทำให้ปวดหมองกันเลยทีเดียว ผมก็เลยไปค้นคว้าและไปสรุปมาเป็น Table ดังด้านล่างครับ

SQL Server Data Type SSIS Data Type
bigint eight – byte signed integer [DT_I8]
binary byte stream [DT_BYTES]
Bit Boolean [DT_BOOL]
tinyint single – byte unsigned integer [DT_UI1]
Datetime database timestamp [DT_DBTIMESTAMP]
Decimal numeric [DT_NUMERIC]
real float [DT_R4]
Int four – byte signed integer [DT_I4]
Image image [DT_IMAGE]
Nvarchar or nchar Unicode string [DT_WSTR]
Ntext Unicode text stream [DT_NTEXT]
Numeric numeric [DT_NUMERIC]
Smallint two – byte signed integer [DT_I2]
Text text stream [DT_TEXT]
Timestamp byte stream [DT_BYTES]
Tinytint single – byte unsigned integer [DT_UI1]
Uniqueidentifier unique identifier [DT_GUID]
Varbinary byte stream [DT_BYTES]
Varchar or char string [DT_STR]
Xml Unicode string [DT_WSTR]

 

หลักสูตรอบรม SQL Server (Click)

 

การทำ Performance Tuning SQL Query เบื้องต้น (part 5 – Index Strategy)


System Requirement

  1. SQL Server 2005 or 2008
  2. Sample Database “AdventureWorks” (Install from DVD)

Index Strategy Overview

เทคนิคหนึ่งที่ถือว่านิยมกันมากที่สุดก็คือการทำ Index ครับ โดยการทำ Index นั้นมีหลักการที่ง่ายมากๆ ก็คือ ทำย้งไงให้ Query ตัวเดิมสามารถที่จะ Scan disk น้อยลง เพราะว่าโดยปกติแล้ว เวลาที่ SQL Server ทำงานหรือค้นหาข้อมูลเพื่อให้ได้ผลลัพธ์ตาม Query Syntax นั้น ทาง SQL Server จะใช้ทรัพยากรทั้งหมด (Resources) ไม่ว่าจะเป็น CPU, Disk, Memory, etc. แล้วจุดที่ถือว่าเป็นตัวร้ายที่สุด ก็คือ disk ครับ

จริงๆ แล้ว เราสามารถที่จะหาวิธีใช้ Memory ให้น้อยที่สุดก็ได้ หรือว่าหาวิธียังไงให้ใช้ CPU ให้น้อยที่สุดก็ได้ แต่มันจะเข้าหลักการที่ว่า “ได้ไม่คุ้มเสีย” เพราะโดยส่วนใหญ่แล้ว ปัญหาที่ทำให้ Query ช้านั้น จะอยู่ที่ Disk ซะ 80% แล้วครับ ดังนั้น ถ้าเราพุ่งเป้าไปที่ disk นั้น ก็จะคุ้มค่ากว่าพุ่งเป้าไปที่ CPU หรือ Memory ครับ

Index ใน SQL ก็เหมือน Index ในหนังสือนั่นแหล่ะครับ สมมุติว่าเราไปหยิบหนังสือขึ้นมา 1 เล่ม ที่มีจำนวนหน้า 1,000 หน้า การที่เราจะเปิดหนังสือไปหน้าที่มีข้อมุลที่เราต้องการ เราอาจจะต้องเปิดไปทีละหน้าไปเรื่อยๆ จนกว่าจะเจอหน้าที่มีข้อมูลที่เราต้องการใช่ไหมครับ ทีนี้สมมุติว่าเราเจอหน้านั้นแล้ว ก็มีคำถามต่อไปว่าเราจะหยุดเปิดหน้าที่เหลือหรือเปล่า? คำตอบก็คือเราก็คงจะไม่หยุดเปิดหน้าที่เหลือ เหตุผลหรือครับ? ก็เพราะว่าหน้าที่เหลือก็อาจจะมีข้อมูลที่เราต้องการอีกก็ได้นี่ครับ ดังนั้น เราก็เลยต้องเปิดไปเรื่อยๆ จนจบหนังสือทั้งเล่มนั่นเอง

Index จะมาช่วยไม่ให้เราต้องเปิดหนังสือทุกหน้านั่นเอง เพราะโดยปกติเราจะเปิดไปที่ index เพื่อค้นหาหัวข้อที่เราสนใจหลังจากนั้นเราก็จะทราบว่าอยู่หน้าไหน เพื่อที่เราจะได้ไม่ต้องเสียเวลาเปิดหนังสือไปทีละหน้า ทำให้เป็นการลดจำนวนหน้าที่เราจะต้องเปิด ผลที่ได้ก็คือเราค้นหาข้อมูลได้เร็วขึ้น

ใน sql server ก็ทำการแบ่งหน้า (Page) ไว้เก็บข้อมูลเหมือนกัน โดย 1 Page จะมีขนาดเท่ากับ 8KB เสมอ ครับ และไม่สามารถแก้ไขได้ แต่ใน Oracle จะสามารถกำหนดขนาดของ Page ได้ครับ ทีนี้ใน 1 page จะเก็บข้อมูลได้กี่ Record ก็ขึ้นอยู่กับความยาวของ Record แล้วครับ ยกตัวอย่างเช่น ถ้า 1 record มีความยาวเท่ากับ 1 KB ก็แสดงว่าใน 1 page สามารถเก็บข้อมูลได้ 8 Records ครับ

เตรียมข้อมูลที่ใช้ในการทดลอง

ก่อนจะทำการทดลอง ผมจะ export table “person.contact” ออกมาก่อนโดยสร้างเป็น database ก้อนใหม่ชื่อ demo โดยมีขั้นตอนดังนี้ครับ

1) เลือกคำสั่ง Export Data

2) เลือก source เป็น Adventureworks ตามรูป

3) เลือก Destination โดยทำการสร้าง Database ใหม่โดยกดปุ่ม New

4) ตั้งชื่อฐานข้อมูลเป็น Demo

5) เลือก Table ที่เราต้องการ Export ในที่นี้ให้เลือก person.contact

หลังจากนั้น ก็ทำตามแนวที่เราถนัดครับ next ไปเรื่อยๆ จน export data สำเร็จ จนได้ database ก้อนใหม่ชื่ demo ก็เป็นอันเสร็จ พร้อมที่จะทำการทดลองได้แล้วครับ

เริ่มการทดลอง

คำสั่งต่อไปนี้เป็นคำสั่งที่ใช้ในการขอดูจำนวน page ทั้งหมดที่ใช้ใน Table ครับ ก่อนใช้ต้อง use demo ก่อนครับ

     dbcc checktable(‘person.contact’)

จะเกิดผลลัพธ์ดังรูป

ผลลัพธ์ที่ได้จะทำให้เราทราบว่า Table “person.contact” มีจำนวน page ทั้งหมดกี่ page ถ้าอยากจะทราบว่า table นี้มีขนาดเท่าไหร่ ก็เอา 8,192 คูณจำนวน page เข้าไปก็ทราบขนาดของ Table ครับ

ทีนี้เราลองดูตัวอย่างวิธีการ Query ตาม Syntax ด้านล่างครับ

    set statistics io on
go
select * from person.contact
go

วิธีการ Query ข้างต้นนี้เป็นวิธีการขอดู records ทั้งหมดที่อยู่ใน Table ดังนั้นการ Scan page จึงมีขนาดเท่ากับจำนวน page ทั้งหมดของ Table ครับ

คราวนี้เราลองใส่ where เข้าไปตาม syntax ด้านล่าง แล้วลองรันดูครับ

จะเห็นว่าจำนวน scan page จะเท่ากันตามหลักการของหนังสือเหมือนกับที่ผมได้กล่าวเอาไว้ครับ

ทีนี้ลองสร้าง Index ดู เพื่อลดจำนวน scan page ตาม syntax ถัดไป โดยมีหลักการที่ว่าให้สร้าง index บน column ที่เราต้องการ where ในที่นี้คือ contactid ดังตัวอย่าง

ทีนี้ลอง ขอดูว่า index ที่เราสร้างไว้สำเร็จหรือไม่ โดยใช้คำสั่งและผลลัพธ์ดังรูปถัดไป

จะได้ผลลัพธ์ว่า Table นี้มี index ที่สร้างไว้แล้วอะไรบ้าง ถ้าได้หน้าจอประมาณด้านล่างก็แสดงว่าเราสร้าง index สำเร็จครับ

ทีนี้ลองรันคำสั่ง ที่มี where อีกครั้งนึง คราวนี้จะได้ผลลัพธ์ดังนี้ครับ

ถ้าเทียบกับตอนแรกที่ไม่มี index จะเห็นว่า ต้อง scan page ถึง 557 page แต่พอใส่ index เข้าไปแล้วรันคำสั่งเดิม จะเห็นว่าเหลือ scan page แค่ 3 page เองครับ สรุปว่า optimize เพิ่มขึ้นถึง 557/3 = 185 เท่าโดยประมาณครับ แต่นี่ก็ optimize เฉพาะ disk น่ะครับ แต่ก็ถือว่าคุ้มค่ามากครับ เพราะว่าถ้า disk ทำงานน้อยลง cpu และ memory ก็จะทำงานน้อยลงตามไปด้วยครับ

สรุปการใช้งาน Index

การสร้าง Index ถ้าจะให้ได้ผล ควรจะสร้างลงบน field ต่างๆ ดังต่อไปนี้

  1. Where
  2. Primary Key
  3. Foreign Key
  4. Join
  5. Group by

นี่เป็นเพียงส่วนหนึ่งเท่านั้น ในการใช้งานจริงๆ ยังมีรายละเอียดปลีกย่อยอีกมากครับ ลองติดตามตอนต่อไปนะครับ

หลักสูตรอบรม Tuning SQL Server (Click)

Download Visual Studio 2010 today! and .NET Framework 4 Released


และแล้วก็ออกตัวจริงมาแล้วครับ พร้อมกับ .net framework 4.0

ลองเข้าไป download กันได้เลยครับ

http://www.microsoft.com/visualstudio/en-us/download

Categories: Programming

[Video] Open XML Overview for Developers


เป็นงาน msdn ของ microsoft ที่ผมเคยไปพูดไว้เมื่อปี 2007 ครับ (จริงๆ เคยไปพูดไว้หลายงาน แต่เพิ่งจะมีคนบันทึกวีดีโอให้ ก็งานนี้แหล่ะครับ) เกี่ยวกับ data file format ของ office 2007 ซึ่งใน version นี้จะใช้ standard ของ OpenXML มาเป็น format ของ microsoft office ครับ จากเมื่อก่อนไฟล์ของ office ทั้งหมด จะเป็น binary

ประโยชน์ที่ได้ก็คือเราจะใช้โปรแกรมอะไรสร้างไฟล์ของ office ก็ได้ แต่ถ้าถามว่าจะสร้างไฟล์ office ไปทำไม ผมก็ขอตอบสั้นๆ ว่า เราอาจจะนำไปสร้าง report โดยที่ไม่ต้องเสียค่า license ของ Crystal report, Actuate Report, BIRT Report และอื่นๆ ครับ เพราะว่าไฟล์ที่ generate ขึ้นมาก็สามารถเปิดใน word หรือ excel ได้เลยครับ ถ้าที่เครื่อง user มี office 2007 อยู่แล้ว บอกตรงๆ ว่า งานที่ผมพัฒนาส่วนใหญ่ก็จะออก report เป็น office document อยู่แล้วครับ เพราะว่าจะทำให้ user ที่ชำนาญการใช้ office อยู่แล้ว สามารถที่จะแก้ไข report ได้ด้วยตัวเอง ทำให้เกิดความยืดหยุ่นเป็นอย่างมากครับ ลองเข้าไปดูกันนะครับ

http://coredeveloper.net/blogs/eventsession/archive/2007/12/18/msdn-s-s-for-oba-session-5.aspx

Categories: Seminar

เปรียบเทียบ SQL Server 2008 Compared to Oracle Database 11g


เป็นเอกสารในรูปของไฟล์ .docx ซึ่ง Microsoft ได้ทำไว้เกี่ยวกับการเปรียบเทียบ SQL Server 2008 กับ Oracle 11g น่ะครับ click link ข้างล่างเพื่อ download ได้เลยครับ

Download: SQL Server 2008 Compared to Oracle Database 11g White Paper

Categories: SQL Server

[Video] งานเปิดตัว SharePoint 2010, VS2010, Office 2010, SQL 2008 R2 (Community Technical Preview)


เป็น video สำหรับท่านที่ไม่ได้ไปร่วมงานที่วันที่ 24 มีนาคม 2553 ที่แชงกรีล่า พอได้ผมได้ link มาจากคุณปรเมศแห่ง CP ขอขอบคุณมา ณ ที่นี้ด้วยนะครับ (ขอให้รวยๆ)

http://duocore.tv/technetmsdn/

Categories: Seminar

What’s New in ASP.NET 4.0 (ตอน New Output Caching)


มีอะไรใหม่ใน asp.net 4.0 ตอนนี้จะกล่าวถึง New Output Caching ครับ

ปกติแล้ว เราสามารถที่จะเพิ่มความเร็วของ asp.net ได้โดยการทำ page cache ได้ โดยมีตัวอย่างการ config ในไฟล์ web.config ดังตัวอย่างครับ

<%@ OutputCache Duration=”60″ VaryByParam=”None” %>

 

จากตัวอย่างการ config ข้างต้น จะเป็นการตั้งอายุของ cache ไว้ที่ 60 วินาทีครับ โดยสิ่งที่ cache เก็บก็คือผลลัพธ์ของ HTML ที่ asp.net ส่งไปยัง browser ของ user ถ้ามี user คนอื่นต้องการจะดู page เดียวกัน ทาง asp.net จะส่ง html result ที่เก็บไว้ใน cache ส่งไปให้แทน โดยไม่ต้อง generate html กันใหม่ครับ ซึ่งผลที่ได้ก็คือทำให้ asp.net ทำงานได้เร็วขึ้นนั่นเอง

แต่การเก็บ cache นั้นโดย asp.net รุ่นเก่าๆ จะเก็บไว้ใน memory เพียงอย่างเดียว ซึ่งก็มีข้อเสียครับ คือทำให้ server ใช้ memory ที่ค่อนข้างเยอะพอสมควร ซึ่งในบางครั้งอาจจะทำให้ Memory ที่ใช้งานมีไม่เพียงพอ ซึ่งในจุดนี้ก็โดนบ่นมาเยอะพอสมควรครับ

ใน asp.net 4.0 ได้เปิดโอกาสให้เราสามารถเลือก output-cache provider ได้ เพื่อที่จะเก็บ html content ไว้ โดย storage ที่เราสามารถเลือกได้นอกจาก memory ก็มี localdisk, remote disk, cloud storage หรือแม้กระทั่ง distributed cache engines

นอกจากนี้ใน cache รุ่นใหม่นี้ยังมี option ที่น่าสนใจอีกนะครับ เช่น เราสามารถที่จะเลือกเก็บ cache เฉพาะ page ที่มีคนดูบ่อยๆ ก็ได้อีกด้วย ถือว่าได้มีการปรับปรุงขึ้นมาน่าสนใจไม่น้อยทีเดียว

การสร้าง output-cache provider นั้นจะต้องสร้างเป็น class ขึ้นมา โดยจะต้อง inherit มาจาก class ที่ชื่อว่า OutputCacheProvider ซึ่งเป็น class ที่มีมาใหม่ใน asp.net 4.0

โดยวิธีการ config มีตัวอย่างดัง code ดังนี้ครับ

<caching>
    <outputCache defaultProvider=”AspNetInternalProvider”>
        <providers>
            <add name=”DiskCache” type=”Test.OutputCacheEx.DiskOutputCacheProvider, DiskCacheProvider”/>
        </providers>
    </outputCache>
</caching>

 

สังเกตุว่าเราจะตั้งชื่อไว้เป็น “DiskCache” และมี default provider เป็น “AspNetInternalProvider” ดังนั้นเวลาเราจะนำ provider ตัวนี้มาใช้งานก็ให้เขียน web.config ดังนี้

<%@ OutputCache Duration=”60″ VaryByParam=”None” providerName=”DiskCache” %>

 

ถ้าเราระบุ providerName ก็จะใช้ output-cache provider เป็น DiskOutputCachProvider แต่ถ้าเราไม่ระบุก็จะกลับไปใช้ AspNetInternalProvider ตามที่ระบุใน default Provider ครับ

และเราก็สามารถระบุ output-cache provider ใน global.asax ได้เหมือนกันครับ ดังตัวอย่างใน code

public override string GetOutputCacheProviderName(HttpContext context)
{
    if (context.Request.Path.EndsWith(“Advanced.aspx”))
       return “DiskCache”;
    else
        return base.GetOutputCacheProviderName(context);
}

 

Reference: http://msdn.microsoft.com/en-us/library/s57a598e(v=VS.100).aspx

หลักสูตรอบรม: .net programming

Categories: Programming