SQL - 使用日期间隔填充临时表,对性能的影响最小

时间:2017-12-28 16:05:54

标签: sql-server performance date stored-procedures temp-tables

在存储过程中,我需要在@StartDate和@EndDate之间以7天的日期间隔填充临时表,如下所示:

CREATE TABLE #DateIntervals (
    PeriodStartDate date,
    PeriodEndDate date
)

DECLARE @StartDate datetime = '1/1/2017';
DECLARE @EndDate datetime = '1/1/2018';

WHILE @StartDate <= @EndDate
BEGIN
    INSERT INTO #DateIntervals (PeriodStartDate, PeriodEndDate)
    SELECT @StartDate, DATEADD(day, 6, @StartDate)

    SET @StartDate = DATEADD(day, 7, @StartDate)
END

它工作正常,但执行时需要 1483毫秒。如果我随后将此表与更多数据连接起来,则需要更多时间来执行。我需要以某种方式缩短这段时间,以提高SP的整体性能。

任何想法如何做到这一点?

1 个答案:

答案 0 :(得分:1)

您可以使用以下单个声明执行此操作

vehicle = { id: 1, name: 'LADA', type: 'washbowl', revision: 15 }

class VehicleDetails < Grape::Entity
  expose :id
  expose :name
  expose :type
  expose :revision, if: lambda { |vehicle, options| options[:show_rev] }
end

VehicleDetails.represent(vehicle, show_rev: true).as_json
# => {:id=>1, :name=>"LADA", :type=>"washbowl", :revision=>15}

VehicleDetails.represent(vehicle).as_json
# => {:id=>1, :name=>"LADA", :type=>"washbowl"}

VehicleDetails.represent(vehicle, show_rev: false).as_json
# => {:id=>1, :name=>"LADA", :type=>"washbowl"}

# # or
# present vehicle with: VehicleDetails, show_rev: true

这应该比53个单独的语句/事务快,但1.5秒对于临时表来说听起来非常慢。