У меня есть 1 000 000 строк в месяц на ПК, созданный с помощью некоторого программного обеспечения для мониторинга. (Временная) таблица DataToImport выглядит следующим образом:Нормализация данных с помощью DISTINCT
EventID int NOT NULL (Primary Key of denormalized table)
EventType int NOT NULL -- A enumerated value
Computer nvarchar(50) NOT NULL -- Usually computer name
When DateTime NOT NULL
FileRef int NOT NULL -- File generators reference
FileDesc nvarchar(100) NOT NULL -- Humanly-readable description
FilePath nvarchar(100) NOT NULL -- Relative Path on disk
Я пытаюсь нормализовать эти данные в нескольких таблиц:
Computer (UniqueID, Name)
File (UniqueID, FileRef, FileDesc, FilePath)
Event (ID, Type, ComputerUniqueID, When, FileUniqueID)
..such, что «событие» будет иметь мильон строки, но они «повторно довольно мало, поэтому размер базы данных является управляемым и таблицы могут быть проиндексированы для выполнения запроса:
-- Grab new computers
INSERT INTO Computer
SELECT [Computer] AS [Name]
FROM [DataToImport]
WHERE [DataToImport].[Computer] NOT IN (SELECT [Name] FROM [Computer])
-- Grab new files
INSERT INTO File
SELECT [FileRef], [FileDesc], [FilePath]
FROM [DataToImport]
WHERE [FileRef] NOT IN (SELECT [FileRef] FROM File)
-- Normalize rows
INSERT INTO Event
SELECT [EventID], [EventType], [Computer].[UniqueID], [File].[UniqueID]
FROM [DataToImport]
INNER JOIN [Computer] ON [DataToImport].[Computer] = [Computer].[Name]
INNER JOIN [File] ON [DataToImport].[FileRef] = [File].[FileRef]
.. это все выглядит замечательно, за исключением того, что триплет (FileRef, FileDesc, FilePath) действительно составной ключ, поскольку любой из трех элементов может меняться, и это представляет собой уникальную запись. Мне нужно извлечь различные тройни, чтобы вставить их ...
-- Grab new distinct files
INSERT INTO File
SELECT DISTINCT [FileRef], [FileDesc], [FilePath]
FROM [DataToImport]
WHERE [FileRef] NOT IN (errrrr....help!)
Как я могу гарантировать, что уникальные строки файла нормированы?
+1, что, пожелал, я отправил его первым :) Вы можете удалить 'DISTINCT':' EXCEPT' подразумевает это. – Quassnoi
Ваш ответ на 40% быстрее. Будет ли он также обрабатывать NULL? – JBRWilkinson
@ JBRW: да, будет. – Quassnoi