คุณสามารถใช้หนึ่งในสองแบบสอบถามนี้เพื่อดูการอ่านตรรกะทั้งหมดและการอ่านทางกายภาพทั้งหมด
SELECT DB_NAME(st.dbid) Db,
OBJECT_NAME(st.objectid, st.dbid) Prc,
qs.execution_count,
qs.total_logical_reads,
qs.total_physical_reads,
qs.statement_start_offset,
qs.statement_end_offset,
st.text
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st;
SELECT DB_NAME(database_id) Db,
OBJECT_NAME(object_id, database_id) Prc,
execution_count,
total_logical_reads,
total_physical_reads
FROM sys.dm_exec_procedure_stats ps;
คนแรกแบ่งคำสั่งนี้ลงโดยคนที่สองนับในขั้นตอนทั้งหมด
การอ่านแบบฟิสิคัลถูกอ่านกับดิสก์ส่วนการอ่านแบบลอจิคัลนั้นไม่ตรงกับหน่วยความจำ คุณสามารถใช้สิ่งนี้เพื่อหาว่าโพรซีเดอร์หรือคำสั่งใดที่แพงที่สุดในระบบของคุณและลองปรับมัน
โปรดทราบว่าในขณะที่การอ่านเชิงตรรกะมีราคาถูกกว่าการอ่านทางกายภาพอย่างมีนัยสำคัญพวกเขายังคงมีราคาแพงดังนั้นการลดจำนวนของพวกเขา (เช่นโดยการเพิ่มดัชนีที่เหมาะสม) สามารถทำให้แบบสอบถามของคุณทำงานได้เร็วขึ้นมาก
มีคอลัมน์เพิ่มเติมจำนวนมากใน DMVs ด้านบนที่คุณอาจพบว่าน่าสนใจเช่นกัน
ดัชนีช่วยลดการอ่านเชิงตรรกะได้อย่างไร
ใน SQL Server ข้อมูลทั้งหมดจะถูกจัดระเบียบในบล็อกขนาด 8KB บล็อกเหล่านี้เรียกว่า "หน้า"
ทุกตารางมีหน้า "เมตา" ที่มีข้อมูลเกี่ยวกับโครงสร้างของตารางเช่นเดียวกับหน้าพาต้า หากไม่มีดัชนีอยู่และคุณเรียกใช้SELECT * FROM tbl WHERE Id = 7คิวรีเช่นSQL Server ต้องค้นหาแถวนี้หรือแถวเหล่านี้ในตารางทั้งหมด ดังนั้นจะอ่านทีละหน้าวนรอบทุกแถวในแต่ละหน้าเพื่อกำหนดแถวที่เหมาะสมกับWHEREอนุประโยค ดังนั้นหากตารางต้องการเก็บ 1,000,000 หน้าแบบสอบถามนี้จะใช้เวลา 1,000,000 อ่านตรรกะในการดำเนินการ
หากคุณมีดัชนี SQL Server จะเรียงลำดับข้อมูลตามตรรกะภายในหน้าและสร้างรายการที่เชื่อมโยงระหว่างหน้า สิ่งนี้ทำให้สามารถเรียกใช้ORDER BYคิวรีที่มีการเรียกใช้โดยไม่มีการดำเนินการเรียงลำดับราคาแพง แต่สิ่งสำคัญคือการเรียงลำดับ SQL Server จะเพิ่มB + Treeลงในตาราง ต้นไม้ B + เป็นโครงสร้างเทียบได้กับดัชนีในหนังสือซึ่งการค้นหาคำหลักที่เฉพาะเจาะจงทำให้ฉันสามารถข้ามไปยังหน้าที่มีคำหลักได้โดยตรง หนังสือทั่วไปมีเพียงระดับดัชนีเดียวในขณะที่ B + Tree สามารถมีได้หลายระดับ ลองนึกถึงหนังสือเล่มใหญ่ที่มีดัชนีตัวเองยาวหลายหน้า ในกรณีเช่นนี้การเพิ่มเลเยอร์ดัชนีเพิ่มเติมที่บอกเราในหน้าซึ่งSจะพบคำดัชนีที่ขึ้นต้นด้วย
ต้นไม้ B + ได้รับการปรับให้มีระดับน้อยที่สุดเท่าที่จะเป็นไปได้ในขณะเดียวกันก็ให้คุณสมบัติที่บันทึกใด ๆ ในดัชนีสามารถพบได้โดยการอ่านหนึ่งหน้าต่อระดับดัชนี ดังนั้นสมมติข้างต้นแบบสอบถามเมื่อคุณมีดัชนีเรียงตามWHERE Id = 7 Idสมมุติว่าดัชนีมี 5 ระดับ ตอนนี้เพื่อค้นหาระเบียนทั้งหมดที่ตรงกับแบบสอบถามนี้ฉันต้องอ่านหนึ่งหน้าต่อระดับดัชนี (นั่นคือ 5 หน้า) ซึ่งเรียกว่า "ดัชนีค้นหา" หากมีหลายระเบียนที่เหมาะสมกับการเรียกเก็บเงินฉันอาจต้องทำตามดัชนีที่เรียงไว้สักครู่เพื่อดึงข้อมูลทั้งหมดของพวกเขา แต่สมมติว่ามีเพียงหนึ่งระเบียน
ดังนั้นหากไม่มีดัชนีที่ใช้เคียวรีนั้นจำเป็นต้องอ่าน 1,000,000 ครั้งโดยที่ดัชนีนั้นต้องการการอ่าน 5 ครั้ง แม้ว่าการอ่านแบบโลจิคัลคือการดำเนินการในหน่วยความจำ แต่ก็มีค่าใช้จ่ายจำนวนมาก แต่ในความเป็นจริงแล้วมันเป็นการดำเนินการที่แพงที่สุดในการสืบค้นที่ไม่สำคัญเหมือนที่กล่าวมาข้างต้น ดังนั้นการลดปริมาณการอ่านเชิงตรรกะที่จำเป็นโดยปัจจัย 200,000 จะช่วยเพิ่มความเร็วในการสืบค้นของคุณด้วยปัจจัยที่คล้ายกัน
ดังนั้นการอ่านแบบลอจิคัลจะไม่เทียบเท่ากับการสแกนแบบตาราง แต่การสแกนแบบตารางทำให้เกิดการอ่านแบบลอจิคัลมากกว่าการค้นหาดัชนี