PostgreSQL Antipatterns: "Me kotahi anake!"

I roto i te SQL, ka whakaahua koe "he aha" e hiahia ana koe ki te tiki, kaua "me pehea" me mahi. Na reira, ko te raruraru o te whakawhanake i nga patai SQL i roto i te ahua o te "i te mea e rongohia ana ko te ahua o te tuhi" ka noho hei honore, me te nga ahuatanga o te aromatawai ahuatanga i roto i te SQL.

I tenei ra, ma te whakamahi i nga tauira tino ngawari, kia kite tatou he aha tenei ka puta i roto i te horopaki o te whakamahi GROUP/DISTINCT и LIMIT me ratou.

Mena i tuhi koe i roto i te tono "Tuatahi honoa enei papa, katahi ka maka atu nga taarua katoa, kia kotahi anake tauira mo ia kī" - koinei tonu te mahi, ahakoa kaore i hiahiatia te hononga.

A i etahi wa ka waimarie koe, ka "mahi noa", i etahi wa ka pa te kino ki te mahi, a, i etahi wa ka puta nga hua kaore i tino whakaarohia mai i te tirohanga a te kaiwhakawhanake.

PostgreSQL Antipatterns: "Me kotahi anake!"
Ana, kaore pea i te mea whakamiharo, engari ...

"Sweet couple": JOIN + DISTINCT

SELECT DISTINCT
  X.*
FROM
  X
JOIN
  Y
    ON Y.fk = X.pk
WHERE
  Y.bool_condition;

Me pehea e marama ai ta ratou i hiahia ai tīpakohia nga rekoata X kei roto i a Y e hono ana ki te ahuatanga kua tutuki. I tukuna he tono ma JOIN - he maha nga wa i whiwhi ai koe i etahi uara o te pk (e hia nga rekoata tika i puta ki Y). Me pehea te tango? He pono DISTINCT!

He mea "ahuareka" mena he maha nga rau rekoata Y mo ia rekoata X, katahi ka nekehia nga taarua ...

PostgreSQL Antipatterns: "Me kotahi anake!"

Me pehea te whakatika? Hei timata, kia mohio koe ka taea te whakarereke i te mahi "Tīpakohia aua rekoata X kei reira KO TE KOTAHI i roto i te Y e pa ana ki te ahuatanga e tutuki ana" - i muri i nga mea katoa, kaore matou e hiahia ki tetahi mea mai i te rekoata Y ano.

Kohanga TARI

SELECT
  *
FROM
  X
WHERE
  EXISTS(
    SELECT
      NULL
    FROM
      Y
    WHERE
      fk = X.pk AND
      bool_condition
    LIMIT 1
  );

Ko etahi o nga putanga o PostgreSQL e mohio ana kei roto i te EXISTS he nui ki te kimi i te rekoata tuatahi ka puta, kaore nga mea tawhito e kitea. Na reira, pai ake ahau ki te tohu i nga wa katoa LIMIT 1 i roto EXISTS.

KAUPAPA KAUPAPA

SELECT
  X.*
FROM
  X
, LATERAL (
    SELECT
      Y.*
    FROM
      Y
    WHERE
      fk = X.pk AND
      bool_condition
    LIMIT 1
  ) Y
WHERE
  Y IS DISTINCT FROM NULL;

Ko taua whiringa ka taea, mehemea e tika ana, ki te whakahoki tonu i etahi raraunga mai i te rekoata Y e hono ana i te wa ano. Ka korerohia he whiringa rite i roto i te tuhinga "PostgreSQL Antipatterns: ka tae te rekoata onge ki waenganui o JOIN".

"He aha te utu ake": DISTINCT [ON] + LIMIT 1

Ko tetahi atu painga o enei huringa patai ko te kaha ki te whakawhāiti i te tatauranga o nga rekoata mena ka hiahiatia kia kotahi anake, penei i te keehi e whai ake nei:

SELECT DISTINCT ON(X.pk)
  *
FROM
  X
JOIN
  Y
    ON Y.fk = X.pk
LIMIT 1;

Inaianei ka panuihia e matou te tono me te ngana ki te mohio he aha te mahi a te DBMS:

  • ka honoa e matou nga papa
  • ahurei na X.pk
  • whiriwhiria tetahi o nga rekoata e toe ana

Na he aha i whiwhi koe? "Kotahi rekoata" mai i nga mea ahurei - a ki te tangohia e koe tetahi o nga mea ahurei, ka rereke te hua? .. "A ki te kore he rereke, he aha te utu nui atu?"

SELECT
  *
FROM
  (
    SELECT
      *
    FROM
      X
    -- сюда можно подсунуть подходящих условий
    LIMIT 1 -- +1 Limit
  ) X
JOIN
  Y
    ON Y.fk = X.pk
LIMIT 1;

A tino rite te kaupapa ki GROUP BY + LIMIT 1.

"Me patai noa ahau": implicit GROUP + LIMIT

He rite nga mea ka puta i nga momo rereke arowhai korekore tapanga, CTE ranei i te wa e haere ana te tono:

...
CASE
  WHEN (
    SELECT
      count(*)
    FROM
      X
    LIMIT 1
  ) = 0 THEN ...

Nga mahi whakahiato (count/min/max/sum/...) ka mahia paitia i runga i te huinga katoa, ahakoa me te kore e tino whakaatu GROUP BY. Ko konei anake me LIMIT e kore ratou e tino hoa.

Ka taea e te kaiwhakawhanake te whakaaro "Na, mena he rekoata kei reira, katahi ka hiahia au kia nui ake i te LIMIT". Engari kaore koe e whai! No te mea mo te turanga:

  • tatauhia ta ratou e hiahia ana i runga i nga rekoata katoa
  • hoatu te maha o nga rarangi ka tonoa

I runga i nga ahuatanga o te whaainga, he mea tika ki te whakarereke i tetahi o nga mea e whai ake nei:

  • (count + LIMIT 1) = 0 i runga i NOT EXISTS(LIMIT 1)
  • (count + LIMIT 1) > 0 i runga i EXISTS(LIMIT 1)
  • count >= N i runga i (SELECT count(*) FROM (... LIMIT N))

"E hia te nui o te iri i roto i nga karamu": DISTINCT + LIMIT

SELECT DISTINCT
  pk
FROM
  X
LIMIT $1

Ko te kaiwhakawhanake maamaa ka whakapono pono ka mutu te tono tono, ka kitea e matou nga uara rereke $1 tuatahi ka puta.

I etahi wa kei te heke mai, tera pea ka mahi tenei na te mea he node hou Taupū Tīpoka Matawai, ko te whakatinanatanga kei te mahia i tenei wa, engari kaore ano.

I tenei wa tuatahi ka tangohia nga rekoata katoa, he mea ahurei, a ko te maha o ratou i tonoa ka whakahokia mai. He tino pouri ki te hiahia tatou ki tetahi mea penei $ 1 = 4, a he rau mano nga rekoata kei te ripanga ...

Kia kore ai e pouri noa, ka whakamahia e matou he patai recursive "DISTINCT for the Poor" mai i PostgreSQL Wiki:

PostgreSQL Antipatterns: "Me kotahi anake!"

Source: will.com

Tāpiri i te kōrero