Query on View ทำงานช้ากว่าการสืบค้นโดยตรง - ใน Oracle

ฉันพยายามสร้างมุมมองด้วยพารามิเตอร์เพื่อรับข้อมูลแบบไดนามิก
(ฉันไม่สามารถใช้เงื่อนไข WHERE ได้เนื่องจากคำสั่ง select นั้นเปลี่ยนแปลงตามพารามิเตอร์)

สำหรับสิ่งนี้ ฉันเขียนขั้นตอนที่ส่งคืนข้อมูลที่จำเป็นให้ฉันเป็นประเภทอ็อบเจ็กต์ oracle

FUNCTION get_data(p_pk_id  NUMBER, p_tab_type VARCHAR2)
RETURN M_TYPE_DATA_TAB
AS
v_table_collection M_TYPE_DATA_TAB;
BEGIN

-- my sql query which will change based on the params

RETURN v_table_collection;
END;

และฉันเรียกใช้แบบสอบถามแบบใช้เลือกดังนี้

SELECT * FROM TABLE(get_data(12345, 'MYTAB'));

ซึ่งให้ข้อมูลแก่ฉันภายใน น้อยกว่า 1 วินาที

สำหรับคำสั่ง select เดียวกันที่ฉันได้สร้างมุมมองเป็น

CREATE OR REPLACE VIEW my_view
AS SELECT * FROM TABLE(get_data(12345, 'MYTAB'));

ถ้าฉันสอบถามมุมมอง

SELECT * FROM my_view

ใช้เวลา มากกว่า 6 วินาที เพื่อรับข้อมูลเดียวกัน

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


person Madhusudhan Dollu    schedule 12.12.2013    source แหล่งที่มา
comment
กรณีทดสอบที่สามารถทำซ้ำได้อย่างเต็มที่จะช่วยได้มากที่นี่ โดยทั่วไปการเพิ่ม select * from ไว้ด้านบนของบางสิ่งก็ไม่สำคัญ เราจำเป็นต้องรู้อย่างแน่ชัดว่าอะไรที่ทำให้กรณีของคุณพิเศษ   -  person Jon Heller    schedule 13.12.2013
comment
@jonearles: ดังที่ Guntram Blohm พูดเมื่อฉันค้นหาจากมุมมองมันกำลังทำการสแกนตารางแบบเต็มโดยที่เป็นการสืบค้นโดยตรงโดยใช้ดัชนีทั้งหมดของตารางฐานเพื่อรับข้อมูลเร็วขึ้น   -  person Madhusudhan Dollu    schedule 13.12.2013
comment
มีประโยชน์มาก แต่เรายังไม่เข้าใจถึงต้นตอของปัญหา ฉันต้องการทราบว่าทำไมจึงใช้ FTS แทนดัชนี   -  person Jon Heller    schedule 13.12.2013


คำตอบ (2)


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

ลองทำ:

 SELECT/*+gather_plan_statistics*/ * FROM TABLE(get_data(12345, 'MYTAB'));

จากนั้นทำ:

 SELECT/*+gather_plan_statistics*/ * FROM my_view

สิ่งเหล่านี้จะทำให้คุณมีแผนการดำเนินการจริงสำหรับใบแจ้งยอด

อย่างไรก็ตาม คุณจะต้องเลือกมุมมอง V_$SQL_PLAN และ V_$SQL เพื่อใช้ Gather_plan_statistics ดังที่กล่าวข้างต้น

person Tomás    schedule 12.12.2013
comment
โปรดทราบว่าจำเป็นต้องมีการอนุญาตบน V_$SQL... มุมมอง มากกว่า V$SQL... เนื่องจากมุมมอง V$SQL เป็นคำพ้องความหมายจริงๆ อย่างไรก็ตาม คุณสามารถเลือกจากคำพ้องความหมายเหล่านั้นได้ - person Tomás; 13.12.2013

Google เพื่อ "อธิบายแผน" และตรวจสอบแผนการดำเนินการสำหรับทั้งสองข้อความ หากไม่มีฟังก์ชันที่สมบูรณ์ก็ยากที่จะพูดอะไร แต่ฉันคิดว่าเครื่องมือเพิ่มประสิทธิภาพจะทำ "การเพิ่มประสิทธิภาพทั่วไป" บางอย่างในมุมมอง และเมื่อคุณเลือกจากมุมมอง ระบบจะใช้การเพิ่มประสิทธิภาพทั่วไปนั้น เมื่อคุณเลือกโดยตรง โดยไม่มีมุมมอง เครื่องมือเพิ่มประสิทธิภาพจะพิจารณาภายในของฟังก์ชันของคุณด้วย

ลองอธิบายแผนข้อความต่างๆ โดยเลือกจากมุมมอง "ส่วนภายใน" ที่เรียกใช้ฟังก์ชันเหมือนกันในแต่ละกรณีหรือไม่

person Guntram Blohm    schedule 12.12.2013
comment
ใช่ ฉันเห็นความแตกต่างอย่างมากในแผนการอธิบายสำหรับการดูและการสืบค้นโดยตรง สืบค้นโดยตรงโดยใช้ดัชนีทั้งหมดบนโต๊ะโดยที่มุมมองทำการสแกนตารางแบบเต็ม - person Madhusudhan Dollu; 13.12.2013
comment
ในส่วนภายในของฟังก์ชัน โดยที่เงื่อนไขจะแตกต่างกันไปตามพารามิเตอร์ พวกเขาจะถูกผนวกแบบไดนามิกและแบบสอบถามสุดท้ายจะถูกดำเนินการเพื่อดึงผลลัพธ์ - person Madhusudhan Dollu; 13.12.2013