Загрузка ЦП базой данных?

Другой сценарий, когда это происходит, - это когда у вас есть базовый класс и один или несколько подклассов, где по крайней мере один из подклассов вводит дополнительные свойства:

class Folder {
  [key]
  public string Id { get; set; }

  public string Name { get; set; }
}

// Adds no props, but comes from a different view in the db to Folder:
class SomeKindOfFolder: Folder {
}

// Adds some props, but comes from a different view in the db to Folder:
class AnotherKindOfFolder: Folder {
  public string FolderAttributes { get; set; }
}

Если они отображаются в DbContext, как показано ниже, ошибка «Недопустимое имя столбца« Дискриминатор »возникает, когда доступ к любому типу, основанному на базовом типе Folder:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
  modelBuilder.Entity<Folder>().ToTable("All_Folders");
  modelBuilder.Entity<SomeKindOfFolder>().ToTable("Some_Kind_Of_Folders");
  modelBuilder.Entity<AnotherKindOfFolder>().ToTable("Another_Kind_Of_Folders");
}

Я обнаружил, что для исправления проблемы мы извлекаем реквизиты Folder к базовому классу (который не отображается в OnModelCreating()), так же - OnModelCreating не должен быть изменен:

class FolderBase {
  [key]
  public string Id { get; set; }

  public string Name { get; set; }
}

class Folder: FolderBase {
}

class SomeKindOfFolder: FolderBase {
}

class AnotherKindOfFolder: FolderBase {
  public string FolderAttributes { get; set; }
}

Это устраняет проблему, но я не знаю почему!

30
задан Oreo 27 November 2017 в 17:29
поделиться

5 ответов

Вид. Проверьте этот запрос:

SELECT total_worker_time/execution_count AS AvgCPU  
, total_worker_time AS TotalCPU
, total_elapsed_time/execution_count AS AvgDuration  
, total_elapsed_time AS TotalDuration  
, (total_logical_reads+total_physical_reads)/execution_count AS AvgReads 
, (total_logical_reads+total_physical_reads) AS TotalReads
, execution_count   
, SUBSTRING(st.TEXT, (qs.statement_start_offset/2)+1  
, ((CASE qs.statement_end_offset  WHEN -1 THEN datalength(st.TEXT)  
ELSE qs.statement_end_offset  
END - qs.statement_start_offset)/2) + 1) AS txt  
, query_plan
FROM sys.dm_exec_query_stats AS qs  
cross apply sys.dm_exec_sql_text(qs.sql_handle) AS st  
cross apply sys.dm_exec_query_plan (qs.plan_handle) AS qp 
ORDER BY 1 DESC

Это получит Вас запросы в кэше плана в порядке того, сколько ЦП они израсходовали. Можно периодически выполнять это, как в задании SQL Agent, и вставлять результаты в таблицу, чтобы удостовериться, что данные сохраняются вне перезагрузок.

при чтении результатов Вы, вероятно, поймете, почему мы не можем сопоставить те данные непосредственно назад к отдельной базе данных. Во-первых, единый запрос может также скрыть своего истинного родителя базы данных путем выполнения приемов как это:

USE msdb
DECLARE @StringToExecute VARCHAR(1000)
SET @StringToExecute = 'SELECT * FROM AdventureWorks.dbo.ErrorLog'
EXEC @StringToExecute

запрос был бы выполнен в MSDB, но он опросит результаты AdventureWorks. Где мы должны присвоить потребление ресурсов ЦП?

Это ухудшается когда Вы:

  • Соединение между несколькими базами данных
  • Выполнение транзакция в нескольких базах данных и усилие по блокировке охватывают несколько баз данных
  • задания SQL Agent Выполнения в MSDB, которые "работают" в MSDB, но создают резервную копию отдельных баз данных

, Это продолжается и на. Вот почему это имеет смысл к мелодии производительности на уровне запроса вместо уровня базы данных.

В SQL Server 2008R2, Microsoft представила управление производительностью и функции управления приложением, которые позволят нам упаковать единую базу данных в распространяемом и развертываемом пакете DAC, и они обещают функциям помочь справиться с производительностью отдельных баз данных и их приложений. Это все еще не делает то, что Вы ищете, все же.

Для больше из тех, проверьте репозиторий T-SQL в Жабе SQL Server В мире Wiki (раньше в SQLServerPedia) .

Обновленный на 1/29 для включения общих количеств вместо просто средних чисел.

81
ответ дан Brent Ozar 27 November 2019 в 23:04
поделиться

SQL Server (запускающийся с 2000) установит счетчики производительности (просматриваемый от Performance Monitor или Perfmon).

Одна из встречных категорий (от установки SQL Server 2005 года:) - SQLServer:Databases

С одним экземпляром для каждой базы данных. Счетчики, доступные однако, не предоставляют счетчик Использования % ЦП или что-то подобное, хотя существуют некоторые счетчики скорости, которые Вы могли использовать для получения хорошей оценки ЦП. Пример был бы, если у Вас есть 2 базы данных, и измеренный уровень является 20 транзакциями/секунда на базе данных A и 80 сделками/секунда на базе данных B---тогда, Вы знали бы, что A способствует примерно 20% общего ЦП, и B способствует другим 80%.

здесь существуют некоторые дефекты, поскольку это предполагает, что вся сделанная работа является зависящей от ЦП, который, конечно, с базами данных это не. Но это было бы запуском, которому я верю.

15
ответ дан Adam 27 November 2019 в 23:04
поделиться

Смотрите на Часовой SQL . Это делает все, в чем Вы нуждаетесь и т.д.

С уважением, Lieven

0
ответ дан Lieven Keersmaekers 27 November 2019 в 23:04
поделиться

Я думаю, что ответ на Ваш вопрос нет.

проблема - то, что одно действие по машине может вызвать нагрузку на несколько баз данных. Если у меня есть процесс, который читает из конфигурации DB, регистрируясь к регистрирующемуся DB и движущимся транзакциям в и из различного DBS на основе типа, как я делю использование ЦП?

Вы могли разделить загрузку ЦП на загрузку транзакции, но это - снова грубая метрика, которая может ввести в заблуждение Вас. Как Вы разделили бы журнал транзакций, поставлющийся от одного DB до другого, например? Загрузка ЦП в чтении или записи?

Вы - более обеспеченное рассмотрение скорости обработки транзакций для машины и загрузки ЦП, которую это вызывает. Вы могли также представить хранимые процедуры и видеть, занимает ли какой-либо из них беспорядочное количество времени; однако, это не получит Вас ответ, который Вы хотите.

1
ответ дан Ry Jones 27 November 2019 в 23:04
поделиться

Вы посмотрели на профилировщика SQL?

Берут шаблон "T-SQL" или "Stored Procedure" стандарта, настраивают поля для группировки базой данных ID (я думаю, что у Вас есть к используемому число, Вы не получаете имя базы данных, но легко узнать должностное лицо использования sp_databases для получения списка)

Выполнение это некоторое время, и Вы получите общие количества ЦП / Диск IO / Ожидает и т.д. Это может дать Вам пропорцию ЦП, используемого каждой базой данных.

, Если Вы контролируете счетчик PerfMon одновременно (регистрируют данные к базе данных SQL), и делают то же для SQL Profiler (журнал к базе данных), Вы можете смочь коррелировать два вместе.

, Несмотря на это, это должно дать Вам действительно ключ к разгадке, относительно которого на DB стоит посмотреть более подробно. Затем сделайте то же снова только с, что база данных ID и ищет самый дорогой SQL / Хранимые процедуры.

0
ответ дан Guy 27 November 2019 в 23:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: