AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 123481
Accepted
mpag
mpag
Asked: 2015-12-12 13:59:33 +0800 CST2015-12-12 13:59:33 +0800 CST 2015-12-12 13:59:33 +0800 CST

SQL Server 2008 R2 中的领先/滞后实施:超出最大内存

  • 772

背景

我正在尝试建立一个“访问”序列,其中如果在基本相同的地方General_Location( 因此,如果在所有 A(n) 个位置都属于“A”的Location序列中检测到动物,则前 6 次检测将作为访问 1 (@A),接下来作为访问 2 (@B),然后作为访问 3 (@D),然后访问 4 (返回 @A)。
A1, A2, A3, A3, A3, A1, B2, D4, A2
General_Location

由于LAG并且在 SQL Server 2008R2 中不可用(在ing 子句LEAD中也不可用),我正在尝试按照SQL Authority 博客条目中所述的解决方法。UNBOUNDED PRECEDINGPARTITION

我遇到了以下内存问题(更不用说计算时间了):

WITH s AS (
    SELECT
        RANK() OVER (PARTITION BY det.Technology, det.XmitID ORDER BY DetectDate ASC, ReceiverID ASC) as DetID,
        COALESCE(TA.AnimalID, det.Technology+'-'+cast(da.XmitID AS nvarchar), 'BSVALUE999') as AnimalID,
        det.Technology, det.XmitID, DetectDate, det.location as Location, RL.General_Location as GLocation, ReceiverID
    FROM
        Detections_with_Location as det JOIN
        Receiver_Locations as RL
            ON det.Location=RL.Location LEFT OUTER JOIN
        Tagged_Animal as TA
            ON det.AnimalID=TA.AnimalID
)
INSERT INTO ##ttOrder_det (AnimalID, Technology, XmitID, DD, Location, GLocation, ReceiverID, DetID, PrevDD, BinInc)
    SELECT 
        s1.AnimalID, --was a coalesce
        s1.Technology, s1.XmitID, s1.DetectDate, s1.Location, s1.GLocation, s1.ReceiverID,
        s1.DetID, 
        sLAG.DetectDate,
        CASE WHEN sLAG.DetectDate IS NULL
            THEN 1 
            ELSE CASE WHEN sLAG.GLocation = s1.GLocation
                THEN 0
                ELSE 1
            END
        END AS BinInc
    FROM s as s1
    LEFT OUTER JOIN s AS sLAG ON
        s1.DetID = sLAG.DetID + 1 AND
        s1.AnimalID= sLAG.AnimalID --and s.Technology=sLAG.Technology and s.XmitID=sLAG.XmitID;

正如各种用户(@MartinSmith、@Frisbee)已经提到或暗示的那样,使用AnimalID不是 的完整主键Tagged_Animal,也不是在唯一约束中定义的。但是,表中的行数A.AnimalID=B.AnimalID AND A.TagSN<B.TagSN(当前)为零。为了使这个查询健壮,我必须强制它是唯一的(或者只是从 PK 中删除 TagSN)。

表和索引定义

##ttOrder_det(临时表)

当前在填充表格之前创建了索引;我正在进行测试,在填充临时表后将NONCLUSTERED非索引创建转移到一个位置。UNIQUE

CREATE TABLE ##ttOrder_det (
    AnimalID nvarchar(50) not null,
    Technology varchar(25) not null,
    XmitID int not null,
    DD DateTime not null,
    [Location] [nvarchar](255) NULL,
    [GLocation] nvarchar(255) NULL,
    PrevDD DateTime NULL,
    ReceiverID int not null,
    DetID int NOT NULL,
    BinInc int NULL,
    BinNum int NULL,
CONSTRAINT [PK_ttRDA] PRIMARY KEY CLUSTERED 
    ([AnimalID] ASC, [DD] ASC, ReceiverID ASC)
    WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY];
