Я вызываю хранимую процедуру через блок приложения DAL Enterprise Library и передаю DataTable, который, в свою очередь, «принимается» как пользовательский тип данных таблицы (@names
как NamesTable
) в моей процедуре. Процедура очень медленная после второго вызова, и я ищу другой способ ее реализации, чтобы производительность значительно возросла.
Таблицы Names / HistoricalNames огромны (100 миллионов записей), а данные, передаваемые в эти таблицы (через параметр набора данных / таблицы), составляют около 4 миллионов записей).
В основном то, что он делает (должен делать), следующее:
- Import
@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
Может ли это быть легко настроено на производительность? Любая помощь будет принята с благодарностью!