Delphi,ZEOS,MySQL - BIG_SELECTS,MAX_JOIN_SIZE

Delphi,ZEOS,MySQL - BIG_SELECTS,MAX_JOIN_SIZE
2009-07-15T12:20:15+02:00
2009-07-15T17:40:00+02:00
2022-11-14T07:05:49+01:00
Ruler
Üdv!

Már hónapok óta üzemelő szoftver, most néhány olyan lekérdezésnél, ahol 2-3 táblát kell JOIN-olni, ilyen hibaüzeneteket küld:

errcode: 1104, error: The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is okay


- A programban "embed"-ként van beágyazva a "libmysqld50.dll"

- Táblákban 3000-9000 sor van

- Lekérdezést egy xampp local szerver által, phpmyqdmin-ban lefuttatva, ugyanazon adatokkal, gond nélkül lefut.

- Ha a táblákból ritkítom az rekordokat 1000-2000 re, akkor már nem jön a fenti hibaüzenet.



Mit, Mivel és hogyan lehetne ezt a problémát orvosolni?


Előre is nagy-nagy köszönetem!
Mutasd a teljes hozzászólást!
Ne haragudj, de a hibaüzenetben le van írva minden, ha nem világos, akkor is találsz benne olyan kulcsszavakat, amelyek segítenének. Na, ennyi ecet elég volt, lássunk egy kis mézet is

MAX_JOIN_SIZE az egy paraméter, ami a my.ini-ben található. Itt található a leírása.

A hibaüzenet tartalmazza is a megoldási javaslatokat, azaz set utasítással növelni kell vagy a max_join_size értékét, vagy sql_big_selects értékét 1-re kell állítani. Ha az embedded szervernek nincs ini file-ja (elképzelhető...), akkor kénytelen leszel ezt kódból megtenni. Ugyanolyan sql kérés a SET is, mint a többi, ugyanúgy is lehet kiadni.
Mutasd a teljes hozzászólást!

  • Köszi a segítséget, végül a megoldás az lett, hogy tanácsodra elkezdtem lekérdezésként futtatni a beállításokat.

    Fura, hogy 6.4 ZEOS -ál tutira(többit nem próbáltam) ha lekérdezést open-nel futtatom, hibaüzi, de ha exec-el, akkor tökéletes!

    Ha valkinek hasonló problémája akadna, akkor:

    DataModule.LEKERDEZES_Q.Close;
    DataModule.LEKERDEZES_Q.SQL.Clear;
    DataModule.LEKERDEZES_Q.SQL.text:='SET SQL_BIG_SELECTS=1';
    DataModule.LEKERDEZES_Q.ExecSQL;
    Mutasd a teljes hozzászólást!
  • Ez nem fura, ennek így kell működnie! Az open() arra van, hogy eredményt kapj vissza (eredményhalmazt egész pontosan), míg az execsql() olyan sql utasításokra, ami nem ad visza eredményhalmazt, pl. insert, update, set.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd