Megosztás a következőn keresztül:


Lekérdezésparaméterezési viselkedés megadása terv-útmutatók használatával

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseAzure SQL Felügyelt Példány

Ha a PARAMETERIZATION adatbázis beállítás egyszerűre van állítva, az SQL Server lekérdezésoptimalizálója dönthet úgy, hogy paraméterezi a lekérdezéseket. Ez azt jelenti, hogy a lekérdezésekben található literális értékek paraméterekkel lesznek helyettesítve. Ezt a folyamatot egyszerű paraméterezésnek nevezzük. Ha a SIMPLE paraméterezés érvényben van, nem szabályozhatja, hogy mely lekérdezések vannak paraméterezve, és mely lekérdezések nem. Megadhatja azonban, hogy az adatbázisban lévő összes lekérdezés paraméterezhető legyen a PARAMETERIZATION adatbázis beállítás kényszerített értékre állításával. Ezt a folyamatot kényszerített paraméterezésnek nevezzük.

Az adatbázisok paraméterezési viselkedését a következő módokon bírálhatja felül terv-útmutatók használatával:

  • Ha a PARAMETERIZATION adatbázis beállítás EGYSZERŰ értékre van állítva, megadhatja, hogy a rendszer kényszerített paraméterezést kíséreljen meg a lekérdezések egy bizonyos osztályán. Ehhez hozzon létre egy SABLONterv-útmutatót a lekérdezés paraméteres formájában, és adja meg a PARAMETERIZATION FORCED lekérdezési tippet a sp_create_plan_guide tárolt eljárásban. Az ilyen típusú tervutasítást úgy tekintheti, hogy a kényszerített paraméterezést csak a lekérdezések egy bizonyos osztályán engedélyezheti, nem pedig az összes lekérdezést. Az egyszerű paraméterezésről további információt a lekérdezésfeldolgozási architektúra útmutatójábantalál.

  • Ha a PARAMETERIZATION adatbázis BEÁLLÍTÁSA KÉNYSZERÍTETT értékre van állítva, megadhatja, hogy egy bizonyos lekérdezési osztály esetében csak egyszerű paraméterezést kíséreljen meg, ne kényszerített paraméterezést. Ehhez hozzon létre egy SABLONterv-útmutatót a lekérdezés erőltetett paraméterezett formájában, és adja meg a PARAMETERIZATION SIMPLE lekérdezési tippet a sp_create_plan_guide-ben. A kényszerített paraméterezésről további információt a lekérdezésfeldolgozási architektúra útmutatójábantalál.

Fontolja meg a következő lekérdezést a AdventureWorks2025-adatbázisban:

SELECT pi.ProductID, SUM(pi.Quantity) AS Total  
FROM Production.ProductModel AS pm   
    INNER JOIN Production.ProductInventory AS pi   
        ON pm.ProductModelID = pi.ProductID   
WHERE pi.ProductID = 101   
GROUP BY pi.ProductID, pi.Quantity HAVING SUM(pi.Quantity) > 50;  

Adatbázis-rendszergazdaként megállapította, hogy nem szeretné engedélyezni a kényszerített paraméterezést az adatbázis összes lekérdezésén. Azonban el szeretné kerülni az összes olyan lekérdezés fordítási költségeit, amelyek szintaktikailag egyenértékűek az előző lekérdezésével, de csak az állandó literális értékekben különböznek. Más szóval azt szeretné, hogy a lekérdezés paraméterezve legyen, hogy az ilyen típusú lekérdezések lekérdezési tervét újra felhasználja a rendszer. Ebben az esetben hajtsa végre a következő lépéseket:

  1. Kérje le a lekérdezés paraméteres formáját. Az érték sp_create_plan_guide való felhasználásának egyetlen biztonságos módja a sp_get_query_template rendszer által tárolt eljárás használata.

  2. Hozza létre a terv útmutatóját a lekérdezés paraméteres formájában, és adja meg a PARAMETERIZATION FORCED lekérdezési tippet.

    Fontos

    A lekérdezés paraméterezésének részeként az SQL Server egy adattípust rendel a literálértékeket lecserélő paraméterekhez a literál értékétől és méretétől függően. Ugyanez a folyamat vonatkozik a @stmt kimeneti paraméterének átadott konstansok értékére a sp_get_query_templateesetében. Mivel a sp_create_plan_guide@params argumentumában megadott adattípusnak meg kell egyeznie a lekérdezésnek az SQL Server által paraméterezett típusával, előfordulhat, hogy több terv útmutatót kell létrehoznia a lekérdezés lehetséges paraméterértékeinek teljes tartományának lefedéséhez.

A paraméteres lekérdezés beszerzéséhez és a terv útmutatójának létrehozásához a következő szkript használható:

DECLARE @stmt nvarchar(max);  
DECLARE @params nvarchar(max);  
EXEC sp_get_query_template   
    N'SELECT pi.ProductID, SUM(pi.Quantity) AS Total   
      FROM Production.ProductModel AS pm   
      INNER JOIN Production.ProductInventory AS pi ON pm.ProductModelID = pi.ProductID   
      WHERE pi.ProductID = 101   
      GROUP BY pi.ProductID, pi.Quantity   
      HAVING sum(pi.Quantity) > 50',  
    @stmt OUTPUT,   
    @params OUTPUT;  
EXEC sp_create_plan_guide   
    N'TemplateGuide1',   
    @stmt,   
    N'TEMPLATE',   
    NULL,   
    @params,   
    N'OPTION(PARAMETERIZATION FORCED)';  

Hasonlóképpen, egy olyan adatbázisban, amelyben a kényszerített paraméterezés már engedélyezve van, győződjön meg arról, hogy a mintalekérdezés és más, szintaktikailag egyenértékű lekérdezések az állandó literális értékek kivételével az egyszerű paraméterezés szabályai szerint vannak paraméterezve. Ehhez az OPTION záradékban adja meg a PARAMETERIZATION SIMPLE paraméterezést a KÉNYSZERÍTETT PARAMÉTEREZÉS helyett.

Jegyzet

A TEMPLATE tervútmutatók az egyetlen utasításból álló kötegekben elküldött lekérdezéseket az utasításokkal egyeztetik. A többutasításos kötegekben lévő utasítások nem alkalmasak a SABLON tervek útmutatói által való egyeztetésre.