sql >> Database >  >> RDS >> Sqlserver

Intermitterende prestatieproblemen met SQL Server-functie

Het gedrag dat u beschrijft is vaak te wijten aan een onjuist in de cache opgeslagen queryplan en/of verouderde statistieken.

Het komt vaak voor wanneer u een groot aantal parameters in een WHERE-component hebt, vooral een lange lijst met de volgende vorm:

(@parameter1 is NULL OR TableColumn1 = @parameter1)

Stel dat het queryplan in de cache verloopt en de procedure wordt aangeroepen met een niet-representatieve set parameters. Het plan wordt vervolgens in de cache opgeslagen voor dit gegevensprofiel. MAAR, als de procedure vaker voorkomt met een heel andere set parameters, is het plan misschien niet geschikt. Dit wordt vaak 'parameter sniffing' genoemd.

Er zijn manieren om dit probleem te verminderen en te elimineren, maar deze kunnen compromissen met zich meebrengen en zijn afhankelijk van uw SQL Server-versie. Kijk naar OPTIMIZE FOR en OPTIMIZE FOR UNKNOWN . ALS (en het is een grote als) de proc niet vaak wordt aangeroepen maar zo snel mogelijk moet worden uitgevoerd, kunt u deze markeren als OPTION(RECOMPILE) , om een ​​hercompilatie te forceren elke keer dat het wordt aangeroepen, MAAR doe dit niet voor veelgebruikte procedures OF zonder onderzoek.

[OPMERKING:let op welke Servicepack en cumulatieve update (CU) uw SQL Server 2008-box heeft, omdat de logica voor het opnieuw compileren en het snuiven van parameters in sommige versies anders werkt]

Voer deze query uit (van Glenn Berry) om de staat van de statistieken te bepalen:

-- When were Statistics last updated on all indexes?
SELECT o.name, i.name AS [Index Name],  
      STATS_DATE(i.[object_id], i.index_id) AS [Statistics Date], 
      s.auto_created, s.no_recompute, s.user_created, st.row_count
FROM sys.objects AS o WITH (NOLOCK)
INNER JOIN sys.indexes AS i WITH (NOLOCK)
ON o.[object_id] = i.[object_id]
INNER JOIN sys.stats AS s WITH (NOLOCK)
ON i.[object_id] = s.[object_id] 
AND i.index_id = s.stats_id
INNER JOIN sys.dm_db_partition_stats AS st WITH (NOLOCK)
ON o.[object_id] = st.[object_id]
AND i.[index_id] = st.[index_id]
WHERE o.[type] = 'U'
ORDER BY STATS_DATE(i.[object_id], i.index_id) ASC OPTION (RECOMPILE); 



  1. Hoe expressie in select-statement in Postgres te evalueren

  2. Primaire sleutel met meerdere kolommen in MySQL 5

  3. Oracle Linked Server maken en configureren in SQL Server

  4. Lente, Slaapstand, Blob Lazy Loading