Gewähren Sie Benutzern die Berechtigung zur Verwendung von QUERYTRACEON 9481

7

Microsoft schlägt vor , OPTION (QUERYTRACEON 9481)Abfragen zu verwenden, deren Leistung für SQL Server 2014-Datenbanken, die unter Kompatibilitätsstufe 120 ausgeführt werden, "beeinträchtigt" wurde.

In meiner Situation bedeutet "degradiert", von einigen Sekunden auf einige Minuten oder mehr zu wechseln. In Bezug auf die Leistung funktioniert 9481 sehr gut. Normale Benutzer erhalten jedoch einen netten Fehler anstelle von Abfrageergebnissen (Ausführen von SSRS-Berichten):

User 'xxxxx' does not have permission to run DBCC TRACEON.

Aus der Dokumentation geht hervor, dass Benutzer Mitglieder der Sysadmin-Rolle sein müssen, um ausgeführt zu werden DBCC TRACEON.

Gibt es Problemumgehungen, mit denen Nicht-Systemadministratoren Abfragen ausführen können, die diesen Hinweis verwenden?

Ich möchte die Kompatibilitätsstufe lieber nicht auf 110 senken, da die meisten unserer Abfragen akzeptabel sind oder besser funktionieren.

Sack
quelle

Antworten:

4

Sie können einen erstellen Planhinweis als Sysadmin für die Abfrage, die der Benutzer dann erlauben würde , die bereits bestehenden Plan laufen. Andernfalls können Sie die Abfrage nur umschreiben.

Verwendung QUERYTRACEONin Planhandbüchern

Joel
quelle
Verwendung einer verschlechterten Inline-Kompatibilitätsstufe in einer Abfrage -SELECT * FROM <yourTableName> option (querytraceon 9481)
RBT
0

Bitte verwenden Sie die Hinweisoption, da keine Erlaubnis erforderlich ist.

OPTION (USE TIPP ('FORCE_LEGACY_CARDINALITY_ESTIMATION'))

lostinbrisbane
quelle
Das funktioniert nur für 2016, und OP fragt nach 2014. Vielleicht aktualisieren Sie Ihre Antwort, um dies widerzuspiegeln. Es ist nützlich für andere, beantwortet aber nicht wirklich die ursprüngliche Frage.
HandyD
-1

Anstatt OPTION (QUERYTRACEON 9481) zu verwenden, wird hier eine Lösung / Problemumgehung vorgeschlagen.
Es ermöglicht einem Nicht-Sa-Benutzer, den Kardinalitätsschätzer für die bestimmte Anweisung, Abfrage oder Prozeduraufruf (für die aktuelle Sitzung) zu ändern.

Lösung:

Wunderbar erklärt von Kimberly Tripp in ihrem Beitrag auf sqlskills.com:
"Festlegen von CE-TraceFlags auf Abfrage-für-Abfrage- (oder Sitzungs-) Basis"

  1. Erstellen Sie eine gespeicherte Prozedur in der msdb-Datenbank, mit der ein gewünschtes Trace-Flag ohne Sysadmin-Berechtigungen festgelegt werden kann.
    (Natürlich kümmert sich sysadmin darum, eine Liste der zulässigen Trace-Flag-Werte einzurichten.)

  2. Schließen Sie alle problematischen Anweisungen (dynamisches SQL, Ad-hoc-Abfrage oder Prozeduraufruf) mit einem Aufruf dieser gespeicherten Prozedur ab und ändern Sie das Sitzungsablaufverfolgungsflag für die Ausführung.
    Auf diese Weise können Benutzer mit niedrigeren Berechtigungen den Kardinalitätsschätzer für die Ausführung der problematischen Anweisung ändern.

Anwendungsbeispiel:

EXEC msdb.dbo.msdbSetTraceFlag 9481, 1; 
GO  

Problematic STATEMENT or PROCEDURE   

EXEC msdb.dbo.msdbSetTraceFlag 9481, 0;  -- don't remember to turn it back off!    
GO

Code für gespeicherte Prozeduren:

USE msdb;
GO

CREATE PROCEDURE msdbSetTraceFlag
    (@TraceFlag int,
     @OnOff bit = 0)
WITH EXECUTE AS OWNER
AS
DECLARE @OnOffStr char(1) = @OnOff;
-- Sysadmins can add supported trace flags and then use this
-- from their applications
IF @TraceFlag NOT IN (
              9481 -- LegacyCE if database is compat mode 120 or higher
            , 2312 -- NewCE if database compat mode 110 or lower
                     )
     BEGIN
         RAISERROR('The Trace Flag supplied is not supported. Please contact your system administrator to determine inclusion of this trace flag: %i.', 16, 1, @TraceFlag);
         RETURN
     END
ELSE
     BEGIN
         DECLARE @ExecStr nvarchar(100);
         IF @OnOff = 1
             SELECT @ExecStr = N'DBCC TRACEON(' + CONVERT(nvarchar(4), @TraceFlag) + N')';
         ELSE
             SELECT @ExecStr = N'DBCC TRACEOFF(' + CONVERT(nvarchar(4), @TraceFlag) + N')';
         -- SELECT (@ExecStr)
         EXEC(@ExecStr)
         -- RAISERROR (N'TraceFlag: %i has been set to:%s (1 = ON, 0 = OFF).', 10, 1, @TraceFlag, @OnOffStr);
     END;
GO

GRANT EXECUTE ON msdbSetTraceFlag TO PUBLIC --or to a specific set of users;
GO

Hinweis: Diese gespeicherte Prozedur wird in msdb und nicht auf dem Master erstellt, da für msdb die "vertrauenswürdige" Voraussetzung erforderlich ist.

Mailand
quelle