วันพุธที่ 6 มกราคม พ.ศ. 2553

MDXParameter , Capture Parameters value from MDX Query

จากการใช้งาน SQL Server Profiler ในการ Trace Query ต่าง ๆ นั้น
ให้ผลที่น่าพอใจพอสมควร แต่ในกรณีที่มีการรัน MDX Query ผ่าน Reporting Service
แล้วมีการ Input paramters ลงไป จะ Track Paramerters values ไม่ได้

เมื่อได้ลอง Search ดูก็ได้พบ Free Tool ตัวนึงมีชื่อว่า MDXParameter จากเว็บ Codeplex
ซึ่งมีความสามารถในการ Trace & Replace parameters values ทำให้เราสามารถนำ Query
มาทำการวิเคราะห์ต่อไปได้ ซึ่งถือว่ามีประโยชน์ดีทีเดียว อีกทั้งยังมีการ Export ข้อมูลที่ Trace
มาได้ลงใน MSSQL Server ได้ด้วย แต่ก็ยังมีข้อเสียคือไม่มี Column ที่เก็บ MDX Query ที่
ได้ Replace parameter แล้วลงไปด้วย ทำให้การนำไปใช้งานในต่อค่อนข้างจะยาก เพราะ
อย่างกรณีที่ทำการ Research เรื่องนี้คือต้องการที่จะนำ MDX Query ที่ User ได้รันไปทำ
CUBE Warm UP เพื่อประสิทธิภาพในการใช้งานครั้งต่อไป

ขั้นตอนการใช้งานหลังจาก Download มาแล้ว
* แนะนำให้รันที่ SSAS Server เพราะจาการทดสอบรันจาก Client แล้ว Point IP Addr ไปที่
Server แล้วตอน View Query เกิด Error ขึ้น
1 Run -- > MDXParameter.exe แล้ว Config ค่าต่าง ๆ ดังนี้
- SSAS Server for tracing = localhost (คือ SSAS Server ที่ต้องการ Trace Query)
- SQL Server = localhost (คือ DB Server ที่ต้องการ Point ไปเพื่อสร้าง Table)
- Database Name to save trace = QueryLog (คือ Database Name )
- Table Name to save trace = MDXTraceQuery (คือ Table Name ที่ต้องการ save trace data)
2 Click strat trace button รันไปจนกว่าจะพอใจ แล้วกด Stop ในระหว่างนี้ Program จะไม่ Show data
ใด ๆ ทั้งสิ้นจนกว่าจะกด Stop trace
3 เลือก Query ที่ต้องการดู (ให้เลือก Replace Parameter ด้วย)


Reference Site http://mdxparameter.codeplex.com/

วันศุกร์ที่ 18 ธันวาคม พ.ศ. 2552

SSAS Debuging via FlightRecorder

ตั้งแต่ Analysis Service 2005 ขึ้นไปมี feature ที่สามารถ Tracking การทำงานของของ OLAP
มีชื่อว่า FilghtRecorder ปกติแล้ว Service นี้จะ Start โดยอัตโนมัติ หาก Service นี้ไม่ Start
อาจเกิดจากการ Set properties ของ Server ที่ Disable ไว้
สามารถตรวจสอบได้ที่
  • Analysis Server Properties --> Log \ FlightRecord\Enabled
  • Change value to "ture"

ขั้นตอนการเปิด Setup เพื่อให้ FlightRecorder ทำงาน

  1. Open file --> C:\Program Files\Microsoft SQL Server\MSSQL.2\OLAP\bin\flightrecordertracedef.xml เพื่อทำการเปลี่ยนแปลงข้อมูล Template ให้ตรงตามต้องการ โดยใช้ Text editor เตรียมไว้
  2. สร้าง Trace template ใหม่โดยใช้ SQL Server Profiler แล้วเลือก Event ที่ต้องการ track
  3. Save file ที่ได้ แล้วใช้ Text editor เปิดไฟล์เพื่อ Copy code ในส่วนของ Event ที่ต้องการ ()
  4. Paste code ที่ Copy มาในข้อ 3 แทนที่ของส่วน Event ในไฟล์ flightrecordertracedef.xml และ Save file
  5. ทำการ Restart SSAS
  6. ไฟล์ Log ที่ได้คือ
  • FlightRecorderBack.trc เป็น History ไฟล์
  • FlightRecorderCurrent.trc เป็น Currently ไฟล์

