Sugestii în interogări (transact-sql)

Instrucțiunile din interogare indică faptul că solicitarea ar trebui utilizată pentru interogare. Instrucțiunile din interogare afectează toți operatorii din instrucțiune. Dacă interogarea principală utilizează operația UNION, numai ultima interogare care o utilizează poate conține o clauză OPTION. Instrucțiunile din cerere sunt specificate ca parte a clauzei OPTION. Dacă optimizatorul de interogări nu formează un plan valid datorită uneia sau mai multor instrucțiuni din interogare, apare o eroare 8622.

Deoarece optimizatorul de interogări SQL Server alege, de obicei, cel mai bun plan de executare a interogărilor, numai dezvoltatorii cu experiență și administratorii de baze de date sunt recomandați să utilizeze indicii ca ultimă soluție.

Specifică faptul că agregatele din clauzele GROUP BY, DISTINCT și COMPUTE ar trebui să utilizeze hashing sau comenzi.

Indică faptul că toate operațiile UNION sunt efectuate prin combinarea, hashingul sau fuziunea seturilor UNION. Dacă sunt specificate mai multe instrucțiuni UNION, optimizatorul de interogări alege strategia cea mai puțin costisitoare de la cele specificate.

Indică faptul că toate operațiile de conectare din întreaga solicitare sunt efectuate utilizând recomandările LOOP JOIN, MERGE JOIN sau HASH JOIN. Dacă se specifică mai multe solicitări de conectare, optimizatorul de interogări alege cea mai puțin costisitoare strategie de la cea permisă.

Dacă într-o singură interogare este specificată sugestia de conectare pentru o anumită pereche de tabele din clauza FROM, aceasta are prioritate în asocierea celor două tabele, deși trebuie să țineți cont și de solicitările din interogare. Astfel, sugestia din join pentru o pereche de tabele poate restricționa doar alegerea metodelor valide de asociere pentru a solicita interogarea. Pentru mai multe informații, consultați Sugestiile din conexiune (Transact-SQL).

Indică faptul că interogarea este optimizată pentru a obține rapid numerele first_rows. linii. Trebuie să fie un număr întreg non-negativ. După revenirea primelor numere_rotate, interogarea continuă să execute și returnează întregul set de rezultate.

Indică faptul că atunci când interogarea este optimizată, ordinea de asociere specificată de sintaxa interogării este păstrată. Utilizarea promptului FORCE ORDER nu afectează posibila inversare a rolurilor din optimizatorul de interogări. Pentru mai multe informații, consultați Înțelegerea conexiunilor Hash.

Instrucțiunea MERGE primește accesul la tabela sursă, apoi la destinație în ordinea implicită de conectare, cu excepția cazului în care este specificată clauza WHEN SOURCE NOT MATCHED. Dacă specificați FORCE ORDER, comportamentul implicit este păstrat.

Pentru informații despre modul în care optimizatorul de interogări SQL Server folosește forțat instrucțiunea FORCE ORDER, dacă interogarea conține o vizualizare, consultați Rezoluția vizualizărilor.

Suprascrie gradul maxim de parametru de configurare al parallelismsp_configure și controlul resursei pentru interogarea specificând acest parametru. Promotorul din interogarea MAXDOP poate depăși valoarea specificată de procedura sp_configure. Dacă MAXDOP depășește valoarea configurată cu Resource Governor, motorul bazei de date utilizează valoarea MAXDOP a controlerului de resurse descris în ALTER WORKLOAD GROUP (Transact-SQL). Toate regulile semantice utilizate de parametrul de configurare a paralelismului max sunt aplicabile atunci când se utilizează solicitarea în cererea MAXDOP. Pentru mai multe informații, consultați Gradul maxim de paralelism.

Dacă valoarea MAXDOP este zero, serverul selectează gradul maxim de paralelism. Serverul creează o limită internă DOP la 64.

Indică pentru optimizatorul de interogări că atunci când compilați și optimizați interogarea, trebuie să utilizați o valoare specifică pentru variabila locală. Valoarea este utilizată numai în timpul optimizării interogării, dar nu în timpul execuției.

