等待操作超时

时间:2015-12-16 08:19:03

标签: sql-server

我有2个表,每个表包含4-500k记录

CREATE TABLE [dbo].[User][UserId] [int] IDENTITY(1,1) NOT NULL,
[Password] [nvarchar](max) NULL,
[RoleId] [int] NOT NULL,
[Name] [nvarchar](max) NULL,
[Address] [nvarchar](max) NULL,
[Email] [nvarchar](max) NULL,
[Landline] [nvarchar](max) NULL,
[MobileNumberCode] [int] NULL,
[MobileNumber] [nvarchar](max) NULL,
[DateOfBirth] [datetime] NULL,
[MarriageDate] [datetime] NULL,
[CreatedDate] [datetime] NOT NULL,
[UpdatedDate] [datetime] NOT NULL,
[Status] [nvarchar](max) NOT NULL,
[BranchId] [int] NULL,
[UserTitle] [nvarchar](50) NULL,
[MiddleName] [nvarchar](50) NULL,
[LastName] [nvarchar](50) NULL,
[HouseNumber] [nvarchar](50) NULL,
[BuildingNumber] [nvarchar](50) NULL,
[RoadNumber] [nvarchar](50) NULL,
[BlockNumber] [nvarchar](50) NULL,
[City] [nvarchar](50) NULL,
[NearBranchId] [int] NULL,
[MobileIsValid] [bit] NULL,
[EmailIsValid] [bit] NULL,
[Gender] [nvarchar](50) NULL,
[SourceId] [int] NULL)

CREATE TABLE [dbo].[PurchaseOrder]
[PurchaseOrderId] [int] NOT NULL,
[BranchId] [int] NOT NULL,
[PurchaseDate] [datetime] NOT NULL,
[Amount] [decimal](18, 3) NOT NULL,
[UserId] [int] NOT NULL,
[Status] [nvarchar](max) NULL,
[sbs_no] [int] NOT NULL)

我有存储过程来使用join从这些表中获取数据。

CREATE PROC Sp_SearchCustomer (@FromDate datetime = null,
@ToDate datetime = null,
@RegFromDate datetime = null,
@RegToDate datetime = null)
AS
BEGIN
  select a.UserId,a.Name,b.PurchaseOrderId,b.Amount from dbo.[User] a left      join PurchaseOrder b on a.UserId=b.UserId
where 
((a.CreatedDate >= ''' + cast(@RegFromDate as varchar) + ''')
AND (a.CreatedDate <= ''' + cast(@RegToDate as varchar) + ''')) 
and ((b.PurchaseDate >= ''' + cast(@FromDate as varchar) + ''')
AND (b.PurchaseDate <= ''' + cast(@ToDate as varchar) + ''')) 
END 

使用日期执行此程序时,其获取&#34;等待操作超时&#34;例外。请帮助解决这个问题。

1 个答案:

答案 0 :(得分:2)

您在表格和过程中的日期都保存为varchar。这是完美的,无需将它们转换为varchar。

此外,varchar被引号括起来,不会被执行。这只是一个字符串:

 where ((a.CreatedDate >= 'cast(@RegFromDate as varchar)')...

由于您使用的是AND,所以还有太多无用的括号。

请改为尝试:

CREATE PROC Sp_SearchCustomer (
    @FromDate datetime = null,
    @ToDate datetime = null,
    @RegFromDate datetime = null,
    @RegToDate datetime = null
)
AS
BEGIN
    SELECT a.UserId
        ,a.Name
        ,b.PurchaseOrderId
        ,b.Amount 
    FROM dbo.[User] a 
    LEFT JOIN PurchaseOrder b 
        ON a.UserId = b.UserId
    WHERE 
        a.CreatedDate >= @RegFromDate 
        AND a.CreatedDate <= @RegToDate 
        AND b.PurchaseDate >= @FromDate 
        AND b.PurchaseDate <= @ToDate 
END 

一旦改进了查询,您就可以再次测试它。 您还应该查看统计信息和索引,并确保统计信息是最新的,索引不会碎片化。

对于统计信息,您可以使用:exec sp_updatestats 对于这两个表上的索引,请查看碎片百分比并选择REBUILDREORGANIZE