Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

MS SQL Server на Linux срещу тест за производителност на Windows, за да забележите разликата

След пускането на SQL Server 2017 за Linux, Microsoft до голяма степен промени цялата игра. Той даде възможност за цял нов свят от възможности за тяхната известна релационна база данни, предлагайки това, което дотогава беше налично само в пространството на Windows.

Знам, че един пурист DBA би ми казал веднага, че готовата версия на SQL Server 2019 Linux има няколко разлики, по отношение на функциите, по отношение на своя аналог в Windows, като например:

  • Няма агент на SQL Server
  • Няма FileStream
  • Без системни разширени съхранени процедури (напр. xp_cmdshell)

Въпреки това станах достатъчно любопитен, за да си помисля „а какво, ако те могат да бъдат сравнени, поне до известна степен, с неща, които и двамата могат да направят?“ И така, дръпнах спусъка на няколко виртуални машини, подготвих някои прости тестове и събрах данни, които да ви представя. Да видим как ще се развият нещата!

Първоначални съображения

Ето спецификациите на всяка виртуална машина:

  • Windows
    • ОС Windows 10
    • 4 vCPU
    • 4 GB RAM
    • 30 GB SSD
  • Linux
    • Ubuntu Server 20.04 LTS
    • 4 vCPU
    • 4 GB RAM
    • 30 GB SSD

За версията на SQL Server избрах най-новата и за двете операционни системи:SQL Server 2019 Developer Edition CU10

При всяко внедряване единственото активирано нещо беше незабавната инициализация на файл (активирана по подразбиране в Linux, активирана ръчно в Windows). Освен това, стойностите по подразбиране остават за останалите настройки.

  • В Windows можете да изберете да активирате незабавна инициализация на файл със съветника за инсталиране.

Тази публикация няма да обхване спецификата на работата с Instant File Initialization в Linux. Въпреки това ще ви оставя връзка към специалната статия, която можете да прочетете по-късно (имайте предвид, че става малко тежка от техническа страна).

Какво включва тестът?

  1. Във всеки екземпляр на SQL Server 2019 внедрих тестова база данни и създадох една таблица само с едно поле (NVARCHAR(MAX)).
  2. Използвайки произволно генериран низ от 1 000 000 знака, изпълних следните стъпки:
    • *Вмъкнете X брой редове в тестовата таблица.
    • Измерете колко време е необходимо за завършване на оператора INSERT.
    • Измерете размера на MDF и LDF файловете.
    • Изтрийте всички редове в тестовата таблица.
    • **Измерете колко време е необходимо за завършване на оператора DELETE.
    • Измерете размера на LDF файла.
    • Изхвърлете тестовата база данни.
    • Създайте отново тестовата база данни.
    • Повторете същия цикъл.

*X беше извършен за 1 000, 5 000, 10 000, 25 000 и 50 000 реда.

**Знам, че изразът TRUNCATE върши работата много по-ефективно, но целта ми тук е да докажа колко добре се управлява всеки регистър на транзакциите за операцията за изтриване във всяка ОС.

Можете да продължите към уебсайта, който използвах за генериране на произволния низ, ако искате да копаете по-дълбоко.

Ето секциите от TSQL кода, който използвах за тестове във всяка операционна система:

Linux TSQL кодове

Създаване на база данни и таблици

DROP DATABASE IF EXISTS test
CREATE DATABASE test
    ON
(FILENAME= '/var/opt/mssql/data/test.mdf', NAME = test, FILEGROWTH = 128MB)
LOG ON
(FILENAME= '/var/opt/mssql/data/test_log.ldf',NAME = test_log, FILEGROWTH = 64MB);

CREATE TABLE test.dbo.ubuntu(
    long_string NVARCHAR(MAX) NOT NULL
)

Размер на MDF и LDF файловете за тестовата база данни

SELECT 
        DB_NAME(database_id) AS 'DB',
        type_desc AS 'Type',
        state_desc AS 'State',
        CONVERT(DECIMAL(10,2),size*8/1024) AS 'Size',
        CONVERT(DECIMAL(10,2),growth*8/1024) AS 'Growth'
FROM    sys.master_files
WHERE   DB_NAME(database_id) = 'test'

Екранната снимка по-долу показва размерите на файловете с данни, когато нищо не се съхранява в базата данни:

Запитвания за определяне дали незабавното инициализиране на файл е активирано

SELECT 
       servicename,
       instant_file_initialization_enabled
FROM   sys.dm_server_services
WHERE  servicename = 'SQL Server (MSSQLSERVER)'

TSQL кодове на Windows

Създаване на база данни и таблици

DROP DATABASE IF EXISTS test
CREATE DATABASE test
    ON
