2017-08-29 1 views
0

Ich habe eine gespeicherte Prozedur erstellt, um Daten zu erhalten. In dieser gespeicherten Prozedur habe ich 1 Tabelle zurückgegeben und Tabelle speichert die Daten über 1 Lakh + Daten. Also gerade jetzt habe ich die gespeicherte Prozedur ausgeführt, dass ich die Daten in über 1 Minute Zeit nehme. Ich will gerade mit in 1 Sekunde Daten bekommen. Ich habe auch SET NOCOUNT ON; gesetzt und auch fehlenden Index erstellt. Trotzdem bekomme ich die gleiche Zeit für die Daten.Wie kann die Geschwindigkeit der Abfrage mit SQL Server verbessert werden?

Dies ist meine Frage:

DECLARE @CurMon int 
DECLARE @year nvarchar(max) 
SELECT @CurMon = month(getdate()) 
SELECT @year = year(getdate())  

SELECT 
    FORMAT(dateadd(MM, T.i, getdate()),'MMM-yy') AS DateColumn, 
    ISNULL(uf.TotalCount, 0) as TotalCount 
FROM 
    (VALUES ([email protected]),([email protected]),([email protected]),([email protected]),([email protected]),([email protected]),([email protected]), ([email protected]), ([email protected]), ([email protected]), ([email protected]), ([email protected])) AS T(i) 
OUTER APPLY 
    (SELECT DISTINCT 
     COUNT(datepart(MM,UF.InsertDateTime)) OVER (partition by datepart(MM,UF.InsertDateTime)) AS TotalCount 
       FROM dbo.UserFollowers UF 
       INNER JOIN dbo.Users U on U.UserId = UF.FollowerId 
       WHERE DATEDIFF(mm,UF.InsertDateTime, DATEADD(mm, T.i, GETDATE())) = 0 and UF.IsFollowed = 1 
      ) uf 
      order by DATEPART(MM,convert(datetime,FORMAT(dateadd(MM, T.i, getdate()),'MMMM') +'01 '[email protected],110)) 

ich bin auch versuchen, eine andere Abfrage für die Geschwindigkeit der Abfrage verbessern, aber immer noch gleiche Zeit ich erhalte. Hier wird diese Abfrage auch gedruckt.

declare @StartDate datetime = dateadd(year , datediff(year , 0, getdate()) , 0) 
declare @tempT2 table 
    (
     MNo int, 
     [Month] datetime, 
     NextMonth datetime) 

;with Months as (
select top (12) 
MNo = row_number() over (order by number) 
,[Month] = dateadd(month, row_number() over (order by number) -1, @StartDate) 
, NextMonth = dateadd(month, row_number() over (order by number), @StartDate) 
from master.dbo.spt_values 
) 

insert into @tempT2 
select * from Months 

select 
m.MNo 
, Month = format(m.Month, 'MMM-yy') 
    , tally = count(UF.InsertDateTime) 
    from @tempT2 m 
left join dbo.UserFollowers UF 
INNER JOIN dbo.Users U on U.UserId = UF.FollowerId 
on UF.InsertDateTime >= m.Month 
    and UF.InsertDateTime < m.NextMonth where UF.IsFollowed = 1 
group by m.MNo,format(m.Month, 'MMM-yy') 
order by MNo 

hier das ist meine beide Abfrage ich versuche, haben aber immer noch i Erfolg bin nicht für das Erhalten der die Geschwindigkeit der Abfrage verbessern. und tut mir leid, aber ich kann hier meinen Ausführungsplan der Abfrage nicht sehen, ich habe keine Erlaubnis dafür.

+2

Bitte benutzen ** international verständlich ** Maßeinheiten: Tausende, Millionen, Milliarden ... –

+0

Fragen Leistung Hilfe suchen sollte DDL umfassen, DML Von den beteiligten Tabellen zusammen mit test data..wenn Ihre Testdaten groß sind, versuchen Sie, das Schema und die Statistiken für die Tabelle zu scripten ('rechte Maustaste Datenbank-> Skripte generieren-> bestimmte Datenbankobjekte auswählen-> im nächsten Bildschirm wählen Sie Erweitert und wählen Sie Skriptstatistiken)' und fügen Sie sie ein es in Frage ... Mit dieser Info repro das gleiche Problem Sie konfrontiert sind.Andernfalls wird es sehr schwierig, Ihre Frage zu beantworten ersion hilft auch – TheGameiswar

+0

@TheGameiswar, aber ich kann keine Erlaubnis für das Skript und den Ausführungsplan generieren hier zeigen. Sie wollen ein paar Daten und mein O/P wollen, also hier kann ich das tun? nur diese Abfrage benötigt mehr und mehr Zeit für das Abrufen von Daten auf dem Server. – Edit

Antwort

1

Sie können anstelle einer Tabellenvariable, in eine temporäre Tabelle ein wenig Leistung gewinnen durch Umschalten und von der format() loszuwerden:

declare @StartDate datetime = dateadd(year , datediff(year , 0, getdate()) , 0) 
create table #Months (
    MNo int not null primary key 
    , Month char(6) not null 
    , MonthStart datetime not null 
    , NextMonth datetime not null 
) 
;with Months as (
select top (12) 
    MNo = row_number() over (order by number) 
    , MonthStart = dateadd(month, row_number() over (order by number) -1, @StartDate) 
    , NextMonth = dateadd(month, row_number() over (order by number), @StartDate) 
from master.dbo.spt_values 
) 
insert into #Months (MNo, Month, MonthStart, NextMonth) 
select 
    MNo 
    , Month = stuff(convert(varchar(9),MonthStart,6),1,3,'') 
    , MonthStart 
    , NextMonth 
from Months; 

select 
    m.MNo 
, m.Month 
, tally = count(UF.InsertDateTime) 
from @tempT2 m 
    inner join dbo.Users U 
    on UF.InsertDateTime >= m.MonthStart 
    and UF.InsertDateTime < m.NextMonth 
    inner join dbo.UserFollowers UF 
    on U.UserId = UF.FollowerId 
    and UF.IsFollowed = 1 
group by 
    m.MNo 
    , m.Month 
order by MNo 

Danach sollten Sie den Ausführungsplan bewerten, wenn zu bestimmen, Sie benötigen eine bessere Indexierungsstrategie.

Wenn Sie es noch schneller benötigen, können Sie eine aktuelle Kalendertabelle erstellen und eine indizierte Sicht erstellen. Eine indizierte Sicht kann eine Aufgabe sein, damit sie sich abhängig von Ihrer SQL-Server-Version korrekt verhält, aber schneller wird.

Referenz:

+1

Vielen Dank für die Hilfe und das ist eine erstaunliche Lösung. – Edit

+0

@Edit Glücklich zu helfen! – SqlZim

Verwandte Themen