SSMS
 sql >> Datenbank >  >> Database Tools >> SSMS

Warum wird eine Abfrage in SQL Azure so viel langsamer ausgeführt?

Das ist in erster Linie eine Frage der Leistung. Sie haben es Ihrerseits mit einem schlecht funktionierenden Code zu tun und müssen den Engpass identifizieren und beheben. Ich rede von den schlechten 2 Sekunden Leistung jetzt. Befolgen Sie die Richtlinien unter How to analyze SQL Server performance . Sobald diese Abfrage für eine Web-App lokal akzeptabel ausgeführt wird (weniger als 5 ms), können Sie die Frage stellen, ob sie in Azure SQL-Datenbank portiert werden soll. Im Moment hebt Ihr Testkonto nur die bestehenden Ineffizienzen hervor.

Nach dem Update

...
@iddepartment int
...
iddepartment='+convert(nvarchar(max),@iddepartment)+'
...

also, was ist es? ist die iddepartment Spalte ein int oder ein nvarchar ? Und warum sollte man (max) verwenden? ?

Folgendes sollten Sie tun:

  • parametriere @iddepartment im inneren dynamischen SQL
  • Hör auf nvarchar(max) zu machen Wandlung. Erstellen Sie die iddepartment und @iddertment Typen übereinstimmen
  • Indizes auf iddepartment sicherstellen und alle idkpi s

So parametrisieren Sie das innere SQL:

set @sql =N'
Select * from (
select kpiname, target, ivalues, convert(decimal(18,2),day(idate)) as iDay   
from kpi
inner join kpivalues on kpivalues.idkpi=kpi.idkpi
inner join kpitarget on kpitarget.idkpi=kpi.idkpi
inner join departmentbscs on departmentbscs.idkpi=kpi.idkpi
where [email protected]
group by kpiname,target, ivalues,idate)x
pivot
(
     avg(ivalues)
    for iDay in (' [email protected] + N')
) p'

execute sp_executesql @sql, N'@iddepartment INT', @iddepartment;

Die abdeckenden Indizes sind bei weitem die wichtigste Lösung. Das erfordert offensichtlich mehr Informationen, als hier vorhanden sind. Lesen Sie Entwerfen von Indizes einschließlich aller Unterkapitel.

Als allgemeinere Bemerkung:Diese Art von Abfragen passt zu columnstores mehr als Rowstore, obwohl ich denke, dass die Datengröße im Grunde genommen winzig ist. Azure SQL-DB unterstützt aktualisierbare gruppierte Columnstore-Indizes, Sie können damit experimentieren, wenn Sie mit einer erheblichen Datengröße rechnen. Sie erfordern Enterprise/Development auf der lokalen Box, stimmt.