Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 从.NET应用程序到SQL Server的调用偶尔缓慢_Sql Server 2005_Data Retrieval - Fatal编程技术网

Sql server 2005 从.NET应用程序到SQL Server的调用偶尔缓慢

Sql server 2005 从.NET应用程序到SQL Server的调用偶尔缓慢,sql-server-2005,data-retrieval,Sql Server 2005,Data Retrieval,我在SQL Server中有一个表,它是从一个仍在生产中的遗留系统继承的,该系统是根据下面的代码构造的。我创建了一个SP来查询表,如表create语句下面的代码所述。我的问题是,通过Enterprise Library 4和DataReader对象从.NET偶尔调用此SP的速度很慢。SP通过数据层中的循环结构调用,该结构指定进入SP的参数,以填充用户对象。同样重要的是,在循环结构的每一次传递中都不会发生慢速调用。一般来说,在一天或更长的时间内都可以,然后开始演示,这使得调试非常困难 该表包含大约

我在SQL Server中有一个表,它是从一个仍在生产中的遗留系统继承的,该系统是根据下面的代码构造的。我创建了一个SP来查询表,如表create语句下面的代码所述。我的问题是,通过Enterprise Library 4和DataReader对象从.NET偶尔调用此SP的速度很慢。SP通过数据层中的循环结构调用,该结构指定进入SP的参数,以填充用户对象。同样重要的是,在循环结构的每一次传递中都不会发生慢速调用。一般来说,在一天或更长的时间内都可以,然后开始演示,这使得调试非常困难

该表包含大约500万行。例如,缓慢的呼叫将耗时10秒,而快速的呼叫平均耗时0到10毫秒。我在慢速调用期间检查了锁定/阻止事务,没有发现任何事务。我在数据层中创建了一些自定义性能计数器来监视调用时间。本质上,当性能不好时,这一次调用就真的不好了。但是当它好的时候,它真的很好。我已经能够在一些不同的开发人员机器上重现这个问题,但在我们的开发和登台数据库服务器上却没有,当然,这些服务器的硬件更强大。通常,问题可以通过重新启动SQL server服务来解决,但并不总是这样。表中有我正在查询的字段的索引,但是索引比我想要的多。然而,由于索引可能会对遗留系统产生影响,我不太愿意删除任何索引或玩弄索引。以前有没有人遇到过这样的问题,或者你有没有补救的建议

