Sql server Foreach使用SMO需要很长时间

Sql server Foreach使用SMO需要很长时间,sql-server,foreach,smo,Sql Server,Foreach,Smo,我有一个方法(旧的遗留代码),它突然开始花费更长的时间来执行。唯一改变的是,我已经从SQL Server 2008 R2 Expr升级到SQL Server 2014 Expr,因此开始使用SMO 2014。 我有大量的数据库,大约180个,我通过这些数据库试图找到其中的一些。通过它们运行的代码如下所示 foreach (Database db in instance.Databases) { foreach (FileGroup fileGroup in db.F

我有一个方法(旧的遗留代码),它突然开始花费更长的时间来执行。唯一改变的是,我已经从SQL Server 2008 R2 Expr升级到SQL Server 2014 Expr,因此开始使用SMO 2014。 我有大量的数据库,大约180个,我通过这些数据库试图找到其中的一些。通过它们运行的代码如下所示

    foreach (Database db in instance.Databases)
    {
       foreach (FileGroup fileGroup in db.FileGroups)
       {
          foreach (DataFile dataFile in fileGroup.Files)
          {
          }
       }
    }
当我找到我正在寻找的第二个foreach数据库时,它的执行时间突然要长得多,在最坏的情况下长达一分钟。 第二个和第三个foreach之间没有代码执行。 第三个foreach中的代码,我在那里做我的工作,像往常一样执行得很快

我不明白为什么要花这么长时间。我试图找出SQL Server 2014中SMO是否发生了任何可能导致这种情况的变化,但我运气不佳

如果有人能告诉我去哪里找我会很感激的

*更新*

根据SQL Profiler,这是SMO 2014提出的查询,需要时间。使用SMO 2008 R2时不进行此查询

exec sp_executesql N'SELECT
ISNULL((case dmi.mirroring_redo_queue_type when N''UNLIMITED'' then 0 else         
dmi.mirroring_redo_queue end),0) AS [MirroringRedoQueueMaxSize],
ISNULL(dmi.mirroring_connection_timeout,0) AS [MirroringTimeout],
ISNULL(dmi.mirroring_partner_name,'''') AS [MirroringPartner],
ISNULL(dmi.mirroring_partner_instance,'''') AS [MirroringPartnerInstance],
ISNULL(dmi.mirroring_role,0) AS [MirroringRole],
ISNULL(dmi.mirroring_safety_level + 1, 0) AS [MirroringSafetyLevel],
ISNULL(dmi.mirroring_state + 1, 0) AS [MirroringStatus],
ISNULL(dmi.mirroring_witness_name,'''') AS [MirroringWitness],
ISNULL(dmi.mirroring_witness_state + 1, 0) AS [MirroringWitnessStatus],
CAST(case when dmi.mirroring_partner_name is null then 0 else 1 end AS bit)         
AS [IsMirroringEnabled],
ISNULL(dmi.mirroring_guid,''00000000-0000-0000-0000-0000000000000000'') AS 
[MirroringID],
ISNULL(dmi.mirroring_role_sequence,0) AS [MirroringRoleSequence],
ISNULL(dmi.mirroring_safety_sequence,0) AS [MirroringSafetySequence],
ISNULL(dmi.mirroring_failover_lsn,0) AS 
[MirroringFailoverLogSequenceNumber],
dtb.is_ansi_null_default_on AS [AnsiNullDefault],
dtb.is_ansi_nulls_on AS [AnsiNullsEnabled],
dtb.is_ansi_padding_on AS [AnsiPaddingEnabled],
dtb.is_ansi_warnings_on AS [AnsiWarningsEnabled],
dtb.is_arithabort_on AS [ArithmeticAbortEnabled],
dtb.is_auto_shrink_on AS [AutoShrink],
dtb.is_cursor_close_on_commit_on AS [CloseCursorsOnCommitEnabled],
dtb.is_concat_null_yields_null_on AS [ConcatenateNullYieldsNull],
dtb.is_numeric_roundabort_on AS [NumericRoundAbortEnabled],
dtb.is_quoted_identifier_on AS [QuotedIdentifiersEnabled],
dtb.is_read_only AS [ReadOnly],
dtb.is_recursive_triggers_on AS [RecursiveTriggersEnabled],
dtb.is_local_cursor_default AS [LocalCursorsDefault],
dtb.page_verify_option AS [PageVerify],
dtb.recovery_model AS [RecoveryModel],
dtb.user_access AS [UserAccess],
dtb.is_db_chaining_on AS [DatabaseOwnershipChaining],
dtb.is_auto_update_stats_async_on AS [AutoUpdateStatisticsAsync],
dtb.is_date_correlation_on AS [DateCorrelationOptimization],
dtb.is_trustworthy_on AS [Trustworthy],
dtb.name AS [Name],
dtb.database_id AS [ID],
dtb.create_date AS [CreateDate],
dtb.is_auto_create_stats_on AS [AutoCreateStatisticsEnabled],
dtb.is_auto_update_stats_on AS [AutoUpdateStatisticsEnabled],
dtb.is_parameterization_forced AS [IsParameterizationForced],
dtb.is_read_committed_snapshot_on AS [IsReadCommittedSnapshotOn],
dtb.is_auto_close_on AS [AutoClose],
dtb.is_broker_enabled AS [BrokerEnabled],
CAST(isnull(dtb.source_database_id, 0) AS bit) AS [IsDatabaseSnapshot],
ISNULL(DB_NAME(dtb.source_database_id), N'''') AS 
[DatabaseSnapshotBaseName],
dtb.is_fulltext_enabled AS [IsFullTextEnabled],
dtb.service_broker_guid AS [ServiceBrokerGuid],
dtb.snapshot_isolation_state AS [SnapshotIsolationState],
(dtb.is_published*1+dtb.is_subscribed*2+dtb.is_merge_published*4) AS 
[ReplicationOptions],
ISNULL(suser_sname(dtb.owner_sid),'''') AS [Owner],
ISNULL(dtb.log_reuse_wait,0) AS [LogReuseWaitStatus],
drs.recovery_fork_guid AS [RecoveryForkGuid],
drs.database_guid AS [DatabaseGuid],
CAST((case when drs.last_log_backup_lsn is not null then 1 else 0 end) AS 
bit) AS [HasFullBackup],
CAST(case when dtb.name in (''master'',''model'',''msdb'',''tempdb'') then 1 
else dtb.is_distributor end AS bit) AS [IsSystemObject],
CAST(case when ctb.database_id is null then 0 else 1  end AS bit) AS 
[ChangeTrackingEnabled],
CAST(ISNULL(ctb.is_auto_cleanup_on,0) AS bit) AS 
[ChangeTrackingAutoCleanUp],
ISNULL(ctb.retention_period,0) AS [ChangeTrackingRetentionPeriod],
CAST(ISNULL(ctb.retention_period_units,0) AS tinyint) AS 
[ChangeTrackingRetentionPeriodUnits],
dtb.containment AS [ContainmentType],
dtb.default_language_lcid AS [DefaultLanguageLcid],
dtb.default_language_name AS [DefaultLanguageName],
dtb.default_fulltext_language_lcid AS [DefaultFullTextLanguageLcid],
ISNULL(dtb.default_fulltext_language_name,N'''') AS 
[DefaultFullTextLanguageName],
CAST(dtb.is_nested_triggers_on AS bit) AS [NestedTriggersEnabled],
CAST(dtb.is_transform_noise_words_on AS bit) AS [TransformNoiseWords],
dtb.two_digit_year_cutoff AS [TwoDigitYearCutoff],
dtb.target_recovery_time_in_seconds AS [TargetRecoveryTime],
dtb.delayed_durability AS [DelayedDurability],
dtb.is_auto_create_stats_incremental_on AS     
[AutoCreateIncrementalStatisticsEnabled],

          case
          when dtb.collation_name is null then 0x200
          else 0
          end |
          case
          when 1 = dtb.is_in_standby then 0x40
          else 0
          end |
          case dtb.state
          when 1 then 0x2 
          when 2 then 0x8
          when 3 then 0x4
          when 4 then 0x10
          when 5 then 0x100
          when 6 then 0x20
          else 1
          end
         AS [Status],
CAST(( case LOWER(convert( nvarchar(128), DATABASEPROPERTYEX(dtb.name, 
''Updateability''))) when ''read_write'' then 1 else 0 end) AS bit) AS 
[IsUpdateable],
CAST(dtb.is_encrypted AS bit) AS [EncryptionEnabled],
CAST(dtb.is_honor_broker_priority_on AS bit) AS [HonorBrokerPriority],
CAST(has_dbaccess(dtb.name) AS bit) AS [IsAccessible],
ISNULL(fsopt.directory_name , N'''') AS [FilestreamDirectoryName],
ISNULL(fsopt.non_transacted_access , 0) AS [FilestreamNonTransactedAccess],
dtb.name AS [DatabaseName2],
dtb.containment AS [ContainmentType2]
FROM
master.sys.databases AS dtb
LEFT OUTER JOIN sys.database_mirroring AS dmi ON dmi.database_id = 
dtb.database_id
LEFT OUTER JOIN sys.database_recovery_status AS drs ON drs.database_id = 
dtb.database_id
LEFT OUTER JOIN sys.change_tracking_databases AS ctb ON ctb.database_id = 
dtb.database_id 
LEFT OUTER JOIN sys.database_filestream_options AS fsopt ON 
fsopt.database_id = dtb.database_id
WHERE
(dtb.name=@_msparam_0)',N'@_msparam_0 nvarchar(4000)',@_msparam_0=N'2016-11-
03'
此查询是否已添加到SMO 2014中?
有人知道为什么要运行此语句吗?

连接一个探查器,查看T-SQL到底要向服务器发送什么,以及执行这些语句是否有延迟。根据我的经验,SMO的效率可能会出人意料地低(比如,做一些你从代码本身中无法预料的事情)。我发现查询导致时间增加。它不是从我的代码生成的,而是从SMO生成的,至少在我看来是这样。我用它更新了我的问题。这个查询似乎只是在一个方便的包中检索数据库的基本信息。没有理由认为这需要花费很长时间,即使执行180次,因为这只是查询一些元数据。我的服务器有155个数据库,一个数据库的查询需要30毫秒。它是针对每个数据库还是针对每个文件组执行一次操作?如我的第一段代码所示,它遍历所有数据库,然后遍历每个数据库的所有文件组,然后遍历每个文件组中的每个数据文件。对每个数据文件执行查询。奇怪的是,如果我从应用程序运行它,需要很长时间,大约有150个数据库,但是当我们在SSMS中运行它,大约有1000个数据库时,它运行得很快。从我的立场来看,SMO似乎在做一些有趣的事情。虽然这并不是你问题的答案,但我个人几乎放弃了SMO,除了它真正增加了价值(如
Scripter
类)之外,其余的都是SQL和PowerShell,它们没有隐藏的成本。例如,当您在数据库上迭代时,您可以通过一个简单的
从[db].sys.filegroups g JOIN[db].sys.database\u files f ON g.data\u space\u id=f.data\u space\u id
获取所有文件。虽然SMO有一个预打包的对象模型很好,但对于大多数任务,如果它能让我更快地找到一个解决方案,那么我可以放弃它。连接一个探查器,看看T-SQL到底要向服务器发送什么,以及执行这些语句是否有任何延迟。根据我的经验,SMO的效率可能会出人意料地低(比如,做一些你从代码本身中无法预料的事情)。我发现查询导致时间增加。它不是从我的代码生成的,而是从SMO生成的,至少在我看来是这样。我用它更新了我的问题。这个查询似乎只是在一个方便的包中检索数据库的基本信息。没有理由认为这需要花费很长时间,即使执行180次,因为这只是查询一些元数据。我的服务器有155个数据库,一个数据库的查询需要30毫秒。它是针对每个数据库还是针对每个文件组执行一次操作?如我的第一段代码所示,它遍历所有数据库,然后遍历每个数据库的所有文件组,然后遍历每个文件组中的每个数据文件。对每个数据文件执行查询。奇怪的是,如果我从应用程序运行它,需要很长时间,大约有150个数据库,但是当我们在SSMS中运行它,大约有1000个数据库时,它运行得很快。从我的立场来看,SMO似乎在做一些有趣的事情。虽然这并不是你问题的答案,但我个人几乎放弃了SMO,除了它真正增加了价值(如
Scripter
类)之外,其余的都是SQL和PowerShell,它们没有隐藏的成本。例如,当您在数据库上迭代时,您可以通过一个简单的
从[db].sys.filegroups g JOIN[db].sys.database\u files f ON g.data\u space\u id=f.data\u space\u id
获取所有文件。虽然SMO有一个预打包的对象模型很好,但对于大多数任务,如果它能让我更快地找到解决方案,我可以放弃它。