我有一个包含我的应用程序日志的表,它有 161.626.718 行(并且还在增长),并且在其上进行插入非常慢。我的想法是只保留表中 6 个月的日志和所有我想复制到应用程序无法访问的存档表上的旧记录,如果有人需要一些信息,只需直接在表上进行选择。因此,我们的想法是创建这样的日常工作:
SELECT * INTO audlog_backup FROM audlog WHERE XDATE <= DATEADD(day,-185,GETDATE())
DELETE FROM audlog WHERE XDATE <= DATEADD(day,-185,GETDATE())
Run Code Online (Sandbox Code Playgroud)
但是由于表的大小,这将花费很长时间,并且在第一次运行时会减慢甚至锁定数据库一段时间,毕竟大多数行将超过 6 个月。
第一次尽可能安全和快速地做这件事的建议是什么?
更多信息:
SQL Server 2012 标准版
创建表的脚本:
CREATE TABLE [dbo].[audlog_backup](
[PVKEY] [float] NULL,
[DKEY] [varchar](14) NULL,
[XDATE] [datetime] NULL,
[XTIME] [varchar](8) NULL,
[XFROM] [varchar](50) NULL,
[XTO] [varchar](50) NULL,
[DETAILS] [text] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
SET ANSI_PADDING ON
ALTER TABLE [dbo].[audlog_backup] ADD [XUSER] [varchar](50) NULL
ALTER TABLE [dbo].[audlog_backup] ADD [PEOPLEKEY] [int] NULL
ALTER TABLE …
Run Code Online (Sandbox Code Playgroud) 我有一张包含付款信息的表格,如下所示:
ID COSTUMER_ID DATEPAID AMOUNT
1 1 2012-01-01 50
2 1 2012-02-01 100
3 1 2012-03-01 70
4 2 2012-03-01 6000
4 2 2012-09-01 3000
4 2 2014-04-01 8000
5 3 2013-03-01 9000
6 3 2013-08-01 3000
Run Code Online (Sandbox Code Playgroud)
等等。我需要知道哪些客户在 12 个月内支付了超过 10,000 美元。(在示例中,只有客户 3 适合)。不要介意什么时候,唯一的标准是在任何连续 12 个月的组合中 SUM(AMOUNT) > 10000。
但我坚持下去。有任何想法吗?我正在使用 SQL Server 2012。
我有2个表,我想更新table2
与的标准table1
和table2
。标准是:
1.table1.amount > 10000
2.table2.flag
为空或table2.flag = '0'
因此,如果 2 个条件为真,则更新table2.flag = '1'
和table2.flagdate = getdate()
table2.flag
是一个检查每个支付超过10,000的人的标志。但是如果已经标记了,我不想再次标记,因为我不能丢失原始的table2.flagdate
. 但是我尝试了很多东西,没有任何效果是我想要的。有任何想法吗?