เลือก Predicate Pushdown ต้องมุมมอง

0

คำถาม

ฉันมีขนาดใหญ่คอลัมน์ร้านโต๊ะนั้นได้บ่อยรายงานแล้ว ฉันไม่กินที่ปรับปรุงโดยตรงเข้ามาในแหล่งที่โต๊ะเพราะนั่นเพราะในที่สุดคดีเล็กๆจำนวนของปรับปรุงต้นเหตุของคนนั่งครบ\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'

มีไอเดียแปลกๆพวก?

1

คำตอบที่ดีที่สุด

1

คุณสามารถเพิ่มนามสกุลเพิ่มเติคอลัมน์ src สำหรับ determining แหล่งที่โต๊ะแล้วห่อ predicates ในกรณี:

select * from
(
SELECT u.*, 'users' as src FROM users u
union all
SELECT uc.*, 'users_changes' as src FROM users_changes uc
) 
WHERE --applied only to users
      case when src  = 'users' 
                 then city = 'Chicago' --predicate wrapped in case
           else true
       end
  --applied to all
  AND account=12345 
2021-11-23 14:58:40

เจ๋งมากรู้หรอก! ขอบคุณ!
micah

@ไมก้าคุณสามารถมีการตัดคำกับทุก predicates เดียวในคดีใช้แล้วหรือหรือ: then city = 'Chicago' AND one_more_condition AND some_other_condition
leftjoin

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่