Как остановить дополнительный SQL запрос с помощью SMO PrefetchObjects - PullRequest
0 голосов
/ 09 января 2020

У меня есть пример программы, где я использую SMO для извлечения одного представления базы данных и одной таблицы базы данных. Я использовал PrefetchObjects, поэтому он выполняет большую часть работы заранее и устанавливает DefaultInitField для свойства, к которому я хочу получить доступ.

Проблема заключается в том, что я могу получить таблицу базы данных и запросить определенные столбцы тип данных, и нет дополнительных SQL запросов, замеченных в Profiler. Однако, делая то же самое с представлением, я получаю очень длинный запрос в профилировщике, так как он загружает все метаданные.

Я не могу понять, почему представление будет вести себя иначе, чем Таблица здесь, учитывая, что я рассмотрел их в этом примере одинаково.

Dim server As New Server(New ServerConnection("SEVRERIP", "USERNAME", "PASSWORD"))

server.SetDefaultInitFields(GetType(Column), "DataType")

Dim db = server.Databases("DATABASENAME")

Dim ScriptingOptions As New ScriptingOptions()
ScriptingOptions.ExtendedProperties = True

db.PrefetchObjects(GetType(Table), ScriptingOptions)
db.PrefetchObjects(GetType(View), ScriptingOptions)

Dim databaseView = (From view As View In db.Views
                    Where view.Name = "ViewName").FirstOrDefault()

Dim databaseTable = (From table As Table In db.Tables
                     Where table.Name = "TableName").FirstOrDefault()

Dim tableColumn = databaseTable.Columns("ColumnName")
Dim viewColumn = databaseView.Columns("ColumnName")

Dim tableDataType = tableColumn.DataType.MaximumLength // NO EXTRA QUERY
Dim viewDataType = viewColumn.DataType.MaximumLength // SQL PROFILER SHOWS A LARGE QUERY PERFORMED

Запрос, показанный в профилировщике, приведен здесь, если он помогает:

