继续外键数据删除问题,请大师指教

cnwolfs 2013-05-11 09:39:35
经过昨天的帖,让我掌握了寻找缺失索引的一般性方法。
现在再请教另外的问题:(假设业务数据的数量级在千万以上,基础数据的数量级在几千到几万条记录之间)

1、针对大数据量的索引,是不是要按单个字段来建立?
现象:整理昨天的索引的时候,其中有个外键涉及到的表其实是没有数据的,如下面脚本中的TableD的逻辑关系,我要删除的表类似TableE,其实tableD中并没有我要删除的E中所关联的数据,因为D中的数据已经用其它SQL语句删掉了。D的索引有建立,也包含了TE这个字段,只是混合在接近10个字段共同组合的索引之中,删除速度很慢,我用了【执行计划】查看,发现是这个表花费了很长时间,试着把索引拆开,速度就很快了。


2、级联删除是否能够提升涉及外键的删除速度?
假如TableD中的TE不建立索引,使用级联删除能提升速度不?

3、针对下面的脚本中的表结构,我要删除TableE的数据,如何使用级联删除?

Visio图在后面。





CREATE TABLE [dbo].[TableA](
[TA] [int] NOT NULL,
[TAName] [varchar](10) NULL,
CONSTRAINT [TableA_PK] PRIMARY KEY CLUSTERED
(
[TA] 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 TABLE [dbo].[TableB](
[TB] [int] NOT NULL,
[TBName] [varchar](10) NULL,
CONSTRAINT [TableB_PK] PRIMARY KEY CLUSTERED
(
[TB] 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 TABLE [dbo].[TableC](
[TC] [int] NOT NULL,
[TCName] [varchar](10) NULL,
CONSTRAINT [TableC_PK] PRIMARY KEY CLUSTERED
(
[TC] 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 TABLE [dbo].[TableD](
[TD] [int] NOT NULL,
[TDName] [varchar](10) NULL,
[TC] [int] NULL,
[TA] [int] NULL,
[TE] [int] NULL,
CONSTRAINT [TableD_PK] PRIMARY KEY CLUSTERED
(
[TD] 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 TABLE [dbo].[TableE](
[TE] [int] NOT NULL,
[TEName] [varchar](10) NULL,
[TA] [int] NULL,
[TB] [int] NULL,
[TC] [int] NULL,
CONSTRAINT [TableE_PK] PRIMARY KEY CLUSTERED
(
[TE] 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 TABLE [dbo].[TableF](
[TF] [int] NOT NULL,
[TFName] [varchar](10) NULL,
[TD] [int] NULL,
[TE] [int] NULL,
[TC] [int] NULL,
[TB] [int] NULL,
[TA] [int] NULL,
CONSTRAINT [TableF_PK] PRIMARY KEY CLUSTERED
(
[TF] 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
ALTER TABLE [dbo].[TableD] WITH CHECK ADD CONSTRAINT [TableA_TableD_FK1] FOREIGN KEY([TA])
REFERENCES [dbo].[TableA] ([TA])
GO
ALTER TABLE [dbo].[TableD] CHECK CONSTRAINT [TableA_TableD_FK1]
GO
ALTER TABLE [dbo].[TableD] WITH CHECK ADD CONSTRAINT [TableC_TableD_FK1] FOREIGN KEY([TC])
REFERENCES [dbo].[TableC] ([TC])
GO
ALTER TABLE [dbo].[TableD] CHECK CONSTRAINT [TableC_TableD_FK1]
GO
ALTER TABLE [dbo].[TableD] WITH CHECK ADD CONSTRAINT [TableE_TableD_FK1] FOREIGN KEY([TE])
REFERENCES [dbo].[TableE] ([TE])
GO
ALTER TABLE [dbo].[TableD] CHECK CONSTRAINT [TableE_TableD_FK1]
GO
ALTER TABLE [dbo].[TableE] WITH CHECK ADD CONSTRAINT [TableA_TableE_FK1] FOREIGN KEY([TA])
REFERENCES [dbo].[TableA] ([TA])
GO
ALTER TABLE [dbo].[TableE] CHECK CONSTRAINT [TableA_TableE_FK1]
GO
ALTER TABLE [dbo].[TableE] WITH CHECK ADD CONSTRAINT [TableB_TableE_FK1] FOREIGN KEY([TB])
REFERENCES [dbo].[TableB] ([TB])
GO
ALTER TABLE [dbo].[TableE] CHECK CONSTRAINT [TableB_TableE_FK1]
GO
ALTER TABLE [dbo].[TableE] WITH CHECK ADD CONSTRAINT [TableC_TableE_FK1] FOREIGN KEY([TC])
REFERENCES [dbo].[TableC] ([TC])
GO
ALTER TABLE [dbo].[TableE] CHECK CONSTRAINT [TableC_TableE_FK1]
GO
ALTER TABLE [dbo].[TableF] WITH CHECK ADD CONSTRAINT [TableA_TableF_FK1] FOREIGN KEY([TA])
REFERENCES [dbo].[TableA] ([TA])
GO
ALTER TABLE [dbo].[TableF] CHECK CONSTRAINT [TableA_TableF_FK1]
GO
ALTER TABLE [dbo].[TableF] WITH CHECK ADD CONSTRAINT [TableB_TableF_FK1] FOREIGN KEY([TB])
REFERENCES [dbo].[TableB] ([TB])
GO
ALTER TABLE [dbo].[TableF] CHECK CONSTRAINT [TableB_TableF_FK1]
GO
ALTER TABLE [dbo].[TableF] WITH CHECK ADD CONSTRAINT [TableC_TableF_FK1] FOREIGN KEY([TC])
REFERENCES [dbo].[TableC] ([TC])
GO
ALTER TABLE [dbo].[TableF] CHECK CONSTRAINT [TableC_TableF_FK1]
GO
ALTER TABLE [dbo].[TableF] WITH CHECK ADD CONSTRAINT [TableD_TableF_FK1] FOREIGN KEY([TD])
REFERENCES [dbo].[TableD] ([TD])
GO
ALTER TABLE [dbo].[TableF] CHECK CONSTRAINT [TableD_TableF_FK1]
GO
ALTER TABLE [dbo].[TableF] WITH CHECK ADD CONSTRAINT [TableE_TableF_FK1] FOREIGN KEY([TE])
REFERENCES [dbo].[TableE] ([TE])
GO
ALTER TABLE [dbo].[TableF] CHECK CONSTRAINT [TableE_TableF_FK1]
GO









INSERT [dbo].[TableA] ([TA], [TAName]) VALUES (1, N'A1')
GO
INSERT [dbo].[TableA] ([TA], [TAName]) VALUES (2, N'A2')
GO
INSERT [dbo].[TableA] ([TA], [TAName]) VALUES (3, N'A3')
GO
INSERT [dbo].[TableC] ([TC], [TCName]) VALUES (1, N'C1')
GO
INSERT [dbo].[TableC] ([TC], [TCName]) VALUES (2, N'C2')
GO
INSERT [dbo].[TableC] ([TC], [TCName]) VALUES (3, N'C3')
GO
INSERT [dbo].[TableB] ([TB], [TBName]) VALUES (1, N'B1')
GO
INSERT [dbo].[TableB] ([TB], [TBName]) VALUES (2, N'B2')
GO
INSERT [dbo].[TableB] ([TB], [TBName]) VALUES (3, N'B3')
GO
INSERT [dbo].[TableE] ([TE], [TEName], [TA], [TB], [TC]) VALUES (1, N'E1', 1, 1, 1)
GO
INSERT [dbo].[TableE] ([TE], [TEName], [TA], [TB], [TC]) VALUES (2, N'E2', 2, 2, 2)
GO
INSERT [dbo].[TableE] ([TE], [TEName], [TA], [TB], [TC]) VALUES (3, N'E3', 3, 3, 3)
GO
INSERT [dbo].[TableD] ([TD], [TDName], [TC], [TA], [TE]) VALUES (1, N'D1', 1, 1, 1)
GO
INSERT [dbo].[TableD] ([TD], [TDName], [TC], [TA], [TE]) VALUES (2, N'D2', 2, 2, 2)
GO
INSERT [dbo].[TableD] ([TD], [TDName], [TC], [TA], [TE]) VALUES (3, N'D3', 3, 3, 3)
GO
INSERT [dbo].[TableF] ([TF], [TFName], [TD], [TE], [TC], [TB], [TA]) VALUES (1, N'F1', 1, 1, 1, 1, 1)
GO
INSERT [dbo].[TableF] ([TF], [TFName], [TD], [TE], [TC], [TB], [TA]) VALUES (2, N'F2', 2, 2, 2, 2, 2)
GO
INSERT [dbo].[TableF] ([TF], [TFName], [TD], [TE], [TC], [TB], [TA]) VALUES (3, N'F3', 3, 3, 3, 3, 3)
GO







...全文
126 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnwolfs 2013-05-17
  • 打赏
  • 举报
回复
大师级的竟然都让我去除外键 存储过程来保障数据完整性是很累人的,同时无法阻止他们网管的数据表级的操作。 另外,使用存储过程来保障,效率也不高吧。
daiyueqiang2045 2013-05-12
  • 打赏
  • 举报
回复
引用 3 楼 cnwolfs 的回复:
不使用外键会有很多问题,1、数据完整性的保障都要用存储过程来判断了。2、传给报表的数据源出了问题。有一张很复杂的业务报表,需要传入很多个表,而且相互之间是有关系的。
不使用外键,在你提供的程序中进行控制就OK。 大部分数据的录入是根据程序录入的,检查外键约束的部分就可以放在程序中。 对于楼主的第一个问题,这个是根据你的查询语句进行优化的。 http://www.cnblogs.com/worfdream/articles/2840582.html 这个文章关于优化索引的文章
黄_瓜 2013-05-11
  • 打赏
  • 举报
回复
1、你的好好学学索引这个不是一两句说的事 2、建议不使用级联删除、不使用外键
cnwolfs 2013-05-11
  • 打赏
  • 举报
回复
不使用外键会有很多问题,1、数据完整性的保障都要用存储过程来判断了。2、传给报表的数据源出了问题。有一张很复杂的业务报表,需要传入很多个表,而且相互之间是有关系的。
cnwolfs 2013-05-11
  • 打赏
  • 举报
回复

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