Я застрял с оптимизацией этого SQL-запроса в реляционной алгебры:Застрял с Logical SQL оптимизации запросов в реляционной алгебре (OR в WHERE)
SELECT * FROM R1, R2, R3, R4
WHERE (R1.A = '1' OR (R2.B = '2' AND R3.C = R4.C)) AND R4.D = '4'
Я перевел его к следующему утверждению реляционной алгебры:
σ{R1.A='1' ∨ (R2.B='2' ∧ R3.C=R4.C) ∧ R4.D='4'}(R1 × R2 × R3 × R4)
Моя проблема в том, что я не знаю, как оптимизировать оператор where. Я знаю, что могу преобразовать последнее условие в σ{R4.D='4'}(R4)
и перенести его вниз по дереву непосредственно на R4. Существуют определенные правила оптимизации, однако я действительно не знаю, как обращаться с OR. Rules for Logical Query Optimization
Но как я могу оптимизировать остальные места? Я думал об использовании распределительных правило, чтобы превратить его в КНФ,
(R1.A='1' ∨ R2.B='2') ∧ (R1.A='1' ∨ R3.C=R4.C)
, который позволил бы мне обрабатывать оба положение независимо друг от друга. Но я не буду продолжать, особенно в каком порядке я должен присоединиться или сделать декартовую продукцию.
Вот оператор-дерево, я рисую:
Что именно вы имеете в виду "оптимизации"? И что это связано с SQLite? –
@CL Оптимизация означает использование логических правил реляционной алгебры, чтобы уменьшить стоимость оценки и оптимизировать порядок запросов операторов, например. переместите выделение до упора до конца. С меткой sqlite, поскольку SQL-синтаксис предназначен для sqlite (я использую sqlite как систему db) Примеры: http://www.cs.uni-paderborn.de/ fileadmin/Informatik/AG-Boettcher/Lehre/WS_07_08/dbis1/dbis1k2-logic-query-optimization.pdf –
Возможно, я ошибаюсь, но в вашем переводе вы опустили одну пару скобок. В исходном запросе у вас есть: '(R1.A = '1' OR (R2.B = '2' AND R3.C = R4.C)) AND R4.D = '4'' , который должен дать вам : '(R1.A = '1' ∨ (R2.B = '2' ∧ R3.C = R4.C)) ∧ R4.D = '4'' –