Какво е параметър, смъркане и как да се бори с него

При съставяне на параметризирани заявки и съхранени процедури, SQL Server «изглежда" стойностите на параметрите и генерира оптимални планове за изпълнение на тези ценности. В резултат на това, ако данните в таблицата са разпределени неравномерно и съставяне на професионалист.

При съставяне на параметризирани заявки и съхранени процедури, SQL Server «изглежда" стойностите на параметрите и генерира оптимални планове за изпълнение на тези ценности. В резултат на това, ако данните в таблицата са неравномерно разпределени и компилация направена за нетипични стойности на параметрите кеширани планове може да не е оптимална за типични запитвания.

Като пример, представете си едно дружество със седалище се намира в Москва с малък клон в София. Представете си, че имаме една маса, съдържаща информация за персонала:

Създаване на таблица dbo.Employee

EmployeeId не Int нула,

Местоположение nvarchar (64) не нула, - София или София

Заплата пари не нула,

първичен ключ струпани (EmployeeId)

създадете nonclustered индекс IDX_Employee_Location

По-голямата част от служителите на компанията се намират в Москва. Представете си, че имаме съхранена процедура:

създаде Proc dbo.GetAvgSalaryByLocation (@Location nvarchar (64))

където Местоположение = @Location

Ако запомнена процедура е компилиран с параметър @ Местоположение = кеширана план изпълнение N'Sofiya "ще бъде сканиране на групираната индекса, който е оптимален за нашето разпространение на данни. В случая, ако е имало компилация от стойността на параметъра @ Местоположение = N'Sofiya ", като ще бъдат кеширани търсене план за изпълнение в не-клъстерирани индекс с натискане на бутоните за справка. В резултат на това, ако по-голямата част от разговори на процедурата се извършва с параметър @ Местоположение = план изпълнение N'Sofiya "не е оптимално.

Има няколко решения на проблема:

1. Използването на локални променливи. В този случай, SQL Server не използва стойностите на параметрите по време на компилация

създаде Proc dbo.GetAvgSalaryByLocation (@Location nvarchar (64))

избран @Loc = @Location

където Местоположение = @Loc

2. С помощта на опцията за ОПЦИЯ (компилирате). С тази опция, SQL Server ще прекомпилирате заявката на всяко повикване, което води до допълнително натоварване на процесора. От друга страна, планът за изпълнение на заявката е оптимална за всички стойности на параметри във всеки разговор

създаде Proc dbo.GetAvgSalaryByLocation (@Location nvarchar (64))

където Местоположение = @Location

3. С помощта Оптимизиране за опция. Когато тази опция оптимизира заявка SQL Server за конкретни стойности на параметрите. С тази опция, трябва да сме сигурни, че статистическото разпределение на данни в системата няма да се промени

създаде Proc dbo.GetAvgSalaryByLocation (@Location nvarchar (64))

където Местоположение = @Location

опция (оптимизиране за (@ местоположение = N'Sofiya "))

4. Използване Оптимизиране за НЕИЗВЕСТЕН ​​опция. Когато тази опция оптимизира заявка SQL Server за най-често срещаните ключови стойности въз основа на статистиката

създаде Proc dbo.GetAvgSalaryByLocation (@Location nvarchar (64))

където Местоположение = @Location

опция (оптимизиране за НЕИЗВЕСТЕН)