GO
CREATE NONCLUSTERED INDEX NIX_F on ##ttOrder_det (AnimalID ASC);
CREATE NONCLUSTERED INDEX NIX_VTC ON ##ttOrder_det (ReceiverID ASC, AnimalID ASC);
CREATE NONCLUSTERED INDEX NIX_TCD ON ##ttOrder_det (AnimalID ASC, DD ASC);
CREATE NONCLUSTERED INDEX NIX_R ON ##ttOrder_det (DetID ASC);
CREATE NONCLUSTERED INDEX NIX_A ON ##ttOrder_det (GLocation ASC);
CREATE NONCLUSTERED INDEX NIX_DD ON ##ttOrder_det (DD, PrevDD);
CREATE UNIQUE INDEX UX_CTR ON ##ttOrder_det (AnimalID ASC, DetID ASC);
CREATE NONCLUSTERED INDEX NIX_Bi ON ##ttOrder_det (BinInc ASC);
CREATE NONCLUSTERED INDEX NIX_CT ON ##ttOrder_det (XmitID ASC, Technology ASC);

标记_动物

CREATE TABLE [dbo].[Tagged_Animal](
    [DateTagged] [datetime] NULL,
    [AnimalID] [nvarchar](50) NOT NULL,
    [TagSN] [nvarchar](50) NOT NULL,
    [XmitID] [int] NULL,
    [Technology] [varchar](25) NULL,
    [Animal_SubType] [nvarchar](50) NULL,
    [Species] [nvarchar](30) NULL,
    [StudyID] [nvarchar](50) NULL,
    [Weight] [float] NULL,
    [Length] [int] NULL,
    [Length_Type] [nvarchar](50) NULL,
    [Date_Released] [datetime] NULL,
    [Release_Location] [nvarchar](50) NULL,
    [Lat] [float] NULL,
    [Lon] [float] NULL,
    [Course_Dist_km] [float] NULL,
    [Sex] [nvarchar](255) NULL,
    [Life_Stage] [nvarchar](255) NULL,
    [Marking_Method] [nvarchar](255) NULL,
    [Tag_Type] [varchar](30) NULL,
    [Notes] [nvarchar](255) NULL,
 CONSTRAINT [PK_tbl_Tagged_Animal] PRIMARY KEY CLUSTERED 
(
    [AnimalID] ASC,
    [TagSN] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

CREATE NONCLUSTERED INDEX [I_TF_TagCode] ON [dbo].[Tagged_Animal] 
(
    [XmitID] ASC,
    [Technology] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

Detections_with_Location

CREATE TABLE [dbo].[Detections_with_Location](
    [AnimalID] [nvarchar](50) NOT NULL,
    [XmitID] [int] NOT NULL,
    [Technology] [varchar](25) NOT NULL,
    [DetectDate] [datetime] NOT NULL,
    [ReceiverID] [int] NOT NULL,
    [Data] [float] NULL,
    [Units] [varchar](50) NULL,
    [Location] [nvarchar](255) NULL,
    [StartD] [datetime] NULL,
    [StopD] [datetime] NULL,
    [fname] [nvarchar](255) NULL,
    [notes] [nvarchar](max) NULL,
 CONSTRAINT [PK_dlwk] PRIMARY KEY CLUSTERED 
(
    [ReceiverID] ASC,
    [Technology] ASC,
    [XmitID] ASC,
    [DetectDate] ASC,
    [AnimalID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

CREATE NONCLUSTERED INDEX [NIX_VTC] ON [dbo].[Detections_with_Location] 
(
    [ReceiverID] ASC,
    [AnimalID] ASC,
    [XmitID] ASC,
    [Technology] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

CREATE NONCLUSTERED INDEX [NIX_TCpi] ON [dbo].[Detections_with_Location] 
(
    [XmitID] ASC,
    [Technology] ASC
)
INCLUDE ( [DetectDate],
[ReceiverID],
[Data],
[Units],
[Location]) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

CREATE NONCLUSTERED INDEX [NIX_TCD] ON [dbo].[Detections_with_Location] 
(
    [AnimalID] ASC,
    [XmitID] ASC,
    [Technology] ASC,
    [DetectDate] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

CREATE NONCLUSTERED INDEX [NIX_F] ON [dbo].[Detections_with_Location] 
(
    [AnimalID] ASC
)
INCLUDE ( [XmitID],
[Technology],
[DetectDate],
[ReceiverID],
[Data],
[Units],
[Location]) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

CREATE NONCLUSTERED INDEX [NIX_DSS] ON [dbo].[Detections_with_Location] 
(
    [ReceiverID] ASC,
    [Location] ASC,
    [StartD] ASC,
    [StopD] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

Receiver_Locations

CREATE TABLE [dbo].[Receiver_Locations](
    [Region] [nvarchar](50) NULL,
    [Location_Long] [nvarchar](50) NULL,
    [Location] [nvarchar](50) NOT NULL,
    [Lat] [float] NULL,
    [Lon] [float] NULL,
    [Altitude] [float] NULL,
    [Elevation] [float] NULL,
    [RiverKm] [float] NULL,
    [LocationType] [nvarchar](50) NULL,
    [General_Location] [nvarchar](50) NULL,
    [Nearest_Access] [nvarchar](50) NULL,
    [Responsible_Agent] [nvarchar](50) NULL,
    [Agent_Phone] [nvarchar](255) NULL,
    [Agent_Email] [nvarchar](255) NULL,
 CONSTRAINT [PK_tbl_Receiver_Locations] PRIMARY KEY CLUSTERED 
(
    [Location] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]


桌子尺寸

Tagged_Animals:
10,000 检测_with_Location: 46+ 百万条目
Receiver_Locations: 800

收到的特定错误

  1. 无法为数据库“tempdb”中的对象“dbo.SORT 临时运行存储:140737631617024”分配空间,因为“PRIMARY”文件组已满。通过删除不需要的文件、删除文件组中的对象、向文件组添加其他文件或为文件组中的现有文件设置自动增长来创建磁盘空间。

  2. 数据库“tempdb”的事务日志已满。要找出日志中的空间不能被重用的原因,请参阅 sys.databases (tempdb ACTIVE_TRANSACTION) 中的 log_reuse_wait_desc 列

  3. 执行批处理时出错。错误消息是:抛出了“System.OutOfMemoryException”类型的异常——(如果s在大约 3300 万条记录后直接选择)。

(估计)初始代码的执行计划摘要

INSERT成本 0%
SEQUENCE成本 0% 但从 9 个不同的子步骤中提取。这些子步骤(具有典型成本)是Index Insert(2%),其次是Sort(8%),然后是Table Spool(2%)。NIX_A有 9% 的成本,Index Insert既没有NIX_TCD也NIX_F没有Sort步骤;Table SpoolforNIX_F是免费的。费用为 10%
。分发流 还有2% 的成本和 1% 的成本。 对于成本,它似乎增加了 95%,其他步骤花费了 13%,所以很明显某处存在一些舍入“错误”,可能主要在 14% 的序列中 。Clustered Index Insert
SortParallelism
SEQUENCEIndex InsertSortTable Spool

注释/参考

基于SQL 权威博客条目
的 LAG/LEAD 实现 另见此 Stackexchange 线程

我的问题

  1. 有什么改进的建议吗?

  2. 当我加入副本时,我也可以分区s吗?

  3. 如果我制作s一个谨慎的临时表并适当地索引它,情况会有所改善吗?

  4. 在执行所有插入之后UNIQUE在临时表中创建非索引会更有效吗?我假设必须预先创建(因此)索引以防止违反键约束。UNIQUEPRIMARY KEY

回答我自己的问题之一

  1. 是的,是的。进一步优化后
    • 21 分钟用数据填充临时表
    • 1分钟索引

这个过程之前至少进行了 1.5 小时,出错并且没有生成结果表。在我开始摆弄查询逻辑之前,实际上需要 4 个多小时才能出错。

服务器规格:

处理器:Xeon E3-1240 V2 @ 3.4 GHz(4 核/8 线程)
内存:16 GB
分页文件:16 GB on 111 GB SSD(52 GB free)
tempdb + my database on 223 GB SSD(119 GB free)


当前状态

请参阅我发布的解决方案/答案。

sql-server sql-server-2008-r2
  • 1 1 个回答
  • 2248 Views

1 个回答

  • Voted
  1. Best Answer
    mpag
    2015-12-18T10:42:47+08:002015-12-18T10:42:47+08:00

    我将此作为答案提交,因为我目前正在避免内存不足类型错误以及显着减少运行时间(4 小时以上,以失败告终;现在是 1.25 小时,以成功告终)。但是,我确信在大约 1000 万条记录之后,这个问题可能会再次发生,所以我将不胜感激任何其他旨在提高未来内存效率的评论或答案。

    对此的“解决方案”是从临时表的设计中删除不需要的字段,尤其是索引。此外,非约束键的索引创建被推迟到表被填满之后。

    为了解决分区不匹配的问题(@MartinSmith 首先指出)JOIN,我在子查询中创建了一个字段,然后我将其用于PARTITIONing 和 for JOINing。

    Q的代码

    set nocount on;
    SET XACT_ABORT ON;
    SELECT
        cast(cast(current_timestamp as datetime2) as varchar(19)) as time,
        'started' as reason; --last run 2015-12-16 18:22:02
    GO
    
    CREATE TABLE ##ttOrder_det (
        AnimalID nvarchar(50) not null,
        DD DateTime not null,
        ReceiverID int NOT NULL,
        Location nvarchar(255) NOT NULL,
        GLocation nvarchar(255) NULL,
        DetID int NOT NULL,
        BinIncORNum int NULL, -- first pass=Inc, second pass=Num
    CONSTRAINT [PK_ttRDA] PRIMARY KEY CLUSTERED 
        ([AnimalID] ASC, [DD] ASC, ReceiverID ASC)
        WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY];
    GO
    CREATE UNIQUE INDEX UX_CTR ON ##ttOrder_det (AnimalID ASC, DetID ASC);
    SELECT
        cast(cast(current_timestamp as datetime2) as varchar(19)) as time,
       'created first temporary table' as reason;  --last run 2015-12-16 18:22:02
    GO
    WITH s AS (
        SELECT 
            AnimalID, DetectDate,
            ReceiverID, Location, GLocation,
            ROW_NUMBER() OVER (
                PARTITION BY AnimalID ORDER BY DetectDate ASC, ReceiverID ASC
            ) as DetID
        FROM (
            SELECT 
                COALESCE (
                    TF.AnimalID,
                    Det.Technology+'-'+cast(Det.XmitID AS nvarchar(10)),
                    Det.AnimalID,
                    N'BSVALUE999'
                ) as AnimalID,
                DetectDate,
                ReceiverID,
                COALESCE (
                    Det.location,
                    N'Unknown Location'
                ) as Location,
                COALESCE (
                    ML.General_Location,
                    N'Invalid General Location - Orphaned Receiver'
                ) as GLocation
            FROM
                Detections_with_Location as Det LEFT OUTER JOIN
                Receiver_Locations as ML ON Det.Location=ML.Location LEFT OUTER JOIN
                Tagged_Animal as TF ON Det.AnimalID=TF.AnimalID
        ) AS T
    )
    INSERT INTO ##ttOrder_det (AnimalID, DD, ReceiverID, Location, GLocation, DetID, BinIncORNum)
        SELECT 
            s1.AnimalID,
            s1.DetectDate, s1.ReceiverID, s1.Location, s1.GLocation,
            s1.DetID, 
            CASE WHEN sLg.DetectDate IS NULL
                THEN 1 
                ELSE CASE WHEN sLg.GLocation = s1.GLocation
                    THEN 0
                    ELSE 1
                END
            END AS BinInc
        FROM s as s1
        LEFT OUTER JOIN s AS sLg ON
            s1.AnimalID= sLg.AnimalID AND
            s1.DetID = sLg.DetID + 1
    SELECT
        cast(cast(current_timestamp as datetime2) as varchar(19)) as time,
       'filled first temp table' as reason,
       COUNT(*) as SizeOfFirstTemp FROM ##ttOrder_det; --2015-12-16 18:43:03, 46627879
    GO
    CREATE NONCLUSTERED INDEX NIX_F on ##ttOrder_det (AnimalID ASC);
    CREATE NONCLUSTERED INDEX NIX_R ON ##ttOrder_det (DetID ASC);
    --dropped several additional indices: `NIX_`s VTC, TCD, A, DD, Bi
    SELECT
        cast(cast(current_timestamp as datetime2) as varchar(19)) as time,
        'indexed first temp table' as reason; --2015-12-16 18:44:12
    GO
    

    快速评论

    我改用 usingROW_NUMBER而不是RANK. 这是不确定的,但至少会导致没有“联系”,这将导致LAG围绕该点的实施中断。联系不应该存在,但这只是针对General_Location那些非常接近并共同检测相同传输的 s 的未来证明。

    同样,正如两位用户在上面的评论中指出的那样,我没有使用Tagged_Animal表的完整 PK,因此有可能存在JOIN带有模棱两可的AnimalID. 然而,目前,两者AnimalID和TagSN都是UNIQUE,尽管不受约束。

    我计划放弃该ReceiverID领域以支持使用Location,但我有一段时间在同一位置部署了两个接收器(一个接收器被假定丢失但后来被发现)确实同时检测到同一只动物

    完成任务的后续代码

    CREATE TABLE ##ttOrder_det2 (
        AnimalID nvarchar(50) not null,
        DetID int NOT NULL,
        BinNum int NULL,
    CONSTRAINT [PK_ttRDA2] PRIMARY KEY CLUSTERED 
        ([AnimalID] ASC, [DetID] ASC)
        WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY];
    GO
    SELECT
        cast(cast(current_timestamp as datetime2) as varchar(19)) as time,
        'second temp table created' as reason; --2015-12-16 18:44:15
    GO
    -- SET XACT_ABORT ON will cause the transaction to be uncommittable
    -- when the constraint violation occurs. 
    BEGIN TRANSACTION
      BEGIN TRY
       DECLARE @AnimalID as nvarchar(50);
        DECLARE @DetID as int;
        DECLARE @BinInc as int;
        DECLARE @BinNum as int;
        DECLARE @AnimalVisit as CURSOR;
        SET @AnimalVisit = CURSOR FOR SELECT AnimalID, DetID, BinIncORNum FROM ##ttOrder_det ORDER BY AnimalID, DetID;
        OPEN @AnimalVisit;
        FETCH NEXT FROM @AnimalVisit INTO @AnimalID, @DetID, @BinInc;
        WHILE @@FETCH_STATUS = 0
          BEGIN
            IF (@DetID <= 1) SET @BinNum = 0;
            SET @BinNum += @BinInc;
            INSERT INTO ##ttOrder_det2 (AnimalID, DetID, BinNum) VALUES (@AnimalID, @DetID, @BinNum);
            FETCH NEXT FROM @AnimalVisit INTO @AnimalID, @DetID, @BinInc;
          END
        CLOSE @AnimalVisit;
        DEALLOCATE @AnimalVisit;
      END TRY
      BEGIN CATCH
        exec sp_lock; -- added to display the open locks after the timeout
    --    exec sp_who2; -- shows the active processes
        EXECUTE usp_GetErrorInfo;
        --RETURN -- ignoring this error for brevity
            -- Test XACT_STATE:
            -- If 1, the transaction is committable.
            -- If -1, the transaction is uncommittable and should 
            --     be rolled back.
            -- XACT_STATE = 0 means that there is no transaction and
            --     a commit or rollback operation would generate an error.
    
        -- Test whether the transaction is uncommittable.
        IF (XACT_STATE()) = -1
        BEGIN
            SELECT
                cast(cast(current_timestamp as datetime2) as varchar(19)) as time,
                'The transaction is in an uncommittable state. Rolling back transaction.' as reason
                SET XACT_ABORT off
                RETURN -- 1 --error
            ROLLBACK TRANSACTION;
        END;
        -- Test whether the transaction is committable.
        IF (XACT_STATE()) = 1
        BEGIN
            SELECT
                cast(cast(current_timestamp as datetime2) as varchar(19)) as time,
                'The transaction is committable. Committing transaction.' as reason
            COMMIT TRANSACTION;   
        END;
      END CATCH;
      IF @@TRANCOUNT > 0
        COMMIT TRANSACTION;
    GO
    SELECT 
        cast(cast(current_timestamp as datetime2) as varchar(19)) as time,
        'filled second temp table' as reason,
        COUNT(*) as Table2Size from ##ttOrder_det2; --2015-12-16 19:11:17, 46627879
    GO
    CREATE NONCLUSTERED INDEX NIX_CT2 ON ##ttOrder_det2 (AnimalID ASC);
    CREATE NONCLUSTERED INDEX NIX_R2 ON ##ttOrder_det2 (DetID ASC);
    SELECT
        cast(cast(current_timestamp as datetime2) as varchar(19)) as time,
        'indexed second temp table' as reason;
    --EXEC tempdb.dbo.usp_PruneTemp;
    GO
    BEGIN TRANSACTION
        BEGIN TRY
            UPDATE a
                SET a.BinIncORNum=b.BinNum
            FROM ##ttOrder_det AS a
            INNER JOIN ##ttOrder_det2 AS b ON 
                a.AnimalID=b.AnimalID AND a.DetID=b.DetID;
            SELECT
                cast(cast(current_timestamp as datetime2) as varchar(19)) as time,
                'backfilled first temp table with info from second table' as reason,
                @@ROWCOUNT as EntriesAffected;  --2015-12-16 19:19:54, 46627879
            DROP TABLE ##ttOrder_det2;
            COMMIT TRANSACTION
        END TRY
        BEGIN CATCH
            SELECT name, log_reuse_wait_desc FROM sys.databases
            SELECT
              cast(cast(current_timestamp as datetime2) as varchar(19)) as time,
              'ERROR: backfilling first temp table, see sys.databases info' as reason;
            EXECUTE usp_GetErrorInfo;
            IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION;
            SET XACT_ABORT off
            RETURN --1 --error
        END CATCH
    --IF @@TRANCOUNT > 0 COMMIT TRANSACTION
    GO
    CREATE TABLE derived__AnimalVisits (
        AnimalID nvarchar(50) not null,
        DetectDate DateTime not null,
        ReceiverID int NOT NULL,
        Location nvarchar(255) NOT NULL,
        GeneralLocation nvarchar(255) NULL,
        DetOrder int NOT NULL,
        VisitNum int NOT NULL,
    CONSTRAINT [PK_dFV] PRIMARY KEY CLUSTERED 
        (AnimalID ASC, DetectDate ASC, ReceiverID ASC)
        WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY];
    GO
    CREATE UNIQUE INDEX UX_CTR ON derived__AnimalVisits (AnimalID ASC, DetOrder ASC);
    SELECT 
        cast(cast(current_timestamp as datetime2) as varchar(19)) as time,
        'created persistent derived table' as reason; --2015-12-16 19:20:53
    GO
    
    --DECLARE @FVError as int = 0;
    BEGIN TRY
        INSERT INTO derived__AnimalVisits (AnimalID, DetectDate, ReceiverID, Location, GeneralLocation, DetOrder, VisitNum)
            SELECT AnimalID, DD, ReceiverID, Location, GLocation, COALESCE(DetID,0), COALESCE(BinIncORNum,0) FROM ##ttOrder_det;
    END TRY
    BEGIN CATCH
        SELECT
            cast(cast(current_timestamp as datetime2) as varchar(19)) as time,
            'ERROR: filling persistent derived table' as reason;
        EXECUTE usp_GetErrorInfo;
        SET XACT_ABORT off
        RETURN --1 --error
    END CATCH
    CREATE NONCLUSTERED INDEX NIX_CT ON derived__AnimalVisits (AnimalID ASC);
    CREATE NONCLUSTERED INDEX NIX_VTC ON derived__AnimalVisits (ReceiverID ASC, AnimalID ASC);
    CREATE NONCLUSTERED INDEX NIX_TCD ON derived__AnimalVisits (AnimalID ASC, DetectDate ASC);
    CREATE NONCLUSTERED INDEX NIX_R ON derived__AnimalVisits (DetOrder ASC);
    CREATE NONCLUSTERED INDEX NIX_Bi ON derived__AnimalVisits (VisitNum ASC);
    SELECT
        cast(cast(current_timestamp as datetime2) as varchar(19)) as time,
        'indexed / now cleaning up' as reason; --2015-12-16 19:31:18
    GO
    IF EXISTS (SELECT * FROM tempdb.dbo.sysobjects WHERE id = OBJECT_ID(N'[tempdb].[dbo].[##ttOrder_det2]') AND xtype=N'U')
        DROP TABLE tempdb.[dbo].[##ttOrder_det2];
    IF EXISTS (SELECT * FROM tempdb.dbo.sysobjects WHERE id = OBJECT_ID(N'[tempdb].[dbo].[##ttOrder_det]') AND xtype=N'U')
        DROP TABLE tempdb.[dbo].[##ttOrder_det];
    SET XACT_ABORT off
    --cleaning up of transaction logs, etc done at 2015-12-16 19:39:07
    
    • 5

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve