Een vaag probleem met een SQL database. Op tweakers vond ik er slechts 2 topics over waarvan deze het meest interessant is: [rml][ SQL] Rare SQL error[/rml]
Ik heb een site gemaakt voor een sportvereniging waarbij ik wedstrijdschema's opsla in een tabel. De database is volledig genormaliseerd, zodat alles slechts 1 keer ingevoerd hoeft te worden. Informatie wordt daardoor door verschillende where statements uit alle tabellen getoverd.
De tabel ziet er als volgt uit:
De query ziet er als volgt uit:
en de explain van deze query:
Nu krijg ik bij het uitvoeren van een query de volgende foutmelding
Dit is vreemd, omdat wanneer ik deze query niet voor iedere $c_code (zie query) krijg. Wanneer er niet veel records voldoen aan $c_code geeft ie wel een goed resultaat.
Ook wanneer ik de query op mijn thuis installatie uitvoer werkt het gewoon goed. De querytime bedraagt namelijk 0.251560926437 seconds.
Ik heb dit probleem voorgelegd aan mijn provider. Zij melden dat mijn query te groot is en antwoorden als volgt:
Nu heb ik eigenlijk 2 vragen:
1. Hoe zal ik reageren richting mijn provider? Ik neem hier eigenlijk geen genoegen mee. Ik zit pas een week bij ze maar op deze manier voldoen ze niet aan mijn verwachtingen...
2. Hoe zou ik mijn query kunnen aanpassen / cq instellingen wijzigen / indeces maken zodat de query wel geaccepteerd wordt?
Ik heb een site gemaakt voor een sportvereniging waarbij ik wedstrijdschema's opsla in een tabel. De database is volledig genormaliseerd, zodat alles slechts 1 keer ingevoerd hoeft te worden. Informatie wordt daardoor door verschillende where statements uit alle tabellen getoverd.
De tabel ziet er als volgt uit:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
| CREATE TABLE `WIS_wedstrijdschema` ( `ID` int(11) NOT NULL auto_increment, `wed_nr` int(11) NOT NULL default '0', `c_ID` int(11) NOT NULL default '0', `team_thuis` int(11) NOT NULL default '0', `team_uit` int(11) NOT NULL default '0', `datum` date NOT NULL default '0000-00-00', `tijd` time default NULL, `weeknr` int(11) default NULL, PRIMARY KEY (`ID`), UNIQUE KEY `wed_nr` (`wed_nr`), KEY `c_ID` (`c_ID`) ) TYPE=MyISAM |
De query ziet er als volgt uit:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
| SELECT DISTINCT(WIS_wedstrijdschema1.wed_nr), WIS_wedstrijdschema1.datum as datum_sort, DATE_FORMAT(WIS_wedstrijdschema1.datum, '%d-%m-%Y') as datum, TIME_FORMAT(WIS_wedstrijdschema1.tijd, '%H.%i') as tijd, WIS_wedstrijdschema1.team_thuis as thuisnr, WIS_wedstrijdschema2.team_uit as uitnr, WIS_vereniging1.naam as thuisnaam, WIS_vereniging2.naam as uitnaam, WIS_vereniging1.zwembad as zwembad, WIS_vereniging1.locatie as locatie, WIS_team1.team as teamnrthuis, WIS_team2.team as teamnruit, WIS_wedstrijdschema1.weeknr, WIS_wedstrijdschema1.c_ID, WIS_competitie.c_code FROM WIS_wedstrijdschema WIS_wedstrijdschema1, WIS_wedstrijdschema WIS_wedstrijdschema2, WIS_competitie, WIS_competitieindeling, WIS_team WIS_team1, WIS_team WIS_team2, WIS_vereniging WIS_vereniging1, WIS_vereniging WIS_vereniging2 WHERE WIS_vereniging1.ID = WIS_team1.v_ID AND WIS_vereniging2.ID = WIS_team2.v_ID AND WIS_competitie.ID = WIS_competitieindeling.c_ID AND WIS_competitieindeling.t_ID = WIS_team1.ID AND WIS_wedstrijdschema1.C_ID = WIS_competitieindeling.c_ID AND WIS_wedstrijdschema1.team_thuis = WIS_team1.ID AND WIS_wedstrijdschema1.team_uit = WIS_team2.ID AND WIS_wedstrijdschema2.team_thuis = WIS_team1.ID AND WIS_wedstrijdschema2.team_uit = WIS_team2.ID AND WIS_wedstrijdschema1.c_ID = 1 ORDER BY datum_sort ASC, tijd ASC, wed_nr ASC |
en de explain van deze query:
code:
1
2
3
4
5
6
7
8
9
| table type possible_keys key key_len ref rows Extra WIS_competitie const PRIMARY PRIMARY 4 const 1 Using temporary; Using filesort WIS_wedstrijdschema1 ref c_ID c_ID 4 const 147 WIS_team1 eq_ref PRIMARY PRIMARY 4 WIS_wedstrijdschema1.team_thuis 1 WIS_competitieindeling ALL NULL NULL NULL NULL 94 Using where WIS_team2 eq_ref PRIMARY PRIMARY 4 WIS_wedstrijdschema1.team_uit 1 WIS_wedstrijdschema2 ALL NULL NULL NULL NULL 575 Using where WIS_vereniging1 eq_ref PRIMARY PRIMARY 4 WIS_team1.v_ID 1 WIS_vereniging2 eq_ref PRIMARY PRIMARY 4 WIS_team2.v_ID 1 |
Nu krijg ik bij het uitvoeren van een query de volgende foutmelding
PHP:
1
| The SELECT would examine too many records and probably take a very long time. Check your WHERE and use SET OPTION SQL_BIG_SELECTS=1 if the SELECT is ok |
Dit is vreemd, omdat wanneer ik deze query niet voor iedere $c_code (zie query) krijg. Wanneer er niet veel records voldoen aan $c_code geeft ie wel een goed resultaat.
Ook wanneer ik de query op mijn thuis installatie uitvoer werkt het gewoon goed. De querytime bedraagt namelijk 0.251560926437 seconds.
Ik heb dit probleem voorgelegd aan mijn provider. Zij melden dat mijn query te groot is en antwoorden als volgt:
PHP:
1
| Je zou in dit geval de query moeten aanpassen omdat de huidige query de server overmatig zal belasten. |
Nu heb ik eigenlijk 2 vragen:
1. Hoe zal ik reageren richting mijn provider? Ik neem hier eigenlijk geen genoegen mee. Ik zit pas een week bij ze maar op deze manier voldoen ze niet aan mijn verwachtingen...
2. Hoe zou ik mijn query kunnen aanpassen / cq instellingen wijzigen / indeces maken zodat de query wel geaccepteerd wordt?