ใช้ SQL Server Profiler ในการ View trace file

Site Reference http://patrice-truong.spaces.live.com/blog/cns!62BC7696F42B5!181.entry?ccr=1978

วันศุกร์ที่ 27 พฤศจิกายน พ.ศ. 2552

MDX Query : Dimension Usage with(out) summary row

MDX Query Exclude summary row.
ปกติเวลาเราสร้าง MDX Query ขึ้นมา คงไม่มีใครจะพิมพ์เองทั้งหมดนะครับ เนื่องจากมี Tools ช่วยอยู่แล้ว
ทำให้เราสามารถ Drag & Drop Object ได้โดยสะดวก
บทความนี้จะมี Trick เล็ก ๆ น้อย ๆ เกี่ยวกับการใช้งาน Dimension ใน MDX Query ครับ
โดยจะขอยกตัวอย่างจาก Adventure Work อีกเช่นเคย
ซึ่งตามหัวข้อของบทความก็คือ การ Select ข้อมูลโดยมีและไม่มี Summary record ครับ
ให้สังเกตส่วนที่ Hiligh นะครับเพราะเป็น Level ของ Dimension ส่วนที่แตกต่างกัน
เมื่อนำมาใช้ก็จะได้ผลตามข้อ 1 และ 2 ซึ่งจะเป็นประโยชน์ในการทำ Report ต่อไป

1 MDX Query with summary record
SELECT {[Measures].[Internet Order Quantity],[Measures].[Internet Sales Amount]} on 0
,[Sales Territory].[Sales Territory Country].MEMBERS on 1
FROM [Adventure Works]
WHERE
[Sales Territory].[Sales Territory Group].&[Europe]







2 MDX Query without summary record
SELECT {[Measures].[Internet Order Quantity],[Measures].[Internet Sales Amount]} on 0
,[Sales Territory].[Sales Territory Country].[Sales Terriotory Country].MEMBERS on 1
FROM [Adventure Works]
WHERE
[Sales Territory].[Sales Territory Group].&[Europe]





MDX Query : Where clause with dimensions slice & dice

บทความนี้จะกล่าวถึง Basic MDX Query ที่อาจทำให้เรา Query ข้อมูลผิดพลาด
ในความเคยชินของผู้ใช้งาน RDBMS ทั่วไปนั้นแน่นอนว่าการ Filter ข้อมูลก็คือการใส่ เงื่อนไขหลัง WHERE
ใน SQL Statement ยกตัวอย่างง่าย ๆ ของการหายอดขายของ ภูมิภาคยุโรป ที่มีชื่อประเทศตั้งแต่ฝรั่งเศษ - เยอรมันนี

SELECT sum(sales_amount)
FROM sales
WHERE Region ='EUROPE'
AND Country Between 'France' AND 'Germany'

ซึ่งก็จะได้ข้อมูลถูกต้องแน่นอนครับ แต่หากเราจะประยุกต์ Query นี้เพื่อใช้กับ MDX แล้วผลลัพธ์จะไม่ได้ตามต้องการ
ในที่นี้ผมขอยกตัวอย่างจาก Adventure Works ของ Microsoft นะครับ
Query ในแบบที่น่าจะเป็น


SELECT {[Measures].[Internet Order Quantity],[Measures].[Internet Sales Amount]}
on 0
FROM [Adventure Works]
WHERE
(
[Sales Territory].[Sales Territory Group].&[Europe]
,{[Sales Territory].[Sales Territory Country].&[France]: [Sales Territory].[Sales Territory Country].&[Germany]}
)



ผลลัพธ์ที่ได้คือ ให้สังเกตตรงผลรวมด้านบนไว้นะครับ
จะเห็นว่า Internet Order Quantity = 18,089

ส่วนอันนี้เป็น Query ที่ให้ผลลัพธ์ถูกต้อง (มีหลายรูปแบบนะครับ)
SELECT {[Measures].[Internet Order Quantity],[Measures].[Internet Sales Amount]}
on 0
,[Sales Territory].[Sales Territory Country].members on 1
FROM
(SELECT
{[Sales Territory].[Sales Territory Country].&[France]:
[Sales Territory].[Sales Territory Country].&[Germany]} ON 0
FROM [Adventure Works] WHERE
[Sales Territory].[Sales Territory Group].&[Europe])


