2013-03-13 8 views
3

У нас есть SQL Server с довольно большими таблицами (но не слишком много) - возможно, 30-40 миллионов записей.Вставка и выбор производительности на SQL Server 2008 R2

Нам нужно

а) вставить прибло 1000 записей в секунду (на определенное время - но мы не можем пакетную вставку) к одной из этих таблиц, скажем TABLE_A и б) в то же время выберите * из TABLE_B где ID = _SOME_GUID_ID

Я заметил, что (а) в настоящее время занимает 500-600 мс под нагрузкой (на вставке, учитывая, что мы не можем их партия) и (б) занимает около 400ms (есть указатель)

Это не так близко к производительности, которую мы ищем. Есть ли способ оптимизировать эти таблицы/операции?

Текущий сервер имеет 16 гБ оперативной памяти, а общий размер базы данных составляет около 40 ГБ. Мы ожидаем, что эти таблицы станут в 10 раз большими в ближайшие несколько месяцев. Есть ли какой-либо осколок, который мы можем сделать с Sql Server? Мы увидели бы какие-либо улучшения производительности, используя MySQL Percona build?

Надеюсь, это имеет смысл. Я хотел добавить, что мы используем NHibernate, но вышеприведенная производительность - миллисекунды, потраченные на вставку в db - не включая приложение или nh служебные данные.

Спасибо, Яннис

ответ

3

Несколько вещей приходят на ум. Каков первичный ключ - это GUID или целое число, если это GUID и вы кластеризуетесь на этом, тогда SQL Server придется вставлять в разные места вместо последовательного. Является ли ваш размер базы данных, размер вашего журнала или автовыставка все время, см. Sizing database files

Запустите профайлер и посмотрите, какой тип SQL nhibernate создается. 1000 вставок в секунду уже не впечатляют, узким местом, вероятно, будет также аппаратное обеспечение, убедитесь, что он правильно настроен и настроен. Файлы tempdb, log и data на одном диске? Если это так, переместите их в отдельные приводы

Другой вариант переписать часть, которая делает эти вставки и партия их вместо одной строки вставляет

Вот пример, который я бежал от SSMS, он делает 4999 вставок в 166 миллисекунды, 1000 в 40 миллисекунды

CREATE TABLE Sometest(id INT PRIMARY KEY, 
SomeCol VARCHAR(200), SomeDate DATETIME,SomeCol2 VARCHAR(200), 
SomeDate2 DATETIME,SomeCol3 VARCHAR(200), 
SomeDate3 DATETIME,SomeCol4 VARCHAR(200), SomeDate4 DATETIME) 
GO 




DECLARE @start DATETIME = GETDATE() 
SET NOCOUNT ON 
DECLARE @id INT =1 
WHILE @id < 1000 
BEGIN 
    INSERT Sometest 
    SELECT @id ,'BlaBlaBlaBlaBlaBlaBlaBlaBlaBla111111',GETDATE(), 
    'BlaBlaBlaBlaBlaBlaBlaBlaBlaBla2222',GETDATE(), 
    'BlaBlaBlaBlaBlaBlaBlaBlaBlaBla3333',GETDATE(), 
    'BlaBlaBlaBlaBlaBlaBlaBlaBlaBla4444',GETDATE() 
SET @id+=1 
END 




SELECT DATEDIFF(ms,@start,GETDATE()) 
SELECT COUNT(*) FROM Sometest 

Если вы обернуть все это в сделке будет намного быстрее, 50000 вставки в 800 миллисекунд, 5000 вставок в 103 миллисекунд, 1000 вставок в 23 миллисекунд

TRUNCATE TABLE Sometest 
DECLARE @start DATETIME = GETDATE() 
SET NOCOUNT ON 
BEGIN tran 
DECLARE @id INT =1 
WHILE @id < 50000 
BEGIN 
    INSERT Sometest 
    SELECT @id ,'BlaBlaBlaBlaBlaBlaBlaBlaBlaBla111111',GETDATE(), 
    'BlaBlaBlaBlaBlaBlaBlaBlaBlaBla2222',GETDATE(), 
    'BlaBlaBlaBlaBlaBlaBlaBlaBlaBla3333',GETDATE(), 
    'BlaBlaBlaBlaBlaBlaBlaBlaBlaBla4444',GETDATE() 
SET @id+=1 
END 
commit 
SELECT DATEDIFF(ms,@start,GETDATE()) 
SELECT COUNT(*) FROM Sometest 

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

+0

TABLE_A имеет идентификатор int с автоматическим инкрементом, а TABLE_B имеет идентификатор guid.Сколько времени нужно вставлять в такие (довольно сильно индексированные) таблицы с учетом нашего оборудования? – Yannis

+0

Запустите свои вставки из SSMS и протестируйте, как вы узнаете, что ваша проблема без тестирования ... может быть сеть, диски. Каков ваш физический макет, сколько оперативной памяти можно увидеть в SQL Server и т. Д. Что вы думаете о плане производительности – SQLMenace

0

Вашего Guid может быть последовательный guid или случайный guid, вам нужно знать, что. Вы можете временно отключить некластеризованные индексы и перестроить их в конце вставки, предоставляя вам возможность (возможно) медленнее выбирать в этой таблице за этот период. Сколько ядер и сколько темпов у вас есть? Попробуйте 1 tempdb на ядро ​​(до 8 ядер), но не забудьте установить правильную настройку фокуса трассировки для выравнивания использования tempdb. И, как сказано ниже, пакетные вставки

Смежные вопросы