ฉันมีขนาดใหญ่คอลัมน์ร้านโต๊ะนั้นได้บ่อยรายงานแล้ว ฉันไม่กินที่ปรับปรุงโดยตรงเข้ามาในแหล่งที่โต๊ะเพราะนั่นเพราะในที่สุดคดีเล็กๆจำนวนของปรับปรุงต้นเหตุของคนนั่งครบ\n ทุกเก้าอี้โครพาร์ติชันที่สร้างใหม่. แทนที่จะเป็นฉันสายข้อมูลปรับปรุงการปรับปรุงโต๊ะและตอน query เวลาฉันรวมทั้งสองอย่าง ในฝึกซ้อมมันทำงานอย่างดี
ดังนั้นทำอะไรง่ายๆฉันจะโยนมันในมุมมอง users_view
.
CREATE OR REPLACE VIEW users_view AS (
SELECT * FROM users
UNION ALL
SELECT * FROM user_changes
QUALIFY ROW_NUMBER() OVER(
PARTITION BY id
ORDER BY last_updated_at DESC
) = 1
)
ทั้งสองคน users
โต๊ะแล้ว user_changes
โต๊ะเดียวกันรูปแบบเช่นเดียวในบางพื้นที่ดิสก์องการปรับแต่ง ด้วยวิธีนี้คุณสามารถใช้ predicate pushdown ในมุมมองเดียวที่จะเลือกผู้ใช้ภายในที่ถูกต้องพื้นที่ดิสก์. เอาเป็นว่านี่คือ account_id
.
SELECT * FROM users_view
WHERE account_id = 1234
แต่ users
โต๊ะมันค่อนข้างกว้างใหญ่กว่า user_changes
โต๊ะและฉันอยากจะกดดันมากขึ้ predicates ลงไป users
โต๊ะโดยไม่ได้กดดันเพิ่มเติม predicates ลงไป user_changes
โต๊ะด้วย ทำไมเหรอ? เพราะว่าตรงกับที่ users
โต๊ะขณะที่ 98%ถูกต้องมีป positives/ได้ฟิล์มนั่น รายละเอียดจาก user_changes
ไม่ต้องการเพื่อนที่ช่วยแก้ไขความเข้าใจผิด อะไรนี่มันจะดูเหมือนอยู่นอกของมุมมองนี้คือ:
SELECT * FROM (
SELECT * FROM users
WHERE account_id = 1234 AND city = 'Chicago'
UNION ALL
SELECT * FROM user_changes
WHERE account_id = 1234
QUALIFY ROW_NUMBER() OVER(
PARTITION BY id
ORDER BY last_updated_at DESC
) = 1
)
WHERE account_id = 1234 AND city = 'Chicago'
ที่น่ารังเกียจที่มันดูมันมากกว่า performant. ทั้งสภาพความสามารถถูกปรับใช้กันมากที่ใหญ่กว่า users
โต๊ะแต่เพียง unchanging เงื่อนไขสามารถถูกปรับใช้การ users_changes
โต๊ะด้วย i.e. ผู้ใช้งานอาจจะเปลี่ยนเมืองแต่เป็นของผู้ใช้สามารถเปลียนแปลงบัญชี ที่สองวิ่งของเงื่อนไขหลังจากสมาพันธ์คือต้องจับความเปลี่ยนแปลง user_changes
แนะนำตัว
นี่คือ cumbersome ต้องเขียนและยิ่งกว่าดังนั้นเป็นการสืบค้นกลายเป็นค่อนข้างซับซ้อนและกับการค้นหาช่างก่อสร้างเข้ามาเกี่ยวข้อง ดังนั้นฉันกำลังมองหาทางที่จะโน้มน้าวในภาษา sql นักวางแผนที่จะข้าม predicate pushdown ของบางอย่า predicates บของฉัน user_changes
โต๊ะโดยไม่ต้องการรูปแบบการสืบค้นแบบนี้ เข้าท่าดีนิเราจะทำทุกอย่างที่เราทำกับมุมมอง
PSUEDO ภาษา SQL. PSUEDO ภาษา SQL. PSUEDO ภาษา SQL
อยู่ในนความฝันของผฉันจะบอกกับการค้นหาสมุดบันทึกมันสามารถใช้พื้นที่ดิสก์ predicates,และที่ไหนที่มันสามารถใช้คนที่ไม่ใช่พื้นที่ดิสก์ predicates.
CREATE OR REPLACE VIEW users_view AS (
SELECT * FROM (
SELECT * FROM users
%PARTITION_PREDICATES%
%NON_PARTITION_PREDICATES%
UNION ALL
SELECT * FROM user_changes
%PARTITION_PREDICATES%
QUALIFY ROW_NUMBER() OVER(
PARTITION BY id
ORDER BY last_updated_at DESC
) = 1
)
%PARTITION_PREDICATES%
%NON_PARTITION_PREDICATES%
)
SELECT * FROM users_view
WHERE account_id = 1234 AND city = 'Chicago'
มีไอเดียแปลกๆพวก?