PostgreSQL Antipatterns: Noxia JOINs et ORs

Cave ab operationibus quae afferunt buffers...
Parva interrogatione utens exemplo, inspiciamus aliquos aditus universales ad quaestiones optimizing in PostgreSQL. Utrum his uteris necne, tibi est, sed de illis est cognitu dignum.

In nonnullis subsequentibus versionibus PG res variari potest ut schedula fit smarter, sed pro 9.4/9.6 idem fere spectat, sicut in exemplis hic.

Sit scriptor ipsa petitio accipies;

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;

de mensa et agro nominaNomina agrorum et tabularum Russorum aliter tractari possunt, sed haec res est de gustu. Quod hic apud Tensor nullae tincidunt peregrinae sunt, et PostgreSQL nobis permittit nomina etiam in hieroglyphis nominare, si sunt inclusum in quotesut nullae sint discrepantiae, ita ut nullae sint discrepantiae, ita ut sine ambiguitate obiectis dicamus.
Intueamur inde consilium:
PostgreSQL Antipatterns: Noxia JOINs et ORs
[Aspice explain.tensor.ru]

144ms et fere 53K buffers - hoc est plus quam 400MB notitiarum! Et nos felices erimus si omnes in cella per tempus rogationis nostrae fuerint, alioquin multoties longior erit cum ex orbe legetur.

Algorithmus praecipuum est!

Ut quamlibet petitionem aliquo modo optimize, debes primum intelligere quid facere debeas.
Progressionem structurae ipsae database extra ambitum huius articuli nunc relinquamus, et relativum "vili" posse convenire. RESCRIBO petitionem et / vel volvuntur in basi aliqua rerum non necessariarum indices.

Rogatio itaque;
- coercet saltem aliquod documentum
- sub conditione qua indigemus et quadam specie
- Ubi auctor vel operator est operarius nobis opus est

JOIN + LIMIT 1

Saepius facilius est curriculum vitae scribendae quaesitum ubi magnus numerus tabularum primum coniungitur, et tunc solum una electronica ex tota hac copia manet. Sed facilior pro elit non significat efficaciorem datorum.
In nostro casu tantum III tabulae erant - et quid effectus...

Primum nexum cum tabula "Documenti Type" tollatur, et simul indicare database quod nostrum genus recordum est unique (scimus hoc, sed schedula adhuc nihil sapit);

WITH T AS (
  SELECT
    "@Π’ΠΈΠΏΠ”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°"
  FROM
    "Π’ΠΈΠΏΠ”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°"
  WHERE
    "Π’ΠΈΠΏΠ”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°" = 'ΠŸΠ»Π°Π½Π Π°Π±ΠΎΡ‚'
  LIMIT 1
)
...
WHERE
  d."Π’ΠΈΠΏΠ”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°" = (TABLE T)
...

Ita, si mensa/CTE ex uno campi unius notae consistit, tum in PG etiam hoc loco scribere potes.

d."Π’ΠΈΠΏΠ”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°" = (SELECT "@Π’ΠΈΠΏΠ”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°" FROM T LIMIT 1)

Piger iudicium in PostgreSQL queries

BitmapOr nobis CONIUNCTIO

In quibusdam casibus, Bitmap Acervus Scan nobis multum constabit - exempli gratia, in condicione nostra, cum satis multa monumenta condicionem debitam conveniant. Venimus id quod VEL conditio vertitur in BitmapOrβ€” Operatio in consilio.
Redeamus ad problema originale - necesse habemus invenire actis respondentem aliquis ex conditionibus - scilicet, non opus est omnes 59K monumenta inquirere sub utraque condicione. Est modus operandi unam conditionem, et ad secundum, quando nihil in primo repertum est. Hoc consilium nos adiuvabit:

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

"Externus" FINIS 1 efficit ut investigationis fines cum primum testimonium inveniat. Et si iam in primo clauso inuenitur, secundus scandalus non exequetur.numquam supplicium ratlone).

"Abdere condiciones difficiles sub CAUSA"

Est momentum valde inconveniens in interrogatione originali - inhibendo status contra tabulam relativam "DocumentExtension". Pro veritate aliarum condicionum in elocutione (exempli gratia; d. "Deleted" non est verum) haec connexio semper exsecuta est ac Β« sumptus facultates Β». Plus minusve ex eis impendetur - dependet ex magnitudine huius tabulae.
Sed interrogationem mutare potes ut inquisitio relationis relativae tantum fiat cum vere necessarium est:

SELECT
  ...
FROM
  "Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚" d
WHERE
  ... /*index cond*/ AND
  CASE
    WHEN "$Π§Π΅Ρ€Π½ΠΎΠ²ΠΈΠΊ" IS NULL AND "Π£Π΄Π°Π»Π΅Π½" IS NOT TRUE THEN (
      SELECT
        "БостояниС"[1] IS TRUE
      FROM
        "Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅"
      WHERE
        "@Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚" = d."@Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚"
    )
  END

Cum ex coniunctione mensa nobis non ex agris opus est ad exitumtunc facultas est in condicionem de subquisitione coniungendi.
Agros nominatos "extra CAUSAM uncis" relinquamus, condiciones simplices e recordo ad CUM scandalum adde - et nunc quaestio "gravis" nonnisi ad TUM transitum fit.

Ultimum nomen meum "Summa"

Colligitur inde interrogationem cum omnibus mechanicis supra descriptis:

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;

Adjusting [to] index

Oculus doctus animadvertit condiciones in Unionis subblocks esse leviter diversas condiciones notatas - id est, quia indices idoneos in tabula iam habemus. Quod si non essent, operae pretium esset; Document(Person3, DocumentType) ΠΈ Document(DocumentType, Employee).
de ordine agrorum in ORDINE conditionibusEx parte consiliumque, sane, scribere potes (A, B) = (constA, constB).et (B, A) = (constB, constA).. Sed cum memoria in ordine agrorum in indicequae petitio est simpliciter commodius postea debug.
Quid est in consilio?
PostgreSQL Antipatterns: Noxia JOINs et ORs
[Aspice explain.tensor.ru]

Infeliciter fuimus infausti et nihil in primo scandalo CONIUGATIO PRIMUM repertum est, ergo alterum adhuc supplicium est. sed etiam modo 0.037ms et XI buffers!
Data elit in memoriam redegit petentibus acceleravimus aliquot miliatechnicis satis simplicibus utens - bonum eventum exiguo exemplaris farinae. πŸ™‚

Source: www.habr.com