ผลลัพธ์ที่ได้ จะเห็นว่ายอดลดลงเหลือ 11,183 เท่านั้น อาจสงสัยว่าแล้วยอด 18,089 มาจากไหน
คำตอบคือเป็นยอดทั้งหมดของยุโรปครับ ซึ่งใน Database มีอยู่ 3 ประเทศด้วยกันตามนี้

SELECT {[Measures].[Internet Order Quantity],[Measures].[Internet Sales Amount]}
on 0
,
[Sales Territory].[Sales Territory Country].MEMBERS
on 1
FROM [Adventure Works]
WHERE
[Sales Territory].[Sales Territory Group].&[Europe]





เหตุผลที่ Query ในรูปแบบของ RDBMS เกิดข้อผิดพลาดขึ้นในกรณีนี้ก็คือเรื่อง Heirachy ของ Dimension ครับ
กล่าวคือใน Level ที่อยู่สูงกว่าจะมียอด Summary ของ Measurement เก็บไว้
ไม่ว่าเราจะใช้ Where ในการ Filter ข้อมูลใน Level ที่ต่ำลงมาก็จะไม่ทำให้ข้อมูลใน Parent level เปลี่ยนไปตามเงื่อนไข (ยกเว้นการทำ Sub Selection)
ดังนั้นต้องระวังในข้อนี้ให้ดีครับ เพราะสิ่งเหล่านี้จะพื้นฐานของการนำไปสร้างรายงานสำหรับ User ต่อไป
ในเรื่องของการรับ Parameter

วันพฤหัสบดีที่ 26 พฤศจิกายน พ.ศ. 2552

Copy Reporting Service objects , with RSScripter

การ Copy Reporting service objects ด้วย Tool RSScripter
ในกรณีที่ต้องการจะ Duplicate Report folder เพื่อทดสอบ หรือ เพื่อจุดประสงค์ใดก็ตาม
เช่นอาจจะ Copy report จาก Server01 ---> Server02
เครื่องมือนี้ถือว่ามีประสิทธิภาพยอดเยี่ยมเลยทีเดียวครับ โดยวิธีการก็คือ การ ดึง File Reports ที่อยู่บน Server
ที่ต้องการมาเก็บไว้ และ Generate Script ในการ Deploy ไปยัง Destination Server อีกทีครับ

มาถึงขั้นตอนกันดีกว่า ซึ่งก่อนที่จะใช้งาน Tool ตัวนี้ได้จะต้องลง RS.Exe ก่อนนะครับ (Microsoft System Center)
1 Download file ConfigMgr2007SDKv40.zip จาก Microsoft Download Center แล้วติดตั้ง
2 Download file RSScripter.zip จาก sqldbatips.com ครับ
3 Run RSScripter.exe แล้วทำทำการ Set ค่า Options ดังนี้ครับ
- Report server เลือก Version ให้ตรงกับ Server ที่ต้องการ (2000,2005,2008)
- Default script directory คือ Path ที่ต้องการให้เก็บ Script ไว้
- Server ให้ Set URL ให้ถูกต้อง เช่น http://MyReportServer/ReportServer/ReportService2005.asmx
- SQL2005 RS.EXE Location คือ Path ของ RS.EXE ว่าเราได้ Install ลงที่ ไหนขึ้นอยู่กับ Version SQL ที่เรา Install ด้วย ตัวอย่างเช่น C:\Program Files\Microsoft SQL Server\90\Tools\Binn\RS.EXE
4 ทำการ GET Catalogs จะได้ผลลัพธ์ทำนองเดียวกับในรูปนะครับ


5 ทำการ Get script ได้เลยครับ
6 เมื่อได้ Script เรียบร้อยแล้ว ให้แก้ Batch file ตามต้องการคือ Destination Server ที่ต้องการ Deploy รายงานขึ้นครับ โดยแก้ในส่วนของ SET REPORTSERVER
เช่น SET REPORTSERVER=http://MyReportServer02/ReportServer
7 Run Batch ไฟล์ได้เลยครับ โดยจะมี Log file เพื่อใช้ตรวจสอบสถานะการทำงาน ก็เป็นอันสิ้นสุดกระบวนการ

Site Reference : http://www.sqldbatips.com/showarticle.asp?ID=62