Adlib startpagina > Support > Veelgestelde vragen

Wat moet ik doen met SQL query time-out errors?

Wanneer u een zoekopdracht uitvoert die waarschijnlijk een groot zoekresultaat oplevert, zoals zoeken op een lege of kleine waarde in een veld in een erg grote Adlib SQL-database, dan kan dit soms tot gevolg hebben dat de zoekopdracht de maximale tijdslimiet voor verwerking ervan overschrijdt (een zogenaamde query time-out). Er verschijnt een foutmelding die een leesfout meldt (error 189), gevolgd door de SQL query en de tekst "Query timeout expired". Dit kan alleen gebeuren in Adlib-applicaties die draaien op een Adlib SQL-database, wanneer de SQL Server geïnstalleerd is op een server met meerdere fysieke processoren.
De oorzaak hiervan is veelal het feit dat SQL Server deze zoekopdracht in parallel verband uitvoert. Dit betekent dat delen van de SQL query die aan de basis van uw zoekopdracht ligt, zoals uitgevoerd door SQL Server, afgehandeld worden in afzonderlijke verwerkingslijnen (Eng: processing threads) op verschillende processoren. Standaard is de SQL Server geconfigureerd om alle beschikbare processoren te gebruiken. Vanwege een inefficiënte planning van deze afzonderlijk draaiende threads door SQL Server is het gevolg soms dat de resultaten van deze verwerkingslijnen niet tegelijk klaar zijn en dat lijnen op elkaar moeten wachten. Op een server die zwaar belast wordt kan dit dan tot gevolg hebben dat processen blijven hangen, waarna een time-out ontstaat.
Omdat dit probleem door SQL Server veroorzaakt wordt, kan AIS geen zuivere oplossing aanbieden. Een work-around is echter wel mogelijk, door de server zo te configureren dat die alle processor threads, op één na gebruikt. U kunt dit in SQL Server Management Studio doen of vanaf de SQL prompt. Selecteer in SQL Server Management Studio de SQL Server zelf* (niet een database daaronder), klik op de knop New query, typ een script vergelijkbaar met het volgende** en klik vervolgens op de knop Execute:

sp_configure 'show advanced options', 1; 
GO 
RECONFIGURE WITH OVERRIDE; 
GO 
sp_configure 'max degree of parallelism', 8; 
GO 
RECONFIGURE WITH OVERRIDE;
GO

* De optie max degree of parallelism moet altijd op serverniveau worden ingesteld, niet op databaseniveau. Als dit op uw server tot een ongewenste configuratie leidt, dan kunt u deze work-around niet toepassen.

** Bij AIS hebben we dit in onze eigen systeemomgeving getest en we hebben ontdekt dat wanneer we het aantal processor threads instellen op het maximum aan threads minus 1, de time-out problemen gewoonlijk oplost. In dit voorbeeld worden 8 threads gebruikt, maar als uw server bijvoorbeeld 16 processor threads beschikbaar heeft, dan moet de optie max degree of parallelism dus op 15 worden gezet. In het Windows Taakbeheer voor de betreffende server kunt u eenvoudig zien hoeveel threads u tot uw beschikking hebt. In de afbeelding hieronder, bijvoorbeeld, ziet u 16 processor threads.
Met het script hierboven wordt de nieuwe configuratie toegepast op de server zonder dat u de SQL-service hoeft te stoppen (of opnieuw te starten).

Meer informatie over deze SQL Server-configuratie kunt u vinden op: http://msdn.microsoft.com/en-us/library/ms181007.aspx