(FILENAME= 'S:\Program Files\Microsoft SQL Server\MSSQL15.WINDOWS\MSSQL\DATA\test.mdf', NAME = test, FILEGROWTH = 128MB)
LOG ON
(FILENAME= ''S:\Program Files\Microsoft SQL Server\MSSQL15.WINDOWS\MSSQL\DATA\test_log.ldf',NAME = test_log, FILEGROWTH = 64MB);

CREATE TABLE test.dbo.windows(
    long_string NVARCHAR(MAX) NOT NULL
)

Размер на MDF и LDF файловете за тестовата база данни

SELECT 
        DB_NAME(database_id) AS 'DB',
        type_desc AS 'Type',
        state_desc AS 'State',
        CONVERT(DECIMAL(10,2),size*8/1024) AS 'Size',
        CONVERT(DECIMAL(10,2),growth*8/1024) AS 'Growth'
FROM    sys.master_files
WHERE   DB_NAME(database_id) = 'test'

Следната екранна снимка показва размерите на файловете с данни, когато нищо не се съхранява в базата данни:

Запитване, за да определите дали незабавното инициализиране на файл е активирано

SELECT 
       servicename,
       instant_file_initialization_enabled
FROM   sys.dm_server_services
WHERE  servicename = 'SQL Server (MSSQLSERVER)'

Скрипт за изпълнение на оператора INSERT:

@limit -> тук посочих броя на редовете за вмъкване в тестовата таблица

За Linux, тъй като изпълних скрипта с SQLCMD, поставих функцията DATEDIFF в самия край. Позволява ми да знам колко секунди отнема цялото изпълнение (за варианта на Windows бих могъл просто да хвърля поглед върху таймера в SQL Server Management Studio).

Целият низ от 1 000 000 знака отива вместо „XXXX“. Поставям го така, само за да го представя добре в тази публикация.

SET NOCOUNT ON
GO
DECLARE @StartTime DATETIME;
DECLARE @i INT;
DECLARE @limit INT;
SET @StartTime = GETDATE();
SET @i = 0;
SET @limit = 1000;

WHILE(@i < @limit)
BEGIN
	INSERT INTO test.dbo.ubuntu VALUES('XXXX');
	SET @i = @i + 1
END

SELECT DATEDIFF(SECOND,@StartTime,GETDATE()) AS 'Elapsed Seconds';

Скрипт за изпълнение на оператора DELETE

SET NOCOUNT ON
GO
DECLARE @StartTime DATETIME;
SET @StartTime = GETDATE();

DELETE FROM test.dbo.ubuntu;

SELECT DATEDIFF(SECOND,@StartTime,GETDATE()) AS 'Elapsed Seconds';

Получените резултати

Всички размери са изразени в MB. Всички измервания на времето се изразяват в секунди.

Време за вмъкване 1000 записа 5000 записа 10 000 записа 25 000 записа 50 000 записа
Linux 4 23 43 104 212
Windows 4 28 172 531 186
Размер (MDF) 1000 записа 5000 записа 10 000 записа 25 000 записа 50 000 записа
Linux 264 1032 2056 5128 10184
Windows 264 1032 2056 5128 10248
Размер (LDF) 1000 записа 5000 записа 10 000 записа 25 000 записа 50 000 записа
Linux 104 264 360 552 148
Windows 136 328 392 456 584
ВРЕМЕ НА ИЗТРИВАНЕ 1000 записа 5000 записа 10 000 записа 25 000 записа 50 000 записа
Linux 1 1 74 215 469
Windows 1 63 126 357 396
ИЗТРИВАНЕ Размер (LDF) 1000 записа 5000 записа 10 000 записа 25 000 записа 50 000 записа
Linux 136 264 392 584 680
Windows 200 328 392 456 712

Ключови прозрения

  • Размерът на MDF беше почти постоянен през целия тест, като варираше леко в самия край (но нищо прекалено лудо).
  • Моментите за INSERT бяха по-добри в Linux в по-голямата си част, с изключение на самия край, когато Windows „спечеля кръга“.
  • Размерът на регистрационния файл на транзакциите се обработваше по-добре в Linux след всеки кръг от INSERT.
  • Моментите за DELETE бяха по-добри в Linux в по-голямата си част, с изключение на самия край, където Windows „спечели кръга“ (намирам за любопитно, че Windows също спечели последния кръг INSERT).
  • Размерът на регистрационните файлове на транзакциите след всеки кръг от ИЗТРИВАНЕ беше почти равен по отношение на възходи и падения между двете.
  • Бих искал да тествам със 100 000 реда, но ми липсваше малко дисково пространство, затова го ограничих на 50 000.

Заключение

Въз основа на резултатите, получени от този тест, бих казал, че няма сериозна причина да се твърди, че вариантът на Linux се представя експоненциално по-добре от неговия аналог на Windows. Разбира се, това в никакъв случай не е формален тест, на който можете да вземете такова решение. Самото упражнение обаче ми беше достатъчно интересно.

Предполагам, че SQL Server 2019 за Windows понякога изостава малко (не много) поради изобразяването на GUI във фонов режим, което не се случва от страната на Ubuntu Server на оградата.

Ако разчитате до голяма степен на функции и възможности, които са ексклузивни за Windows (поне към момента на писане на това писмо), тогава непременно го направете. В противен случай едва ли ще направите лош избор, като изберете едно от друго.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Възможно ли е изтриване от множество таблици в един и същ SQL израз?

  2. Разбиране на анализатора на работното натоварване за картографиране на тесните места в производителността

  3. SQL Server:DELETE срещу TRUNCATE

  4. NOT IN срещу NOT EXISTS

  5. Прегледайте настройките на вашата сесия с SESSIONPROPERTY() в SQL Server