【发布时间】:2015-04-14 07:40:46
【问题描述】:
我有两张桌子:
“Sessions” - 它具有 int 密钥标识,“session_id” - varchar, "device_category" - varchar 和其他一些列。 共有 149239 行。
Session_events" - 它有 int 键 身份,“session_id” - 唯一标识符和其他一些字段。 那里有 3140768 行。
这个表是从非关系型数据库 Cassandra 导入的,所以我没有在 MS SQL Server 设计器中创建任何连接。但是 session_id 列上的 Sessions 和 Session_events 之间的真正连接是多对多
现在我想删除所有未在个人计算机“device_category”上进行的网络会话。所以我运行请求Delete * FROM sessions where device_category != "PC"
那很快。现在我想从 Session_events 表中删除所有非 PC 会话。所以我运行请求
Delete FROM session_events where session_id Not In (SELECT distinct session_id FROM sessions)
该请求当前运行超过 24 小时,我不知道需要多长时间...
(我有 16 GB 内存和 Intel Xenon)。
我知道 Left Join 可以更快,但 20% 并不有趣。你知道如何更快地完成我的任务吗?
----
CREATE TABLE [dbo].[session_events](
[key] [bigint] IDENTITY(1,1) NOT NULL,
[session_id] [uniqueidentifier](max) NULL,
[visitor_id] [uniqueidentifier] NULL,
[shipping_method] [varchar](max) NULL,
[shipping_price] [varchar](max) NULL,
[site_id] [int] NULL,
[stream_data_chunk] [varbinary](max) NULL,
[total] [varchar](max) NULL,
[total_inc_tax] [varchar](max) NULL,
[tracker_ver] [varchar](max) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
CREATE TABLE [dbo].[visitor_sessions](
[key] [int] IDENTITY(1,1) NOT NULL,
[visitor_id] [varchar](max) NULL,
[created] [varchar](max) NULL,
[session_id] [varchar](max) NULL
)
CONSTRAINT [PK_visitor_sessions4] PRIMARY KEY CLUSTERED
(
[key] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
【问题讨论】:
-
表中有索引吗?向我们展示
CREATE TABLE脚本和两个表上的索引。 -
我没有创建表脚本。我在每个表中创建了两个 bigint autoincrimented Identity 列,它们是可索引的
-
你可以用SSMS找到CREATE TABLE(我想你可以用SSMS连接数据库?)
-
@ypercube 我已经添加了
-
我在表
session_events中没有看到session_id。您确定这是您运行的实际查询吗?
标签: sql sql-server database performance query-performance