PostgreSQL Antipatterns: Hononga kino me OR

Kia tupato ki nga mahi e kawe mai ana i nga parepare...
Ma te whakamahi i tetahi patai iti hei tauira, me titiro ki etahi huarahi mo te ao ki te arotau i nga patai i roto i te PostgreSQL. Mena ka whakamahia e koe, kaore ranei kei a koe, engari he mea pai kia mohio koe mo ratou.

I etahi putanga o muri mai o te PG ka rereke pea te ahuatanga na te mea ka kaha ake te mohio o te kaitoha, engari mo te 9.4/9.6 he rite tonu te ahua, penei i nga tauira i konei.

Me tango he tono tino pono:

SELECT
  TRUE
FROM
  "Документ" d
INNER JOIN
  "ДокументРасширение" doc_ex
    USING("@Документ")
INNER JOIN
  "ТипДокумента" t_doc ON
    t_doc."@ТипДокумента" = d."ТипДокумента"
WHERE
  (d."Лицо3" = 19091 or d."Сотрудник" = 19091) AND
  d."$Черновик" IS NULL AND
  d."Удален" IS NOT TRUE AND
  doc_ex."Состояние"[1] IS TRUE AND
  t_doc."ТипДокумента" = 'ПланРабот'
LIMIT 1;

mo nga ingoa tepu me te maraKo nga ingoa "Russian" o nga mara me nga tepu ka taea te mahi rereke, engari he mea reka tenei. No te mea ko te konei i Tensor karekau he kaiwhakawhanake kee, a ka taea e PostgreSQL te whakaingoa ahakoa i roto i nga tohu, mena ka kua mau ki roto i nga korero, katahi ka pai ake taatau ki te whakaingoa i nga mea i runga i te maarama me te marama kia kore ai he rereketanga.
Kia titiro tatou ki te mahere kua puta:
PostgreSQL Antipatterns: Hononga kino me OR
[Tirohia i te explain.tensor.ru]

144ms me te tata ki te 53K nga parepare - ara, neke atu i te 400MB o nga raraunga! A ka waimarie tatou mena kei roto katoa ratou i te keteroki i te wa o ta matou tono, ki te kore he maha nga wa ka roa ka panuihia mai i te kōpae.

Ko te algorithm te mea nui!

Kia taea ai te arotau i tetahi tono, me maarama koe ki te mahi.
Me waiho e tatou te whanaketanga o te hanganga putunga raraunga ki waho o te whanuitanga o tenei tuhinga mo naianei, me te whakaae ka taea e tatou te "iti" tuhia ano te tono ka huri ranei ki te turanga etahi o nga mea e hiahiatia ana e matou tohu.

Na ko te tono:
— ka tirohia te noho o etahi tuhinga
- i roto i nga ahuatanga e hiahiatia ana e tatou me tetahi momo
- ko te kaituhi, ko te kaihaka ranei te kaimahi e hiahiatia ana e tatou

KAUPAPA + TEITI 1

I te nuinga o te wa he ngawari ake mo te kaiwhakawhanake ki te tuhi patai he maha nga ripanga ka honoa tuatahi, katahi ka toe tetahi rekoata mai i tenei huinga katoa. Engari he maamaa ake mo te kaiwhakawhanake ehara i te mea he pai ake mo te paataka raraunga.
I a maatau e 3 noa nga tepu - a he aha te paanga...

Me whakakore tuatahi i te hononga ki te ripanga "Momo Tuhinga", me te korero ano ki te papaa raraunga he ahurei to tatou rekoata momo (e mohio ana matou ki tenei, engari kaore ano kia mohio te kaiwhakariterite):

WITH T AS (
  SELECT
    "@ТипДокумента"
  FROM
    "ТипДокумента"
  WHERE
    "ТипДокумента" = 'ПланРабот'
  LIMIT 1
)
...
WHERE
  d."ТипДокумента" = (TABLE T)
...

Ae, mena ko te ripanga/CTE he mara kotahi o te rekoata kotahi, na i te PG ka taea e koe te tuhi penei, hei utu

d."ТипДокумента" = (SELECT "@ТипДокумента" FROM T LIMIT 1)

Aromātai mangere i roto i nga patai PostgreSQL

BitmapOr vs UNION

I etahi wa, he nui te utu mo te Bitmap Heap Scan - hei tauira, i roto i o maatau ahuatanga, ina he maha nga rekoata e tutuki ana ki nga ahuatanga e hiahiatia ana. I whiwhi matou na te mea I huri te ahua OR ki te BitmapOr- mahi i roto i te mahere.
Kia hoki ano ki te raru tuatahi - me rapu he rekoata e rite ana tetahi mai i nga tikanga - ara, kaore he take ki te rapu i nga rekoata 59K katoa i raro i nga tikanga e rua. He huarahi ki te mahi i tetahi ahuatanga, a haere ki te tuarua anake ka kore he mea i kitea i te tuatahi. Ko te hoahoa e whai ake nei ka awhina i a maatau:

