Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
но на которых стоят экземпляры MS SQL Server 2012-2014 Standart (т е больше 4-х ядер все равно не будет использовать)
Ну блин, ну да, дом надо строить, но почему обязательно топором? Програмисты постоянно пробуют новые инструменты и технологии, почему многие админы застряли на 15-летнем инструменте и делают вид что после этого ничего не было создано?
Есть вещи критические (вроде бэкапа и отслеживания производительности) и вещи которые на практике часто можно и нужно (поскольку время не резиновое) игнорировать. И вот этой иерархии мне в статье не хватает.
Сам бы написал, да критиковать проще :)
Да часто и бесплатно.
Например какие?
SET NOCOUNT ON
IF OBJECT_ID('t1', 'U') IS NOT NULL
DROP TABLE t1
GO
CREATE TABLE t1 (
id INT IDENTITY (1, 1) NOT NULL PRIMARY KEY CLUSTERED
, d CHAR(250) NOT NULL DEFAULT ''
)
GO
DECLARE @count INT = 0
, @dt DATETIME = GETDATE()
WHILE @count < 500000 BEGIN
INSERT t1 DEFAULT VALUES
SET @count += 1
END
SELECT DATEDIFF(MILLISECOND, @dt, GETDATE()) -- 23 second
GO
CHECKPOINT
IF OBJECT_ID('t2', 'U') IS NOT NULL
DROP TABLE t2
GO
CREATE TABLE t2 (
id UNIQUEIDENTIFIER DEFAULT NEWID() NOT NULL PRIMARY KEY CLUSTERED
, d CHAR(250) NOT NULL DEFAULT ''
)
GO
DECLARE @count INT = 0
, @dt DATETIME = GETDATE()
WHILE @count < 500000 BEGIN
INSERT t2 DEFAULT VALUES
SET @count += 1
END
SELECT DATEDIFF(MILLISECOND, @dt, GETDATE()) -- 23 second
GO
CHECKPOINT
IF OBJECT_ID('t3', 'U') IS NOT NULL
DROP TABLE t3
GO
CREATE TABLE t3 (
id UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID() NOT NULL PRIMARY KEY CLUSTERED
, d CHAR(250) NOT NULL DEFAULT ''
)
GO
DECLARE @count INT = 0
, @dt DATETIME = GETDATE()
WHILE @count < 500000 BEGIN
INSERT t3 DEFAULT VALUES
SET @count += 1
END
SELECT DATEDIFF(MILLISECOND, @dt, GETDATE()) -- 23 second
GO
CHECKPOINT
GO
SELECT t.[name]
, size
, s.avg_fragmentation_in_percent
, s.avg_page_space_used_in_percent
FROM sys.objects t
JOIN (
SELECT p.[object_id]
, size = SUM(a.total_pages) * 8. / 1024
FROM sys.partitions p
JOIN sys.allocation_units a ON p.[partition_id] = a.container_id
GROUP BY p.[object_id]
) i ON t.[object_id] = i.[object_id]
CROSS APPLY sys.dm_db_index_physical_stats(DB_ID(), i.[object_id], NULL, NULL, 'DETAILED') s
WHERE t.is_ms_shipped = 0
AND i.[object_id] > 255
AND t.[type] = 'U'
AND s.index_level = 0
-------- -----------
t1 24080
t2 24256
t3 22280
name wait_type wait_time wait_resource wait_signal
-------- ----------------------- ----------- ---------------- ------------
t1 WRITELOG 8.8480 6.7930 2.0550
t2 WRITELOG 8.9310 6.9120 2.0190
t3 WRITELOG 8.2180 6.2340 1.9840
name size avg_fragmentation_in_percent avg_page_space_used_in_percent
-------- ------------- ---------------------------- ------------------------------
t1 130.757812 0,365992680146397 97,4529651593773
t2 197.320312 99,0648999243962 67,572658759575
t3 135.632812 0,666975988864401 98,5015196441809
А то, что в случае использования NEWID() у нас будут чаще происходить операции разбиения страниц, соответственно и фрагментация будет выше (оттого больше логических чтений при работе с этой таблицей).
Кроме того, в этот пост еще хорош для ознакомления Первичный ключ – GUID или автоинкремент?
Регламентные работы с базой данных информационной системы 24x7 в MS SQL Server