【发布时间】:2012-03-02 02:29:24
【问题描述】:
我正在通过企业库 DAL 应用程序块调用存储过程,并在我的过程中传递一个 DataTable,该 DataTable 又作为自定义 Table 数据类型(@names 作为NamesTable)被“接收”。从第二次调用开始,该过程非常慢,我正在寻找一种不同的方法来实现它,以便大大提高性能。
Names/HistoricalNames 表很大(1 亿条记录),传递给这些表的数据(通过 dataset/table 参数)大约有 400 万条记录。
基本上它所做的(需要做的)如下:
- 导入
@names(即DataTable/Table参数 -
- 检查
Names或HistoricalNames表是否包含新数据集/表参数中包含的任何名称,如果是则跳过整个导入并返回 2 -
否则将
@names中的所有记录插入Names并返回1;
- 检查
表格如下所示:
create table Names
(
id int IDENTITY(1,1) NOT NULL,
name nvarchar(20),
otherId uniqueidentifier
)
create table HistoricalNames
(
id int IDENTITY(1,1) NOT NULL,
name nvarchar(20),
otherId uniqueidentifier
)
表值参数 (@names) 如下所示:
create table NameTable
(
name nvarchar(20)
otherId uniqueidentifier
)
这是程序:
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_ImportNames]
@names NameTable READONLY
AS
BEGIN
IF ((SELECT COUNT(cd.name) FROM Names as cd WHERE cd.name IN (SELECT c.name FROM @names as c)) > 0)
BEGIN
SELECT 2;
END
ELSE IF ((SELECT COUNT(cd.name) FROM HistoricalNames as cd WHERE cd.name IN (SELECT c.name FROM @names as c)) > 0)
BEGIN
SELECT 2;
END
ELSE
BEGIN
INSERT INTO Names (name, otherId) SELECT * FROM @names;
SELECT 1;
END
END
GO
能否轻松调整性能?任何帮助将不胜感激!
【问题讨论】:
-
你在这些表上有什么样的索引?
-
正确。我们在
name列上有索引,但是这些索引并没有自动纳入“创建脚本”... -
你已经在
id列上聚集了主键,对吧? -
是的,但是在表类型参数中不是这种情况...
标签: .net sql-server performance stored-procedures duplicates