Wie ist in SQL Server ...
Sp:
CREATE PROCEDURE insertToTable
@field1 VARCHAR(256), @field2 varchar(256), @field3 varchar(256)
AS
BEGIN
SET NOCOUNT ON
IF NOT EXISTS (SELECT * FROM my_table WHERE field1 = @field1)
INSERT INTO my_table
(field1, field2, field3)
VALUES (@field1, @field2, @field3);
ELSE
THROW 50000, 'xxxxxx', 1;
END
GO
Tabelle:
CREATE TABLE my_table (
field1 VARCHAR(256) NOT NULL,
field2 VARCHAR(256) NOT NULL,
field3 VARCHAR(256) NOT NULL
);
CREATE INDEX idx_field1 ON my_table(field1);
das oben schneller als das unten?
Sp:
CREATE PROCEDURE insertToTable
@field1 VARCHAR(256), @field2 varchar(256), @field3 varchar(256)
AS
BEGIN
SET NOCOUNT ON
INSERT INTO my_table
(field1, field2, field3)
VALUES (@field1, @field2, @field3);
GO
Tabelle:
CREATE TABLE my_table (
field1 VARCHAR(256) NOT NULL,
field2 VARCHAR(256) NOT NULL,
field3 VARCHAR(256) NOT NULL
);
CREATE UNIQUE INDEX idx_field1 ON my_table(field1);
Beispieleingabe:
Feld1: F56yCgZ9AEm9aFpTyjwhERtqNeglYEow Feld2: BD84CE2A514316164B7448C804B178AD8F6F597E8EC6F25F4D6E36287259C65F67E7206E82A4F8EFD2389C0821C0C70E8278DC5F166D220356B5A15A091A Feld 3: A18E9049117A77E6A4D41C6CA3FFDEA65D842BF1F57705405B4E66969531D93D
Die Eingabe wird im laufenden Betrieb von der Webanwendung und unter Verwendung vorbereiteter Anweisungen generiert. Ich verwende Jmeter, um Anfragen an meine Web-App zu generieren.
Mit dem UNIQUEIndex verschlechtert sich die Leistung der Einfügungen nach 100.000 Einfügungen und wird schlechter.
Mit dem NON UNIQUEIndex und einer manuellen Überprüfung mit IF NOT EXISTS SELECTist die Leistung auch bei Millionen eingefügter Datensätze konstant.
Die Werte sind so eindeutig, dass niemals ein Duplikat generiert wird. Auch nach einigen Millionen eingefügten Werten.