【问题标题】:The wait operation timed out等待操作超时
【发布时间】:2015-12-16 08:19:02
【问题描述】:

我有 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)

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

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 

当使用日期执行此过程时,它会出现“等待操作超时”异常。请帮忙解决这个问题。

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    您在表格和过程中的日期都保存为 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 对于这 2 个表的索引,查看 Fragmentation % 并选择 REBUILDREORGANIZE 它们。

    【讨论】:

      猜你喜欢
      • 2015-02-02
      • 2017-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-23
      • 1970-01-01
      • 2013-04-28
      相关资源
      最近更新 更多