Я не думаю, что проводники - это длинный столб в палатке с точки зрения производительности в этом случае. Выполнение теста PowerShell, показанного ниже, для выбора строки 3M с удаленного сервера, результаты показали, что тест int в среднем примерно на 10% быстрее. Если предположить, что аналогичные результаты в вашей среде, это будет означать, что 27 секунд с int против 30 с guid. Я заметил, что большую часть времени было связано с обработкой клиентским ЦП большого набора результатов.
Это не означает, что нет никаких соображений по поводу направляющих, особенно в отношении однодискового хранилища с вращающимся носителем, но я хотел пояснить, что проблема заключается не в типе данных, а в большом наборе результатов.
$connectionString = "Data Source=YourServer;Initial Catalog=tempdb;Integrated Security=SSPI;Application Name=PerformanceTestScript";
$guidSetupScript = @"
CREATE TABLE dbo.Example (
StaticId uniqueidentifier NOT NULL,
UserId uniqueidentifier NULL,
UserGroupId uniqueidentifier NULL,
CompanyId uniqueidentifier NULL,
CompanyGroupId uniqueidentifier NULL,
CompanyAccessUnitRole uniqueidentifier NULL,
PRIMARY KEY CLUSTERED (StaticId)
);
WITH
t10 AS (SELECT n FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) t(n))
,t1k AS (SELECT 0 AS n FROM t10 AS a CROSS JOIN t10 AS b CROSS JOIN t10 AS c)
,t10m AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) AS num FROM t1k AS a CROSS JOIN t1k AS b CROSS JOIN t1k AS c CROSS JOIN t10 AS d)
INSERT INTO dbo.Example WITH(TABLOCKX) (
StaticId
, UserId
, UserGroupId
, CompanyId
, CompanyGroupId
, CompanyAccessUnitRole
)
SELECT
NEWID()
, NEWID()
, NEWID()
, NEWID()
, NEWID()
, NEWID()
FROM t10m
WHERE num <= 3000000;
"@
$intSetupScript = @"
CREATE TABLE dbo.Example (
StaticId int NOT NULL,
UserId int NULL,
UserGroupId int NULL,
CompanyId int NULL,
CompanyGroupId int NULL,
CompanyAccessUnitRole int NULL,
PRIMARY KEY CLUSTERED (StaticId)
);
WITH
t10 AS (SELECT n FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) t(n))
,t1k AS (SELECT 0 AS n FROM t10 AS a CROSS JOIN t10 AS b CROSS JOIN t10 AS c)
,t10m AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) AS num FROM t1k AS a CROSS JOIN t1k AS b CROSS JOIN t1k AS c CROSS JOIN t10 AS d)
INSERT INTO dbo.Example WITH(TABLOCKX) (
StaticId
, UserId
, UserGroupId
, CompanyId
, CompanyGroupId
, CompanyAccessUnitRole
)
SELECT
num
, num
, num
, num
, num
, num
FROM t10m
WHERE num <= 3000000;
"@
try
{
$values = [System.Array]::CreateInstance([System.Object], 6)
$connection = New-Object System.Data.SqlClient.SqlConnection($connectionString)
$command = New-Object System.Data.SqlClient.SqlCommand
$command.CommandTimeout = 0
$connection.Open()
$command.Connection = $connection
#Guid setup
$command.CommandText = "IF OBJECT_ID(N'dbo.Example') IS NOT NULL DROP TABLE dbo.Example;"
[void]$command.ExecuteNonQuery()
$command.CommandText = $guidSetupScript
[void]$command.ExecuteNonQuery()
#guid test
$testSw = [System.Diagnostics.StopWatch]::StartNew()
Write-Host "Starting Guid test."
$command.CommandText = "SELECT * FROM dbo.Example;"
$reader = $command.ExecuteReader()
while($reader.Read()) {
$values = $reader.GetValues($values)
}
$reader.Close()
$testSw.Stop()
Write-Host "Guid test duration was $($testSw.Elapsed.ToString())"
#int setup
$command.CommandText = "IF OBJECT_ID(N'dbo.Example') IS NOT NULL DROP TABLE dbo.Example;"
[void]$command.ExecuteNonQuery()
$command.CommandText = $intSetupScript
[void]$command.ExecuteNonQuery()
#int test
$testSw = [System.Diagnostics.StopWatch]::StartNew()
Write-Host "Starting int test."
$command.CommandText = "SELECT * FROM dbo.Example;"
$reader = $command.ExecuteReader()
while($reader.Read()) {
$values = $reader.GetValues($values)
}
$reader.Close()
$testSw.Stop()
Write-Host "Int test duration was $($testSw.Elapsed.ToString())"
$connedtion.Close()
}
catch [Exception]
{
throw
}