(
  SELECT
    ...
  LIMIT 1
)
UNION ALL
(
  SELECT
    ...
  LIMIT 1
)
LIMIT 1

“Waho” LIMIT 1 ka whakarite ka mutu te rapu ina kitea te rekoata tuatahi. A ki te mea kua kitea i te poraka tuatahi, e kore e mahia te poraka tuarua (kore rawa i mate mo te).

"Huna i nga tikanga uaua i raro i te CASE"

He wa tino whakararuraru i roto i te patai taketake - te tirotiro i te mana ki te ripanga e pa ana "DocumentExtension". Ahakoa te pono o etahi atu tikanga i roto i te korero (hei tauira, d. "Kua Mukua" KARE I TE TIKA), ka mahia tenei hononga i nga wa katoa me te "utu rauemi". He nui ake, iti iho ranei o aua mea ka pau - ka whakawhirinaki ki te rahi o tenei tepu.
Engari ka taea e koe te whakarereke i te patai kia puta te rapu mo tetahi rekoata e pa ana ki te wa e tika ana:

SELECT
  ...
FROM
  "Документ" d
WHERE
  ... /*index cond*/ AND
  CASE
    WHEN "$Черновик" IS NULL AND "Удален" IS NOT TRUE THEN (
      SELECT
        "Состояние"[1] IS TRUE
      FROM
        "ДокументРасширение"
      WHERE
        "@Документ" = d."@Документ"
    )
  END

Kotahi mai i te ripanga hono ki a matou kaore tetahi o nga mara e hiahiatia ana mo te hua, katahi ka whai waahi taatau ki te huri i a JOIN ki tetahi ahuatanga i runga i te patai.
Me waiho nga mara kua tohua "ki waho o nga taiapa CASE", taapirihia nga tikanga ngawari mai i te rekoata ki te paraka WHEN - a inaianei ka mahia te patai "taimaha" ka tukuna ana ki THEN.

Ko "Tapeke" toku ingoa whakamutunga

Ka kohia e matou te patai me nga miihini katoa i whakaahuahia i runga ake nei:

WITH T AS (
  SELECT
    "@ТипДокумента"
  FROM
    "ТипДокумента"
  WHERE
    "ТипДокумента" = 'ПланРабот'
)
  (
    SELECT
      TRUE
    FROM
      "Документ" d
    WHERE
      ("Лицо3", "ТипДокумента") = (19091, (TABLE T)) AND
      CASE
        WHEN "$Черновик" IS NULL AND "Удален" IS NOT TRUE THEN (
          SELECT
            "Состояние"[1] IS TRUE
          FROM
            "ДокументРасширение"
          WHERE
            "@Документ" = d."@Документ"
        )
      END
    LIMIT 1
  )
UNION ALL
  (
    SELECT
      TRUE
    FROM
      "Документ" d
    WHERE
      ("ТипДокумента", "Сотрудник") = ((TABLE T), 19091) AND
      CASE
        WHEN "$Черновик" IS NULL AND "Удален" IS NOT TRUE THEN (
          SELECT
            "Состояние"[1] IS TRUE
          FROM
            "ДокументРасширение"
          WHERE
            "@Документ" = d."@Документ"
        )
      END
    LIMIT 1
  )
LIMIT 1;

Te whakatikatika [ki] taupū

I kite tetahi karu kua whakangungua he rerekee nga tikanga kua tohua i roto i nga poraka iti UNION - na te mea kei a matou nga tohu taurangi tika i runga i te tepu. A, ki te kore e noho, he pai te hanga: Tuhinga(Tangata3, TuhingaMomo) и Tuhinga(Momo Tuhinga, Kaimahi).
mo te raupapa o nga mara i roto i nga tikanga ROWMai i te tirohanga a te kaiwhakatakoto whakaaro, o te akoranga, ka taea e koe te tuhi (A, B) = (constA, constB)a (B, A) = (constB, constA). Engari i te wa e tuhi ana i roto i te raupapa o nga mara i te taurangi, he watea ake te tono penei ki te patuiro i muri mai.
He aha kei roto i te mahere?
PostgreSQL Antipatterns: Hononga kino me OR
[Tirohia i te explain.tensor.ru]

Ko te mate, kaore matou i waimarie, karekau he mea i kitea i te poraka tuatahi o te UNION, no reira ka mate tonu te tuarua. Engari ahakoa - anake 0.037ms me te 11 parepare!
Kua tere ake te tono me te whakaiti i te putunga raraunga i roto i te mahara e hia mano nga wa, ma te whakamahi i nga tikanga ngawari - he hua pai me te kape-whakapiri iti. 🙂

Source: will.com

Tāpiri i te kōrero