SQL Последовательность серверов и постоянный вычисляемый столбец? Какой из них лучше для производительности? - PullRequest
1 голос
/ 13 марта 2020

Если вам нужно сгенерировать уникальный серийный номер, такой как T1000, T10001, T10002 ... и т. Д.

Два метода, которые приходят на ум:

  1. Сохраняемый вычисляемый столбец
  2. Пользовательская последовательность

Есть ли преимущество в производительности при использовании одного над другим?

1 Ответ

0 голосов
/ 18 марта 2020

Я только что сравнил производительность для IDENTITY и SEQUENCE. Я считаю, что у IDENTITY чуть лучшая производительность, так как у него меньше ввода-вывода и меньше ЦП.

Настройка теста производительности

CREATE TABLE #test_Identity
(
ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
NAME CHAR(1) NOT NULL,
TID AS CONCAT('T',ID) PERSISTED)

CREATE SEQUENCE dbo.SEQ_VAL Start with 1 increment by 1;

CREATE TABLE #test_seq
(
ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
NAME CHAR(1) NOT NULL DEFAULT 'A',
TID CHAR(10) NOT NULL)

SET STATISTICS IO ON
SET STATISTICS TIME ON

Тест производительности: вставка 10000 строк.

  • Использование последовательности
    INSERT INTO #test_seq(TID)
    SELECT CONCAT('T',NEXT VALUE FOR dbo.SEQ_VAL)
    FROM (SELECT TOP 10000 * FROM sys.objects) AS T

SQL Server parse and compile time:     CPU time = 14 ms, elapsed time
    = 14 ms. 
Table '#test_seq_____00000000569F'. Scan count 0, logical reads 21418, physical reads 0, 
read-ahead reads 30,lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

Table 'sysschobjs'. Scan count 1, logical reads 242, physical reads 0, 
read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:    CPU time = 141 ms,  elapsed time = 247 ms.

  • Использование идентификатора
    INSERT INTO #test_Identity(Name)
    SELECT top 10000 'A'
    FROM sys.objects

SQL Server parse and compile time:     CPU time = 13 ms, elapsed time
    = 13 ms. 
Table '#test_______________00000000569D'. Scan count 0, logical reads 21413, physical reads 0, 
read-ahead reads 31, lob logical reads 0, lob physical reads 0, 
lob read-ahead reads 0. Table 'sysschobjs'. Scan count 1, logical reads 242, physical reads 0,
read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:    CPU time = 110 ms,  elapsed time = 101 ms.
...