CREATE TABLE [dbo].[product_performance_quarterly](
    [performance_id] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
    [product_id] [int] NULL,
    [month] [int] NULL,
    [year] [int] NULL,
    [performance] [decimal](18, 6) NULL,
    [gross_or_net] [char](15) NULL,
    [vehicle_type] [char](30) NULL,
    [quarterly_or_monthly] [char](1) NULL,
    [stamp] [datetime] NULL CONSTRAINT [DF_product_performance_quarterly_stamp]  DEFAULT (getdate()),
    [eA_loaded] [nchar](10) NULL,
    [vehicle_type_id] [int] NULL,
    [yearmonth] [char](6) NULL,
    [gross_or_net_id] [tinyint] NULL,
 CONSTRAINT [PK_product_performance_quarterly_4_19_04] PRIMARY KEY CLUSTERED 
(
    [performance_id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 80) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[product_performance_quarterly]  WITH NOCHECK ADD  CONSTRAINT [FK_product_performance_quarterlyProduct_id] FOREIGN KEY([product_id])
REFERENCES [dbo].[products] ([product_id])
GO
ALTER TABLE [dbo].[product_performance_quarterly] CHECK CONSTRAINT [FK_product_performance_quarterlyProduct_id]

CREATE PROCEDURE [eA.Analytics.Calculations].[USP.GetCalculationData]
(
    @PRODUCTID INT,                     --products.product_id
    @BEGINYEAR INT,                     --year to begin retrieving performance data
    @BEGINMONTH INT,                    --month to begin retrieving performance data
    @ENDYEAR INT,                       --year to end retrieving performance data
    @ENDMONTH INT,                      --month to end retrieving performance data
    @QUARTERLYORMONTHLY VARCHAR(1),     --do you want quarterly or monthly data?
    @VEHICLETYPEID INT,                 --what product vehicle type are you looking for?
    @GROSSORNETID INT                   --are your looking gross of fees data or net of fees data?
)
AS
BEGIN

    SET NOCOUNT ON

    DECLARE @STARTDATE VARCHAR(6),
            @ENDDATE   VARCHAR(6),
            @vBEGINMONTH VARCHAR(2),
            @vENDMONTH VARCHAR(2)   

IF LEN(@BEGINMONTH) = 1 
    SET @vBEGINMONTH = '0' + CAST(@BEGINMONTH AS VARCHAR(1))
ELSE
    SET @vBEGINMONTH = @BEGINMONTH

IF LEN(@ENDMONTH) = 1
    SET @vENDMONTH = '0' + CAST(@ENDMONTH AS VARCHAR(1))
ELSE
    SET @vENDMONTH = @ENDMONTH

SET @STARTDATE = CAST(@BEGINYEAR AS VARCHAR(4)) + @vBEGINMONTH
SET @ENDDATE = CAST(@ENDYEAR AS VARCHAR(4)) + @vENDMONTH

--because null values for gross_or_net_id and vehicle_type_id are represented in 
--multiple ways (true null, empty string, or 0) in the PPQ table, need to account for all possible variations if 
--a -1 is passed in from the .NET code, which represents an enumerated value that
--indicates that the value(s) should be true null.

IF @VEHICLETYPEID = '-1' AND @GROSSORNETID = '-1'
    SELECT
        PPQ.YEARMONTH, PPQ.PERFORMANCE
    FROM PRODUCT_PERFORMANCE_QUARTERLY PPQ
        WITH (NOLOCK)
    WHERE 
        (PPQ.PRODUCT_ID = @PRODUCTID)
        AND (PPQ.YEARMONTH BETWEEN @STARTDATE AND @ENDDATE)
        AND (PPQ.QUARTERLY_OR_MONTHLY = @QUARTERLYORMONTHLY)
        AND (PPQ.VEHICLE_TYPE_ID IS NULL OR PPQ.VEHICLE_TYPE_ID = '0' OR PPQ.VEHICLE_TYPE_ID = '')
        AND (PPQ.GROSS_OR_NET_ID IS NULL OR PPQ.GROSS_OR_NET_ID = '0' OR PPQ.GROSS_OR_NET_ID = '')
    ORDER BY PPQ.YEARMONTH ASC

IF @VEHICLETYPEID <> '-1' AND @GROSSORNETID <> '-1'
    SELECT
        PPQ.YEARMONTH, PPQ.PERFORMANCE
    FROM PRODUCT_PERFORMANCE_QUARTERLY PPQ
        WITH (NOLOCK)
    WHERE 
        (PPQ.PRODUCT_ID = @PRODUCTID)
        AND (PPQ.YEARMONTH BETWEEN @STARTDATE AND @ENDDATE)
        AND (PPQ.QUARTERLY_OR_MONTHLY = @QUARTERLYORMONTHLY)
        AND (PPQ.VEHICLE_TYPE_ID = @VEHICLETYPEID )
        AND (PPQ.GROSS_OR_NET_ID = @GROSSORNETID)
    ORDER BY PPQ.YEARMONTH ASC

IF @VEHICLETYPEID = '-1' AND @GROSSORNETID <> '-1'
    SELECT
        PPQ.YEARMONTH, PPQ.PERFORMANCE
    FROM PRODUCT_PERFORMANCE_QUARTERLY PPQ
        WITH (NOLOCK)
    WHERE 
        (PPQ.PRODUCT_ID = @PRODUCTID)
        AND (PPQ.YEARMONTH BETWEEN @STARTDATE AND @ENDDATE)
        AND (PPQ.QUARTERLY_OR_MONTHLY = @QUARTERLYORMONTHLY)
        AND (PPQ.VEHICLE_TYPE_ID IS NULL OR PPQ.VEHICLE_TYPE_ID = '0' OR PPQ.VEHICLE_TYPE_ID = '')
        AND (PPQ.GROSS_OR_NET_ID = @GROSSORNETID)
    ORDER BY PPQ.YEARMONTH ASC

IF @VEHICLETYPEID <> '-1' AND @GROSSORNETID = '-1'
    SELECT
        PPQ.YEARMONTH, PPQ.PERFORMANCE
    FROM PRODUCT_PERFORMANCE_QUARTERLY PPQ
        WITH (NOLOCK)
    WHERE 
        (PPQ.PRODUCT_ID = @PRODUCTID)
        AND (PPQ.YEARMONTH BETWEEN @STARTDATE AND @ENDDATE)
        AND (PPQ.QUARTERLY_OR_MONTHLY = @QUARTERLYORMONTHLY)
        AND (PPQ.VEHICLE_TYPE_ID = @VEHICLETYPEID)
        AND (PPQ.GROSS_OR_NET_ID IS NULL OR PPQ.GROSS_OR_NET_ID = '0' OR PPQ.GROSS_OR_NET_ID = '')
    ORDER BY PPQ.YEARMONTH ASC

END
创建表[dbo]。[产品性能季度](
[performance_id][int]标识(1,1)不用于复制不为空,
[product_id][int]NULL,
[month][int]空,
[year][int]NULL,
[性能][十进制](18,6)空,
[gross_或[u net][char](15)空,
[车辆类型][字符](30)空,
[季度或月度][char](1)空,
[stamp][datetime]空约束[DF_product_performance_quarterly_stamp]默认值(getdate()),
[eA_loaded][nchar](10)空,
[车辆类型识别码][int]空,
[yearmonth][char](6)空,
[总或净id][tinyint]空,
约束[PK_产品_性能_季度_4_19_04]主键群集
(
[性能标识]ASC
)(PAD_INDEX=OFF,STATISTICS_norecocomputer=OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON,FILLFACTOR=80)打开[主]
)在[小学]
去
将ANSI_填充设置为关闭
去
更改表[dbo]。[product_performance_quarterly]时不勾选添加约束[FK_product_performance_quarterly product_id]外键([product_id])
参考文献[dbo].[products]([product_id])
去
更改表[dbo]。[product\u performance\u quarterly]检查约束[FK\u product\u performance\u quarterly product\u id]
创建过程[eA.Analytics.Calculations]。[USP.GetCalculationData]
(
@PRODUCTID INT,--products.product\U id
@BEGINYEAR INT,--开始检索性能数据的年份
@BEGINMONTH INT,--开始检索性能数据的月份
@ENDYEAR INT,--检索性能数据的截止日期
@ENDMONTH INT,--检索性能数据的截止月份
@QUARTERLYORMONTHLY VARCHAR(1),--您想要季度数据还是月度数据?
@VEHICLETYPEID INT,--您要找的是什么产品车辆类型?
@GROSSORNETID INT——您是查看费用总额数据还是费用净额数据?
)
作为
开始
不计较
声明@STARTDATE VARCHAR(6),
@ENDDATE VARCHAR(6),
@vBEGINMONTH VARCHAR(2),
@瓦查尔(2)
如果LEN(@BEGINMONTH)=1
设置@vBEGINMONTH='0'+强制转换(@BEGINMONTH为VARCHAR(1))
其他的
设置@vBEGINMONTH=@BEGINMONTH
如果LEN(@ENDMONTH)=1
设置@vENDMONTH='0'+强制转换(@ENDMONTH为VARCHAR(1))
其他的
设置@vENDMONTH=@ENDMONTH
设置@STARTDATE=CAST(@BEGINYEAR为VARCHAR(4))+@vbegimonth
设置@ENDDATE=CAST(@ENDYEAR为VARCHAR(4))+@vENDMONTH
--因为gross\u或\u net\u id和vehicle\u type\u id的空值表示为
--PPQ表中的多种方式(真空、空字符串或0)需要考虑所有可能的变化,如果
--从.NET代码传入-1,该代码表示
--指示值应为true null。
如果@VEHICLETYPEID='-1'和@GROSSORNETID='-1'
挑选
PPQ.YEARMONTH,PPQ.PERFORMANCE
来自产品性能季度PPQ
与(诺洛克)
哪里
(PPQ.PRODUCT_ID=@PRODUCTID)
和(从@STARTDATE到@ENDDATE的PPQ.YEARMONTH)
和(PPQ.季度或月度=@quarterlymonthly)
和(PPQ.VEHICLE\u TYPE\u ID为空或PPQ.VEHICLE\u TYPE\u ID='0'或PPQ.VEHICLE\u TYPE\u ID='')
和(PPQ.GROSS\u或\u NET\u ID为NULL或PPQ.GROSS\u或\u NET\u ID='0'或PPQ.GROSS\u或\u NET\u ID='')
由PPQ订购。年月ASC
如果@VEHICLETYPEID'-1'和@GROSSORNETID'-1'
挑选
PPQ.YEARMONTH,PPQ.PERFORMANCE
来自产品性能季度PPQ
与(诺洛克)
哪里
(PPQ.PRODUCT_ID=@PRODUCTID)
和(从@STARTDATE到@ENDDATE的PPQ.YEARMONTH)
和(PPQ.季度或月度=@quarterlymonthly)
和(PPQ.VEHICLE\u TYPE\u ID=@VEHICLETYPEID)
和(PPQ.GROSS\u或\u NET\u ID=@GROSSORNETID)
由PPQ订购。年月ASC
如果@VEHICLETYPEID='-1'和@GROSSORNETID'-1'
挑选
PPQ.YEARMONTH,PPQ.PERFORMANCE
来自产品性能季度PPQ
与(诺洛克)
哪里
(PPQ.PRODUCT_ID=@PRODUCTID)
和(PPQ.YEARMONTH),从@STARTDATE到