Day: November 29, 2020

  • ปรับแต่ง SQL ให้เร็วขึ้น

    เมื่อคุณ Run SQL Queries แล้วมันทำงานช้าขึ้นมา เราจะต้องกลับเข้าไปดู Queries ที่เขียนว่าจะสามารถแก้ไขจุดที่เป็นต้นเหตุได้อย่างไร บทความนี้เราจะมาแนะนำดูวิธีปรับแต่ง Queries ที่ทำงานช้าให้เร็วยิ่งขึ้นกัน

    ไม่จำเป็นต้องใช้ข้อมูลทุกอย่าง

    พิจารณาว่าจำเป็นต้องใช้ SELECT * หรือไม่? ควรจะดึงเฉพาะ Column ที่ต้องการเพื่อให้ได้ผลที่รวดเร็วขึ้น แทนที่จะใช้ SELECT * เพื่อดึงข้อมูลทั้งหมดออกมา

    หากมี Table ที่มีขนาดใหญ่หรือมีข้อมูลปริมาณมากใน Table ซึ่งมีแนวโน้มที่จะทำให้ Query Engine ต้องทำงานหนักในการดึงข้อมูลทุกอย่างไปสู่ Client Side ก็อย่าลืมที่จะใช้ LIMIT เพื่อจำกัดจำนวนของผลลัพธ์ เว้นเสียแต่ว่าต้องการดูข้อมูลในทุก ๆ Row

    ระวังการใช้ NOT IN

    พยายามหลีกเลี่ยงการใช้ ‘IN’ หรือ ‘NOT IN’ เพราะการทำเช่นนี้ หมายถึง กำลัง Scan ทั้ง Table อยู่ เพราะ Query Engine จะไล่ดูไปที่ทุก Row เพื่อตรวจสอบว่า ตรงตามเงื่อนไขหรือไม่ ให้เปลี่ยนมาใช้ ‘EXISTS’ หรือ ‘NOT EXISTS’ ดู เพราะมันจะส่งผลกระทบต่อ Query Plan น้อยกว่าการใช้ ‘NOT IN’

    ใช้ Wildcards เท่าที่จำเป็น

    การใช้ Wildcards ที่จุดเริ่มต้นและจุดสิ้นสุดของ LIKE จะทำให้การ Query ช้าลง และอาจจะทำให้ได้ผลลัพธ์ที่มากเกินกว่าที่คุณต้องการ ให้ใช้ Wildcards เฉพาะเมื่อต้องการใช้งานจริง ๆ เท่านั้น โดยทั่วไปจะใช้กันเพียงแค่จุดเดียวเท่านั้น ดังนั้น จึงควรคำนึงถึงสิ่งที่ต้องการจะให้ Query Engine ทำ

    ระวัง Nested Queries

    การ Run หลาย ๆ Queries ซ้อนกันไปเรื่อย ๆ (Nested Queries) เหมือนอย่าง Function ถือเป็นสิ่งที่ไม่แนะนำให้ทำ และมันจะเร็วกว่าหากเขียนลงใน Table ลองพิจารณาการสร้าง Staging Tables ซึ่งนั่นหมายถึง เรากำลัง Join Subset ของข้อมูลที่เล็กลง ทำให้การ Query เร็วขึ้น

    ระวังการใช้ Views ซ้อน ๆ กัน

    Views เป็น Queries ที่จะ Run เมื่อเราเรียกใช้งาน หรือดูข้อมูล ซึ่งหากกำลังเรียกหลาย ๆ View หรือในกรณีที่แย่ที่สุด คือ การเรียก Views ซ้อน Views ซ้อน Views ไปเรื่อย ๆ นั่นคือ เรากำลังบอกให้ Query Engine ทำการ Run หลาย ๆ Queries เพื่อ Return Row และ Column ที่ต้องการ ลองเปลี่ยนเป็นเขียนมันลงไปใน Table หากต้องการดูข้อมูลในแต่ละ วัน/สัปดาห์/เดือน แทนที่จะใช้ Views เพื่อ Filter ข้อมูล

    แต่ถ้าหากยังมีความจำเป็นใช้ Nested Views อยู่ อยากให้ลองพิจารณาดูว่า ยังมีวิธีอื่นอีกหรือไม่ ที่สามารถทำได้ตรงกว่านี้ในการเข้าถึง Row และ Column ที่ต้องการด้วยการเขียน Queries แทนการ Run หลาย Queries เพื่อไปยัง Column ที่ต้องการจาก Nested Views ตัวสุดท้าย

    Indexes

    Indexes จะช่วยเพิ่มความเร็วให้ Queries ของเรา โดยการจัดลำดับข้อมูลเพื่อให้ Database Engine ทราบว่าจะหาข้อมูลที่ต้องการได้จากที่ไหน หรือมี Lookup Table เพื่อที่มันจะสามารถทราบตำแหน่งที่จะค้นหาได้ ประเภทของ Indexes ที่ใช้จะเป็นตัวกำหนดวิธีการทำงานของ Indexes และใช้ Indexes สำหรับ Column ที่จะใช้งานมันบ่อย ๆ ใน Queries

    อ้างอิง : https://dev.to/helenanders26/sql-201-10-ways-to-tweak-slow-running-queries-3pkb

  • แสดงข้อมูล Memory CPU Disk ด้วย C# EP.2

    สำหรับ EP นี้เราก็มาถึงวิธีการดึงข้อมูลการใช้งาน CPU กัน เพื่อไม่ให้เป็นการเสียเวลา เรามาเริ่มกันเลย

    สำหรับการดึงข้อมูลนั้น เราก็สามารถใช้งาน object PerformanceCounter ได้เหมือนเดิม โดยจะต้องระบุ parameter ที่จำเป็นดังนี้

    PerformanceCounter cpu = new PerformanceCounter("Processor", "% Processor Time", "_Total");

    และเมื่อทดลองเรียกใช้งาน จะปรากฏผลดังภาพ

    จะเห็นว่าผลลัพธ์ออกมาเป็น 0 เนื่องจากค่าที่ได้ จะเป็นค่าที่เกิดจากการเปรียบเทียบกับค่าก่อนหน้า การเรียกใช้งานครั้งแรกจึงแสดงผลเป็น 0 เสมอ เราจึงจำเป็นต้องหน่วงเวลาไว้ประมาณหนึ่ง จากนั้นจึงเรียกใช้งานอีกครั้งจึงจะได้ค่าที่ตรงตามความเป็นจริง ดังตัวอย่างต่อไปนี้

    จากตัวอย่าง หลังเรียกใช้งานครั้งแรก จะหน่วงเวลาไว้ 1 วินาที จึงเรียกใช้งานอีกครั้ง

    ซึ่งเทคนิคนี้ เอกสารของทาง Microsoft ก็ได้ระบุเอาไว้ ดังนี้

    If the calculated value of a counter depends on two counter reads, the first read operation returns 0.0. Resetting the performance counter properties to specify a different counter is equivalent to creating a new performance counter, and the first read operation using the new properties returns 0.0. The recommended delay time between calls to the NextValue method is one second, to allow the counter to perform the next incremental read.

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

    โดยผลลัพธ์จากโค้ดด้านบน ก็จะแสดงการทำงานของ CPU ทุก 1 วินาทีเป็นจำนวน 10 ครั้ง

    จะเห็นว่าการดึงข้อมูลการใช้งาน CPU ไม่ได้ยุ่งยาก แค่มีทริคนิดเดียวตรงที่จะต้องมีการเรียก NextValue() 2 ครั้ง และต้องมีการหน่วงเวลาก่อนการเรียกครั้งที่ 2 ก็จะได้ผลลัพธ์ที่ถูกต้อง

    แล้วพบกันใน EP หน้า สวัสดีครับ


    อ้างอิง

  • Database Design Tools (2)

     DbVisualizer

    DbVisualizer เป็น Tool ที่ออกแบบมาสำหรับการจัดการ Database มัน Integrate เข้ากับหลาย Databases และสามารถทำงานกับ Operating System หลัก ๆ ได้ทั้งหมด

    DbVisualizer มีการ Integrate Interface ที่ใช้งานง่าย มันสามารถถูกใช้เพื่อเรียกดู Schema ที่ซับซ้อนและ Data ที่แก้ไข Interface ช่วยให้ User สามารถทำสิ่งต่าง ๆ เช่น Drag & Drop, Pin Tabs, Detach Tabs ใน Windows ที่แยกออกไป รวมทั้ง Inline Edit

    Server Management

    DbVisualizer ช่วยให้ User สามารถจัดการกับ Instances, Security และ Session Storage ของ Database Server ,User ยังสามารถ Schedule และ Execute การดำเนินการต่าง ๆ กับ Oracle, MySQL, PostgreSQL และ SQL Server ได้

    Comparing

    Tool นี้ช่วยให้ User สามารถเปรียบเทียบ Objects อย่าง Table Data, Scripts หรือ DDL ของ 2 Tables หรือ Procedures ได้ โดย Interface ที่ทำการเปรียบเทียบนั้น Clean และสามารถเข้าใจได้ง่าย

    SQL Tools

    DbVisualizer มี Tools อื่น ๆ ที่มีประโยชน์อีก เช่น:

    • SQL Commander: Query Tool ที่รองรับ Editors และ Result Sets ต่าง ๆ
    • Query Builder: ช่วยให้ User สามารถเห็นการ Create และ Execute Queries ได้อย่างชัดเจน
    • Explain Plan: Tool ที่ใช้สำหรับวิเคราะห์ว่าจะใช้ Query อย่างไรใน Database แต่ Feature นี้สามารถใช้งานได้กับบาง Database เท่านั้น

    Tool นี้ Integrate SQL History Tool ซึ่งช่วยให้ User สามารถดู Query ก่อนหน้านี้ได้

    Supported Databases

    DbVisualizer มาพร้อมกับการ Integrate กับหลาย Databases หลัก ๆ ได้ และสามารถ Connect กับ Database โดยใช้ JDBC Drivers

    DbVisualizer เป็น Tool ที่ยอดเยี่ยมสำหรับการจัดการ Database มันมี Interface ที่เป็นมิตรกับ User และสามารถทำงานได้กับ Operating Systems ยอดนิยมต่าง ๆ แต่ ผู้ที่ใช้ Free Version ของ Tool นี้ ไม่สามารถใช้งานใน Feature ที่สำคัญ ๆ ได้ ในขณะที่ Paid Version ก็มีราคาที่ค่อนข้างสูง

    Vertabelo

    Vertabelo เป็น Database Design Tool แบบ Online ที่ช่วยให้สมาชิกในทีมสามารถทำงานร่วมกันใน Projects ได้อย่างง่ายดาย เนื่องจากมันอยู่ใน Online Platform จึงทำให้ User สามารถ Share การเข้าถึงไปยังสมาชิกในทีมผ่านทาง Email ได้

    Vertabelo มีระดับการเข้าถึงที่แตกต่างกันถึง 3 Levels คือ Owner, Editor และ Viewer , Vertabelo มี Interface ที่ทั้ง Clean และใช้งานง่าย คุณสามารถสลับไป-มาระหว่าง Models ต่าง ๆ โดยที่ไม่ต้องออกจาก Design Area

    Tool นี้ได้ Integrate Quick Search และ Fast Navigation Menu ซึ่ง Features เหล่านี้มีประโยชน์อย่างมากเมื่อต้องทำงานกับ Databases ขนาดใหญ่

    Vertabelo อนุญาตให้ User สามารถ Reverse Engineer Schema ได้จาก Database แต่น่าเสียดายที่ Reverse Engineer Tool ไม่มี Graphical Interface หากต้องการ Run มันคุณจะต้องไปที่ Website และใช้ Command Line จากที่นั่น

    ข้อเสียอีกอย่างหนึ่งของ Reverse Engineer Tool ก็คือคุณต้องจัดแต่ง Tables ให้เรียบร้อยด้วยตนเอง หลังจากการ Upload ขึ้นไป

    Model

    Vertabelo ใช้ Model เพื่อบันทึก Design โดย Model สามารถถูก Share ภายในทีมเป็น Document ซึ่งมี Access Levels ที่แตกต่างกัน โดยที่:

    • Model สามารถถูก Share ออกไปนอก Vertabelo ได้โดยใช้ Public Link
    • พวกมันสามารถถูก Clone เพื่อที่จะสามารถ Track Version ก่อนหน้าของ Design ได้
    • พวกมันคล้ายกับ DbSchema Project Files

    Supported Databases

    Vertabelo รองรับเฉพาะ 8 Databases หลัก ๆ: Oracle, MySQL, PostgreSQL, SQLite, IBM DB2, SQL Server, HyperSQL และ Amazon Redshift

    Vertabelo เป็น Database Designer ที่ดี มันมี Interface ที่เป็นมิตรกับ Users และมีความทันสมัย สามารถเข้าถึงได้ง่ายและสามารถ Share ในทีมได้ง่าย แต่ Database ที่รองรับมีจำนวนน้อย และ Reverse Engineer Tool ที่ไม่ค่อยดีนัก

    อ้างอิง : https://www.techstarthailand.com/blog/detail/Top-4-Database-Design-Tools/1324

  • Database Design Tools

    Database Design ที่ดีจะช่วยลดงานในส่วน Maintenance ลงได้อย่างมาก และลดโอกาสเกิดข้อผิดพลาดใน Project  เนื่องจากแต่ละ Project  มี Requirements ที่แตกต่างกัน ทำให้การค้นหา Tools ที่เหมาะสมอาจเป็นเรื่องยาก ดังนั้นบทความนี้จะมาแนะนำ Database Design Tools ที่คาดว่าจะมีประโยชน์กับคุณ

    Toad Data Modeler

    Toad Data Modeler เป็น Database Modeling Tool ที่ใช้ Automation, Intuitive Workflows และ Built-in Expertise อีกทั้ง Toad ยังเป็น Database Solution ยอดนิยมที่ Community ของมันมีการเติบโตอย่างต่อเนื่อง

    Toad มี User Interface ที่ช่วยให้ User เข้าใจ Databases และ Table Relationships ได้ดียิ่งขึ้น มันสามารถสร้าง Data Models ทั้งแบบ Logical และ Physical และยังสามารถ Map Attributes ทั้งหมดของ Database ใน Physical Model ให้โดยอัตโนมัติ

    Models และ Synchronization

    Toad ช่วยให้ User สามารถ Convert Logical Model เป็น Physical Model ที่เลือกไว้ (เช่น Oracle, SQL Server เป็นต้น) และสามารถ Convert Physical Model ที่เลือกไว้ เป็นรูปแบบอื่น อย่างเช่น Convert Oracle Model ไปเป็น SQL Server

    Tool นี้จะมี Feature ของการ Synchronization อีกทั้ง User สามารถเปรียบเทียบ Models กับ Database และสร้าง Migration Scripts ได้ นอกจากนี้ยังช่วยให้ User สามารถ Update Model จาก Database ได้โดยตรง

    Toad สามารถทำ Processes อย่าง การเปรียบเทียบ Data และ Schema ได้โดยอัตโนมัติ

    SQL Code Generation

    Toad สามารถสร้าง Database DDL Scripts ที่มีความซับซ้อน นอกจากนี้ยังสามารถเปิด SQL Scripts ที่สร้างขึ้นใน Application ที่เกี่ยวข้องได้

    Reporting

    มันสามารถสร้าง Report ในรูปแบบของ HTML, RTF หรือ PDF ได้

    Supported Databases

    Tool สามารถ Connect กับ Databases ที่หลากหลาย เช่น Oracle, SAP, MySQL, SQLServer, PostgreSQL และอื่น ๆ อีกมากมาย

    จะเห็นว่า Toad เป็น Platform ที่มีประโยชน์อย่างยิ่งสำหรับ Database Modeling ที่มี Features ที่ยอดเยี่ยมอยู่มากมาย แต่มี User Interface ที่ใช้งานได้ค่อนข้างยาก และ License มีราคาค่อนข้างสูง

    DbSchema

    DbSchema เป็น Visual Tool สำหรับการออกแบบและการจัดการ Database ที่ซับซ้อน โดย Tool นี้สามารถ Integrate เข้ากับ Operating Systems หลัก ๆ ทั้งหมดได้

    DbSchema มาพร้อมกับ User Interface ที่เข้าใจง่ายและช่วยลดความยุ่งยากในการออกแบบ Database ทุกอย่างถูกจัดเตรียมไว้พร้อมแล้วใน Layouts ซึ่งมีประโยชน์อย่างยิ่งเมื่อต้องจัดการกับ Database ขนาดใหญ่ พวกมันช่วยให้ User สามารถ Focus เฉพาะส่วนที่ต้องการของ Database ได้

    ตัว Interface จะช่วยทำให้ User สามารถ เรียกดู Diagram ได้อย่างอิสระ, Drag & Drop Tables ใน Layouts หรือ แก้ไข Table Data ด้วยการ Double-Click

    DbSchema สามารถทำการ Reverse Engineer Schema จาก Database ที่มีอยู่ได้อย่างง่ายดาย

    Project File และ Schema Synchronization

    DbSchema จะเก็บ Schema Design ลงใน Project File ซึ่งการทำงานกับ Project File จะช่วยให้ User สามารถ Modify Schema Design ได้โดยไม่ต้อง Connect กับ Database ส่วนการเปลี่ยนแปลงต่าง ๆ จะถูกบันทึกลงในเฉพาะ Project File เท่านั้น

    เมื่อ Connect กับ Database อีกครั้ง User จะเปรียบเทียบความแตกต่างระหว่าง Project File และ Database จากนั้นก็ Synchronize พวกมัน

    Sharing

    DbSchema Project Files สามารถถูก Share ภายในทีมได้อย่างง่ายดายโดยใช้ GIT หรือ Versioning System อื่น ๆ อีกทั้ง Schema 1 ตัว สามารถถูก Migrate ผ่านหลาย ๆ Servers ได้

    สำหรับ Project File จะอยู่ในรูปแบบ XML ซึ่งง่ายต่อการอ่านหรือแก้ไขด้วย Text Editor ต่าง ๆ

    Visual Data Tools

    DbSchema สามารถ Integrate กับ 3 Data Tools ดังต่อไปนี้:

    • Relational Data Browse: จะช่วยให้ User สามารถเรียกดู Data ได้จากหลาย Tables พร้อมกัน
    • Visual Query Builder: สามารถสร้าง SQL Queries ที่ซับซ้อนได้
    • SQL Editor: เป็น Editor ที่มีประสิทธิภาพ ที่ใช้สำหรับ Text Autocompletion

    Supported Databases

    DbSchema มาพร้อมกับการ Integrate กับ Databases ส่วนใหญ่ได้ ส่วน Databases อื่น ๆ สามารถ Connect ผ่าน JDBC Drivers

    DbSchema เป็น All-in-one Database Designer & Manager มันเป็น Tool ที่มีประโยชน์อย่างมากโดยเฉพาะการจัดการ Databases ที่ซับซ้อน แต่มี Forms และ Reports Engine ที่ค่อนข้างใช้งานยาก

    อ้างอิง : https://www.techstarthailand.com/blog/detail/Top-4-Database-Design-Tools/1324

  • SQL พื้นฐานสำหรับ Data Analyst

    สำหรับคนที่มีพื้นฐานหรือเคยใช้งาน SQL มาบ้างแล้ว จะรู้จักคำสั่ง SQL พื้นฐานต่างๆ มีบางส่วนที่ไม่ค่อยใช้งานมัน แต่มันมีประโยชน์อย่างยิ่งโดยเฉพาะสำหรับ Data Analyst เช่น

    Distinct

    ในบางครั้ง ถ้าต้องการ Records ของข้อมูลที่ไม่ซ้ำกัน สามารถใช้ Distinct มาช่วยเพื่อให้ได้ข้อมูลที่ไม่ซ้ำกัน โดยใช้งานกับ Columns

    Select distinct fac_id from student

    IN

    IN Operator ช่วยให้สามารถทดสอบได้ว่า Expression นั้นตรงกับ Value ใด ๆ ใน List ที่ระบุหรือไม่ มันจะช่วยลดการใช้งาน “OR” หลาย ๆ เงื่อนไข

    select * from student where campus_id in ('01','02', '03')

    Having

    มันเป็นการใช้เงื่อนไขกับกลุ่มของผลลัพธ์เพื่อกรองข้อมูลออกมา แต่คำถามที่น่าสนใจก็คือ ทำไมถึงไม่ใช้ “WHERE” ที่หลาย ๆ คนคุ้นเคยกันล่ะ แน่นอนว่าเราใช้ “WHERE” เพื่อระบุเงื่อนไขให้กับ Columns ที่เราเลือก ในขณะที่ “HAVING” จะถูกใช้เพื่อระบุเงื่อนไขให้กับ Groups ที่ถูกสร้างขึ้นโดย “GROUP BY” Clause

    “HAVING” Clause จะต้องถูกใช้ตามหลัง “GROUP BY” Clause แต่จะอยู่ก่อน “ORDER BY” Clause

    ในตัวอย่างด้านล่างนี้ SQL HAVING Clause จะ Filter ผลลัพธ์เฉพาะ คณะที่มีจำนวน นักศึกษา มากกว่า 500 คน เท่านั้น

    select fac_id, count(student_id)
    from student
    group by fac_id
    having count(student_id) > 500

    LIMIT

    “LIMIT” ถูกใช้เพื่อจำกัดหรือกำหนดจำนวนของผลลัพธ์ตามจำนวนที่แน่นอน เนื่องจากในบางครั้งก็จำเป็นต้องจำกัดจำนวนของผลลัพธ์ของการ Query

    select * from student LIMIT 10

    Wild Cards

    โดยทั่วไปแล้ว Wild Card เป็นวิธีในการค้นหาตัว Characters ผ่าน Strings ซึ่ง Wild Card ใช้ “LIKE” Operator โดย Wild Card ที่เป็นที่รู้จักและถูกใช้งานกันมากที่สุด ก็คือ “%” และ “_”

    • “%” : หมายถึง ศูนย์หรือมากกว่าหนึ่ง Character

    ในตัวอย่างด้านล่าง เรากำลังบอก SQL ให้ดึงข้อมูลจาก Table “student” ที่ใน Column “name” เริ่มต้นด้วยตัวอักษร “w” แล้วตามต่อด้วยตัวอักษรอะไรก็ได้และมีจำนวนกี่ตัวก็ได้

    select * from student where name like 'w%'

    อีกตัวอย่างหนึ่ง ซึ่งเรากำลังบอก SQL ให้ดึงข้อมูลจาก Table “student” ที่ใน Column “name” ลงท้ายด้วยตัวอักษร “wan” และสามารถเริ่มต้นด้วยตัวอักษรอะไรก็ได้และมีจำนวนกี่ตัวก็ได้

    select * from student where name like '%wan'
    • “_” : หมายถึง Character เพียงตัวเดียวเท่านั้น

    ใน Query ด้านล่าง จะทำการดึงข้อมูลที่เริ่มต้นด้วยตัวอักษรอะไรก็ได้ 1 ตัว แล้วตามด้วยตัวอักษรต่าง ๆ ตามรูปแบบ  “_ilaiwan”

    select * from student where name like '_ilaiwan'

    หรีอต้องการดึงผลลัพ์ธ์จาก Column “name” ที่เริ่มต้นด้วย “wilaiwa” แล้วตามด้วยตัวอักษรอะไรก็ได้อีก 1 ตัว 

    select * from student where name like 'wilaiwa_'

    และสามารถใช้งานด้วยการรวมทั้ง 2 อย่างเข้าด้วยกันเพื่อการกำหนดผลลัพธ์ที่เจาะจงมากขึ้น เช่น ดึงข้อมูลจาก Column “email” ที่ขึ้นต้นด้วยจำนวนตัวอักษรกี่ตัวก็ได้ และลงท้ายด้วยอักษรเพียงตัวเดียว

    select * from student where email like '%.co_'

    อ้างอิง : https://www.techstarthailand.com/blog/detail/SQL-Beyond-The-Basics/1296