2015-10-25 4 views
-3

У меня есть несколько выборок из C# в одну таблицу на SQL Server за один период с помощью хранимой процедуры. Это правильно, но это медленно, и сейчас я хочу улучшить это.Улучшение C# и SQL Server

Это мой C# код:

while (startDate!= endDate) 
{ 
    var anyDay_CntPost = 0; 
    anyDay_CntPost = db.GetPostCount(1, tmpDate).Select(x => x.cntPost).FirstOrDefault().Value; 

    if (anyDay_CntPost != 0) 
    { 
     var anyDay_cnt1 = db.GetPostCount(1, tmpDate).Select(x => x.cntPost).FirstOrDefault().Value; ; 
     var anyDay_cnt2 = db.GetPostCount(2, tmpDate).Select(x => x.cntPost).FirstOrDefault().Value; 
     var anyDay_cnt3 = db.GetPostCount(3, tmpDate).Select(x => x.cntPost).FirstOrDefault().Value; 

     listCount.arr1.Add(anyDay_cnt1); 
     listCount.arr2.Add(anyDay_cnt2); 
     listCount.arr3.Add(anyDay_cnt3); 
    } 

    startDate = startDate.AddDays(1); 
} 

И это код хранимой процедуры:

ALTER PROCEDURE [dbo].[GetPostCount] 
    @type int, 
    @date nvarchar(max) 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    ----<<----------------------------- 
    if @type = 1 
    begin 
     SELECT cntPost = count(*) 
     FROM Post 
     WHERE Date = @date AND type = 1 
    end 

    ---<<------------------------------ 
    if @type = 1 
    begin 
     SELECT cntPost = count(*) 
     FROM Post 
     WHERE Date = @date and type = 2 
    end 
    ---<<------------------------------ 
    if @type = 2 
    begin 
     SELECT cntPost = count(*) 
     FROM Post 
     WHERE Date = @date and type = 3 
    end 
End 

Мой результат:

____________________________________________ 
| Date | Count 1 | Count 2 | Count 3 | 
------------------------------------------ 
| 10/25/2015 | 200 | 360 | 547 | 
| 10/24/2015 | 185 | 326 | 132 | 
| 10/23/2015 | 100 | 490 | 670 | 
------------------------------------------ 

Я хочу, чтобы оптимизировать код выше, потому что он слишком медленный и запоздалый. Каково ваше предложение?

+1

Ну, я бы просто получил все дни и типы с одним выбором, и я бы использовал правильные типы данных, такие как дата для дат, а не nvarchar (max) –

+0

Можете ли вы попробовать что-то вроде 'Where Date = @date и type в (1,2,3) 'и' group by type'? – M22an

+1

@ M22an Я не могу. Каждый раз я передаю один из видов «типа». –

ответ

3

Моего решения будет следующая процедура:

create procedure [dbo].[GetPostCount] 
    @startdate date, 
    @enddate date 
as 
    select Date, Type, count(*) as cntPost 
    from Post 
    where Date >= @startdate and Date <= @enddate and Type in (1, 2, 3) 
    group by Date, Type 

Вы просто выбрать все данные, которые нужны один раз и затем использовать его в цикле. Теперь вы запрашиваете базу данных 4 раза на каждой итерации и, конечно, медленно.