Numele variabilei locale utilizate în interogare, căruia i se poate atribui o valoare pentru utilizare cu promptul în interogarea OPTIMIZE FOR.

Indică faptul că optimizatorul de interogări utilizează statistici în loc de valoarea inițială pentru a determina valoarea variabilei locale atunci când optimizează interogarea.

O constantă de caractere a cărei valoare este atribuită argumentului @variable_name pentru a fi utilizat în solicitare în interogarea OPTIMIZE FOR. Valoarea literal_constant este folosită numai în procesul de optimizare a interogării, și nu ca valoare a @variable_name în timpul executării interogării. Valoarea literal_constant poate fi orice tip de date de sistem de SQL Server, care poate fi exprimată ca o constantă de caractere. Tipul de date literal_constant trebuie să se refere implicit la tipul de date la care se referă argumentul @variable_name din interogare.

Clauza OPTIMIZE FOR poate fi utilizată pentru a suprascrie definiția implicită a parametrilor în optimizator sau la crearea unei structuri de plan. Pentru mai multe informații, consultați Recompilarea procedurilor stocate și optimizarea interogărilor în aplicațiile utilizate cu planuri de planificare.

OPTIMIZAȚI PENTRU NECUNOSCUT

Dacă interogarea este compilată și optimizată, ea instruiește optimizatorul de interogări să utilizeze statisticile în locul valorilor inițiale pentru toate variabilele locale, inclusiv parametrii creați cu parametrizare forțată. Pentru mai multe informații despre parametrizarea forțată, consultați Parametrizarea forțată.

Dacă sfaturile de optimizări pentru @variable_name = literal_constant și optimizări pentru NECUNOSCUT sunt utilizate în tooltip într-o singură interogare, optimizatorul de interogare va utiliza literal_constant argument. specificate pentru o anumită valoare și NECESARE pentru valorile rămase ale variabilelor. Valorile sunt utilizate numai în timpul procesului de optimizare a interogării, dar nu în timpul executării.

Specifică regulile de parametrizare SQL Server pe care optimizatorul de interogări se aplică interogării atunci când este compilată.

Promotorul din interogarea PARAMETERIZATION poate fi specificat numai în structura planului. Nu poate fi definită direct în interogare.

Valoarea SIMPLE instruiește optimizatorul de interogări să utilizeze o parametrizare simplă. Valoarea FORCED dă optimizatorul de interogări o recomandare pentru utilizarea parametrizării forțate. Promotorul din interogarea PARAMETERIZATION este utilizat pentru a suprascrie setările parametrilor curenți de PARAMETERIZARE din structura planului de bază de date. Pentru mai multe informații, consultați Specificarea unui mecanism de parametrizare a interogărilor utilizând structurile planului.

Specifică componenta SQL Server Database Engine pentru a renunța la planul care a fost generat după ce interogarea a fost rulată, determinând optimizatorul de interogări să recompileze planul interogării la următoarea executare a interogării. Fără a indica promptul RECOMPILE, motorul bazei de date cache planurile de interogare și reutilizează-le. La compilarea planurilor de interogare, cererea din interogarea RECOMPILE utilizează valorile curente ale tuturor variabilelor locale din interogare și, dacă interogarea se află în interiorul procedurii stocate, valorile curente pentru toți parametrii.

Sfat recompilați - aceasta este o alternativă utilă pentru crearea unei proceduri stocate, folosind o oferta cu recompilați, în cazurile în care necesitatea de a recompilați doar o parte din interogarea într-o procedură stocată, nu procedura de ansamblu stocată. Pentru mai multe informații, consultați Recompilarea procedurilor stocate. Instrumentul RECOMPILE este de asemenea util pentru crearea structurilor planului. Pentru mai multe informații, consultați Optimizarea interogărilor din aplicațiile utilizate cu planurile de planificare.