exec sp_executesql N'SELECT
clmns.name AS [Name],
clmns.column_id AS [ID],
clmns.is_nullable AS [Nullable],
clmns.is_computed AS [Computed],
CAST(ISNULL(cik.index_column_id, 0) AS bit) AS [InPrimaryKey],
clmns.is_ansi_padded AS [AnsiPaddingStatus],
CAST(clmns.is_rowguidcol AS bit) AS [RowGuidCol],
CAST(ISNULL(cc.is_persisted, 0) AS bit) AS [IsPersisted],
ISNULL(clmns.collation_name, N'''') AS [Collation],
CAST(ISNULL((select TOP 1 1 from sys.foreign_key_columns AS colfk where colfk.parent_column_id = clmns.column_id and colfk.parent_object_id = clmns.object_id), 0) AS bit) AS [IsForeignKey],
clmns.is_identity AS [Identity],
CAST(ISNULL(ic.seed_value,0) AS numeric(38)) AS [IdentitySeedAsDecimal],
CAST(ISNULL(ic.increment_value,0) AS numeric(38)) AS [IdentityIncrementAsDecimal],
(case when clmns.default_object_id = 0 then N'''' when d.parent_object_id > 0 then N'''' else d.name end) AS [Default],
(case when clmns.default_object_id = 0 then N'''' when d.parent_object_id > 0 then N'''' else schema_name(d.schema_id) end) AS [DefaultSchema],
ISNULL(dc.Name, N'''') AS [DefaultConstraintName],
(case when clmns.rule_object_id = 0 then N'''' else r.name end) AS [Rule],
(case when clmns.rule_object_id = 0 then N'''' else schema_name(r.schema_id) end) AS [RuleSchema],
CAST(ISNULL(COLUMNPROPERTY(clmns.object_id, clmns.name, N''IsDeterministic''),0) AS bit) AS [IsDeterministic],
CAST(ISNULL(COLUMNPROPERTY(clmns.object_id, clmns.name, N''IsPrecise''),0) AS bit) AS [IsPrecise],
ISNULL(ic.is_not_for_replication, 0) AS [NotForReplication],
CAST(COLUMNPROPERTY(clmns.object_id, clmns.name, N''IsFulltextIndexed'') AS bit) AS [IsFullTextIndexed],
CAST(COLUMNPROPERTY(clmns.object_id, clmns.name, N''StatisticalSemantics'') AS int) AS [StatisticalSemantics],
CAST(clmns.encryption_type AS int) AS [EncryptionType],
clmns.encryption_algorithm_name AS [EncryptionAlgorithm],
clmns.column_encryption_key_id AS [ColumnEncryptionKeyID],
ceks.name AS [ColumnEncryptionKeyName],
CAST(clmns.is_filestream AS bit) AS [IsFileStream],
CAST(clmns.is_sparse AS bit) AS [IsSparse],
CAST(clmns.is_column_set AS bit) AS [IsColumnSet],
usrt.name AS [DataType],
s1clmns.name AS [DataTypeSchema],
ISNULL(baset.name, N'''') AS [SystemType],
CAST(CASE WHEN baset.name IN (N''nchar'', N''nvarchar'') AND clmns.max_length <> -1 THEN clmns.max_length/2 ELSE clmns.max_length END AS int) AS [Length],
CAST(clmns.precision AS int) AS [NumericPrecision],
CAST(clmns.scale AS int) AS [NumericScale],
ISNULL(xscclmns.name, N'''') AS [XmlSchemaNamespace],
ISNULL(s2clmns.name, N'''') AS [XmlSchemaNamespaceSchema],
ISNULL( (case clmns.is_xml_document when 1 then 2 else 1 end), 0) AS [XmlDocumentConstraint],
CASE WHEN usrt.is_table_type = 1 THEN N''structured'' ELSE N'''' END AS [UserType],
clmns.generated_always_type AS [GeneratedAlwaysType],
CAST(clmns.is_hidden AS bit) AS [IsHidden],
CAST(clmns.is_masked AS bit) AS [IsMasked],
CAST(
        CASE
        WHEN ep1.value IS NOT NULL or ep2.value IS NOT NULL or ep3.value IS NOT NULL or ep4.value IS NOT NULL THEN 1
        ELSE 0
        END
       AS bit) AS [IsClassified],
ISNULL(clmns.graph_type, 0) AS [GraphType]
FROM
sys.all_views AS v
INNER JOIN sys.all_columns AS clmns ON clmns.object_id=v.object_id
LEFT OUTER JOIN sys.indexes AS ik ON ik.object_id = clmns.object_id and 1=ik.is_primary_key
LEFT OUTER JOIN sys.index_columns AS cik ON cik.index_id = ik.index_id and cik.column_id = clmns.column_id and cik.object_id = clmns.object_id and 0 = cik.is_included_column
LEFT OUTER JOIN sys.computed_columns AS cc ON cc.object_id = clmns.object_id and cc.column_id = clmns.column_id
LEFT OUTER JOIN sys.identity_columns AS ic ON ic.object_id = clmns.object_id and ic.column_id = clmns.column_id
LEFT OUTER JOIN sys.objects AS d ON d.object_id = clmns.default_object_id
LEFT OUTER JOIN sys.default_constraints as dc ON clmns.default_object_id = dc.object_id
LEFT OUTER JOIN sys.objects AS r ON r.object_id = clmns.rule_object_id
LEFT OUTER JOIN sys.column_encryption_keys AS ceks ON (ceks.column_encryption_key_id = clmns.column_encryption_key_id)
LEFT OUTER JOIN sys.types AS usrt ON usrt.user_type_id = clmns.user_type_id
LEFT OUTER JOIN sys.schemas AS s1clmns ON s1clmns.schema_id = usrt.schema_id
LEFT OUTER JOIN sys.types AS baset ON (baset.user_type_id = clmns.system_type_id and baset.user_type_id = baset.system_type_id) or ((baset.system_type_id = clmns.system_type_id) and (baset.user_type_id = clmns.user_type_id) and (baset.is_user_defined = 0) and (baset.is_assembly_type = 1)) 
LEFT OUTER JOIN sys.xml_schema_collections AS xscclmns ON xscclmns.xml_collection_id = clmns.xml_collection_id
LEFT OUTER JOIN sys.schemas AS s2clmns ON s2clmns.schema_id = xscclmns.schema_id
LEFT OUTER JOIN sys.tables t ON t.object_id = clmns.object_id
LEFT OUTER JOIN sys.schemas AS s ON s.schema_id = t.schema_id
LEFT OUTER JOIN sys.extended_properties AS ep1 ON clmns.object_id = ep1.major_id AND clmns.column_id = ep1.minor_id and ep1.name = ''sys_sensitivity_label_name''
LEFT OUTER JOIN sys.extended_properties AS ep2 ON clmns.object_id = ep2.major_id AND clmns.column_id = ep2.minor_id and ep2.name = ''sys_sensitivity_label_id''
LEFT OUTER JOIN sys.extended_properties AS ep3 ON clmns.object_id = ep3.major_id AND clmns.column_id = ep3.minor_id and ep3.name = ''sys_information_type_name''
LEFT OUTER JOIN sys.extended_properties AS ep4 ON clmns.object_id = ep4.major_id AND clmns.column_id = ep4.minor_id and ep4.name = ''sys_information_type_id''
WHERE
(clmns.name=@_msparam_0)and((v.type = @_msparam_1)and(v.name=@_msparam_2 and SCHEMA_NAME(v.schema_id)=@_msparam_3))',N'@_msparam_0 nvarchar(4000),@_msparam_1 nvarchar(4000),@_msparam_2 nvarchar(4000),@_msparam_3 nvarchar(4000)',@_msparam_0=N'COLUMNNAME',@_msparam_1=N'V',@_msparam_2=N'VIEWNAME',@_msparam_3=N'dbo'
...