Cauzează optimizatorul de interogări să utilizeze un plan care funcționează cu rândurile cu cea mai mare dimensiune potențială, posibil cu pierderi de performanță. Când procesați o interogare, mesele intermediare și operatorii ar putea avea nevoie să stocheze și să proceseze șiruri de caractere mai largi decât oricare dintre șirurile de intrare. Linile pot fi atât de largi încât uneori unii operatori nu le pot procesa. Când se întâmplă acest lucru, motorul bazei de date returnează o eroare atunci când interogarea este executată. Folosind promptul ROBUST PLAN, optimizatorul de interogare este instruit să nu selecteze niciunul dintre planurile de interogare care ar putea provoca problema.

Dacă un astfel de plan nu este posibil, optimizatorul de interogări returnează imediat eroarea, fără a întârzia detectarea erorilor în momentul executării interogării. Rândurile pot conține coloane cu lungime variabilă; motorul bazei de date vă permite să specificați mărimea potențială maximă pentru rânduri, dincolo de care motorul bazei de date ar putea să nu fie capabil să le proceseze. Practic, în ciuda dimensiunii maxime potențiale, aplicația salvează rânduri care au dimensiuni reale cu constrângeri pe care motorul bazei de date le poate gestiona. Dacă motorul de bază de date întâlnește un șir prea lung, este returnată o eroare de execuție.

Forțează optimizatorul de interogări să reducă pragul aproximativ de re-compilare pentru interogare. Pragul presupus de re-compilare este punctul în care interogarea este recompilată automat dacă numărul așteptat de coloane indexate s-a modificat în tabel când se execută instrucțiunile UPDATE, DELETE sau INSERT. Când specificați promptitudinea PLANULUI KEEP, asigurați-vă că interogarea nu este adesea recompusă atunci când efectuați mai multe actualizări în tabel.

Aceasta forțează optimizatorul de interogări să nu recompileze interogarea când statisticile se schimbă. Când specificați promptitudinea PLANULUI KEEPFIXED, asigurați-vă că interogarea va fi recompusă numai dacă schimba tabelul de bază este modificată sau dacă procedura sp_recompile este executată împotriva lor.

Indică faptul că vizualizările indexate sunt în curs de desfășurare și că optimizatorul de interogări nu va trata vizualizările indexate ca înlocuitori pentru toate părțile interogării. Vizualizarea este extinsă atunci când numele vizualizării este înlocuit cu definiția de vizualizare din textul interogării.

Acest prompt în interogare interzice practic utilizarea directă a vizualizărilor indexate și a indexurilor pentru vizualizările indexate în planul interogărilor.

Această acțiune este afectată numai de reprezentările din partea SELECT a instrucțiunilor, inclusiv cele găsite în instrucțiunile INSERT, UPDATEMERGE și DELETE.

Indică numărul maxim de recuperări permise pentru o interogare. Numărul de număr este un număr întreg negativ între 0 și 32 767. Dacă este specificat 0, nu se aplică nicio restricție. Dacă acest parametru nu este specificat, limita prestabilită este 100.

Dacă în timpul executării interogării se atinge numărul specificat sau numărul implicit pentru solicitarea MAXRECURSION, executarea cererii este finalizată și se întoarce o eroare.

Din cauza acestei erori, toate instrucțiunile sunt redate înapoi. Dacă aceasta este o instrucțiune SELECT, unele dintre rezultate pot fi returnate sau nimic returnat. Orice rezultate parțiale returnate nu pot include toate rândurile pe niveluri recursive situate dincolo de nivelul maxim de recursivitate specificat.

Forțează optimizatorul de interogări să utilizeze planul de interogare existent pentru interogarea specificată de parametrul "xml_plan". Pentru mai multe informații, consultați Specificarea planurilor de interogare prin forțarea unui plan. Clauza USE PLAN nu poate fi specificată în instrucțiunile INSERT, UPDATE MERGE și DELETE.

Aplică o sugestie de tabelă dată tabelului sau vizualizării corespunzătoare argumentului_expunere_obiectiv. Sugestiile de tabel sunt recomandate pentru a fi utilizate ca solicitări în interogări numai în contextul structurii planului.

Argumentul_object_name poate reprezenta unul dintre următoarele link-uri.

Dacă aliasul unui tabel sau al unei vizualizări este utilizat în clauza FROM a interogării, acest alias este expus_object_name.

Dacă exposed_object_name argument este specificat fără a specifica un indiciu tabel, toți indicii specificate în cerere, ca parte a unui indiciu de masă, nu sunt luate în considerare și utilizarea indicelui este determinată de Optimizatorul de interogare. Această metodă poate fi utilizată pentru a elimina influența indicelui de tabel INDEX, dacă nu este posibilă modificarea interogării originale. Vezi exemplul K.

O sugestie de tabel folosită ca indiciu într-o interogare către o tabelă sau vizualizare care corespunde argumentului expus_obiectiv_name. Pentru o descriere a acestor sfaturi, consultați Sugestii de tabelă (Transact-SQL).

indicii de masă, cu excepția INDEX și FORCESEEK, nu sunt permise ca solicitările într-o interogare, cu excepția cazului când interogarea conține deja propunere, specificând indiciu de masă. Pentru mai multe informații, consultați secțiunea "Observații" de mai jos.

Sugestiile din interogare nu pot fi specificate în instrucțiunea INSERT, cu excepția cazului în care clauza SELECT este utilizată în interiorul instrucțiunii.

Puteți specifica sugestii în interogare numai în interogările de nivel superior, dar nu și în subcheile. Dacă sugestia de tabelă este specificată ca o sugestie în interogare, o puteți specifica în interogarea de nivel superior sau în interogarea imbricată. Cu toate acestea, valoarea argumentului exposed_object_name din clauza TABLE HINT trebuie să se potrivească exact cu numele vizibil din interogare sau interogare imbricată.

Definirea sugestiilor de tabel ca sugestii într-o interogare

Se recomandă utilizarea indicelui de tabelă INDEX sau FORCESEEK ca prompt în interogare numai în contextul structurii planului. Structurile planificate sunt utile dacă nu puteți modifica cererea inițială, de exemplu, deoarece este o aplicație terță parte. Promisiunile din interogarea specificată în structura planului sunt adăugate la interogare înainte de a fi compilate și optimizate. În interogările ad hoc, clauza TABLE HINT este utilizată numai atunci când se testează instrucțiunile de structură a planului. Pentru toate celelalte interogări ad-hoc, vă recomandăm să specificați aceste sugestii doar ca sugestii de tabel.

Indicațiile de tabel INDEX și FORCESEEK specificate ca solicitări în interogare sunt valabile pentru următoarele obiecte:

Exemplu de tabelă generalizată (sugestia trebuie specificată într-o instrucțiune SELECT a cărei set de rezultate umple expresia de masă generalizată).

Vizualizări administrative dinamice

S-au numit interogări nesolicitate

Sugestiile de tabel INDEX și FORCESEEK pot fi specificate ca solicitări în interogări pentru o interogare care nu are sugestii de tabelă existente. În plus, pot înlocui sugestiile INDEX sau FORCESEEK existente în această interogare. indicii de masă, cu excepția INDEX și FORCESEEK, nu sunt permise ca solicitările într-o interogare, cu excepția cazului când interogarea conține deja propunere, specificând indiciu de masă. În acest caz, pentru a păstra semantica interogare, trebuie să specificați, de asemenea, indiciu de masă corespunzător ca un indiciu de interogare solicitând propunerea OPȚIUNE de cuvinte cheie TABLE Hint. De exemplu, dacă interogarea conține un tabel NOLOCK indiciu, opțiunea licitată structura planului de @hints parametru, de asemenea, trebuie să conțină un NOLOCK indiciu. Cm. Exemplul L. Dacă specificați un indiciu de masă, altele decât INDEX sau FORCESEEK, folosind SUGESTIE TABLE în clauza OPTION, fără o interogare de potrivire indiciu (sau invers) se va întoarce eroare 8702, indicând faptul că propunerea opțiune ar determina o modificare semantica interogare, iar cererea se va termina cu o eroare. Pentru mai multe informații, consultați Utilizarea prompturilor în INDEX și interogările FORCESEEK în structurile planului.