Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.02.07;
Скачать: CL | DM;

Вниз

Большие таблицы   Найти похожие ветки 

 
картман ©   (2009-11-30 12:43) [0]

Всем привет!
 Есть БД с большим кол-вом записей в таблицах - > 1 000 000. Запись ведется постоянно и стала медленной. Кол-во записей увеличивается постоянно. СУБД SQL Server 2005, но, думаю, не принципиально. Вопрос - как организовать эффективное хранение/добавление/извлечение данных, при условии, что эти операции проводятся одновременно(или почти одновременно). Как вообще решаются вопросы производительности больших БД? Подскажите литературу, плиз.


 
Sergey13 ©   (2009-11-30 12:46) [1]

При таком вопросе недурственно бы еще указывать что за таблица (структура, индексы и т.п.) и как конкретно ведется запись.


 
Игорь Шевченко ©   (2009-11-30 12:47) [2]


>  Есть БД с большим кол-вом записей в таблицах - > 1 000
> 000


разве это большое количество


 
clickmaker ©   (2009-11-30 12:53) [3]

> Есть БД с большим кол-вом записей в таблицах - > 1 000 000

и все нужны?
может, имеет смысл периодически архивировать или чистить?


 
картман ©   (2009-11-30 12:54) [4]


> Sergey13 ©   (30.11.09 12:46) [1]

Ну, со-структурой и индексами я разберусь. Мне в более глобальном плане.

запись ведет программа, анализирующая тексты, примерно 5-20 зап/сек


> Игорь Шевченко ©   (30.11.09 12:47) [2]

Для меня большое - как сделать, чтоб стало маленьким?


 
картман ©   (2009-11-30 12:54) [5]


> clickmaker ©   (30.11.09 12:53) [3]

нужны


 
Sergey13 ©   (2009-11-30 12:57) [6]

> [4] картман ©   (30.11.09 12:54)
> Мне в более глобальном плане.

Т.е. фигни всякой? 8-)
Все глобальное складывается из очень конкретных неправильных действий. Например только сочетание нескольких ошибок привело к "глобальному" взрыву на ЧАЭС.


 
clickmaker ©   (2009-11-30 12:57) [7]

> [5] картман ©   (30.11.09 12:54)

тогда, не зная структуру данных, мало что посоветовать можно


 
ZeroDivide ©   (2009-11-30 12:57) [8]

На триггере Before Insert ничего "такого" не понаписано? Летать должна вставка, если ничего лишнего на триггерах не висит. Дальнейшая оптимизация - проблема самой СУБД.


 
ZeroDivide ©   (2009-11-30 13:00) [9]

Ну и да, попробуйте повключать-поотключать некоторые индексы. Возможно тоже даст эффект.


 
ZeroDivide ©   (2009-11-30 13:02) [10]

И с транзакциями тоже посмотрите, что у вас. Возможно коммитить можно пакетами, а не после каждой вставки... это зависит, конечно, от специфики задачи.


 
Sergey Masloff   (2009-11-30 13:15) [11]

По идее скорость записи от числа записей зависеть не должна.
Если на таблице кроме вставки еще и удаления относительно часты и есть индексы то замедление возможно - нужно предусмотреть эпизодическую перестройку индексов. Если идет только вставка то перестройка нужна гораздо реже. Кстати наверняка в настройках есть опция (я не спец в MSSQL) чтобы при вставке не использовать "дырки" от удаленных записей.


 
clickmaker ©   (2009-11-30 13:18) [12]

> чтобы при вставке не использовать "дырки" от удаленных записей.

насколько я знаю, мс скл их и не использует
для упаковки базы в нем есть специальные команды, которые видимо и оптимизируют размещение блоков, то есть дефрагментируют


 
картман ©   (2009-11-30 13:22) [13]


> ZeroDivide ©   (30.11.09 12:57) [8]

ничего


> Sergey Masloff   (30.11.09 13:15) [11]

там перед вставкой несколько select"ов идет...

Так есть книжка СуперХранилищеДанных за 24 часа?


 
clickmaker ©   (2009-11-30 13:26) [14]

> Так есть книжка СуперХранилищеДанных за 24 часа?

конечно. Это называется "знал бы прикуп - жил бы в Сочи"


 
Anatoly Podgoretsky ©   (2009-11-30 13:28) [15]


> Для меня большое - как сделать, чтоб стало маленьким?

Так у тебя и так маленькое количесто, 1 000 000 это же смешно.


 
Sergey13 ©   (2009-11-30 13:29) [16]

> [13] картман ©   (30.11.09 13:22)
> там перед вставкой несколько select"ов идет...

Постов через 20 выяснится, что ПК заполняется max+1 по неиндексированным полям. 8-)


 
Anatoly Podgoretsky ©   (2009-11-30 13:30) [17]


> при вставке не использовать "дырки" от удаленных записей.

Что бы снизить быстродействие?

> для упаковки базы в нем есть специальные команды, которые
> видимо и оптимизируют размещение блоков, то есть дефрагментируют

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

Только чего говорить об квадратном коне в вакуме?


 
Anatoly Podgoretsky ©   (2009-11-30 13:31) [18]


> картман ©   (30.11.09 12:43)  

Вооспользуйся профайлером, да и вопрос этот для специализированого форума, по данной СУБД


 
картман ©   (2009-11-30 13:37) [19]


> Anatoly Podgoretsky ©   (30.11.09 13:28) [15]

1 млн * 365 * (не знаю, сколько лет)? Ну ладно, последний множитель 1.


> Anatoly Podgoretsky ©   (30.11.09 13:30) [17]


>
> Только чего говорить об квадратном коне в вакуме?


Да не нужно мне, как завязывать шелковые шнурки салатового цвета - меня интересует, как завязывать шнурки вообще.


 
Anatoly Podgoretsky ©   (2009-11-30 13:39) [20]

> картман  (30.11.2009 13:37:19)  [19]

Ты уже определил узкое место, проштудировал BOL?


 
clickmaker ©   (2009-11-30 13:44) [21]

> [19] картман ©   (30.11.09 13:37)

вот эти скрипты позапускай. Глядишь, и обрисуется слабое место
http://msdn.microsoft.com/ru-ru/magazine/cc135978.aspx


 
картман ©   (2009-11-30 13:54) [22]


> Anatoly Podgoretsky ©   (30.11.09 13:39) [20]

Сейчас займусь


> clickmaker ©   (30.11.09 13:44) [21]

Спасибо большое


 
Anatoly Podgoretsky ©   (2009-11-30 13:57) [23]


> Сейчас займусь

Если ты хочешь квалифицированый ответ, то тебе надо идти на www.sql.ru


 
картман ©   (2009-11-30 14:02) [24]


> Anatoly Podgoretsky ©   (30.11.09 13:57) [23]

мне там интерфейс форума не нравится и потом, с насморком привык сюда:)


 
Игорь Шевченко ©   (2009-11-30 14:09) [25]

я не понял, у тебя на вставке миллиона записей тормоза или на вставке десятка тысяч в таблице с миллионом тормоза ?


 
картман ©   (2009-11-30 14:15) [26]


> Игорь Шевченко ©   (30.11.09 14:09) [25]

На вставке десятка тысяч в таблицу с миллионом. Только как-то странно - когда приложение делает анализ и потом заносит в БД данные, обычно грузит процессор(ядро) на 100%, работы СУБД же почти не заметно - по загрузке проца, сейчас же наоборот - анализатор простаивает, а СУБД съедает все ресурсы. Что-то не верится, что из-за увеличения кол-ва записей, так сильно могли поменяться приоритеты...


 
Игорь Шевченко ©   (2009-11-30 14:17) [27]


> На вставке десятка тысяч в таблицу с миллионом


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


 
Anatoly Podgoretsky ©   (2009-11-30 14:52) [28]

> картман  (30.11.2009 14:15:26)  [26]

Вполне нормально, при кардинальном изменение количества записей, план может измениться сильно.


 
clickmaker ©   (2009-11-30 15:07) [29]

> На вставке десятка тысяч в таблицу с миллионом

транзакция явно стартует?


 
картман ©   (2009-11-30 15:10) [30]


> clickmaker ©   (30.11.09 15:07) [29]

нет


 
clickmaker ©   (2009-11-30 15:16) [31]

> [30] картман ©   (30.11.09 15:10)

рекомендую стартовать
фишка в том, что при отсутствии явной транзакции, сиквел стартует ее для каждой операции (insert, select, update, delete). А это накладные расходы.
А если еще и триггеры на таблицу навешаны...
Вообще, вставка 10 тысяч записей одним махом наводит на мысль о bulk copy или о чем-то наподобие. Если конечно при этом какая-то логика не должна срабатывать, в т.ч. и на триггерах


 
Anatoly Podgoretsky ©   (2009-11-30 15:19) [32]

> картман  (30.11.2009 15:10:30)  [30]

Это невозможно, все операции идут только в рамках транзакции.


 
картман ©   (2009-11-30 15:19) [33]


> clickmaker ©   (30.11.09 15:16) [31]

bulk не пойдет из-за логики программы


> рекомендую стартовать

т.е. тут:

 if exists(select * from table where id = 13234)
   insert into...

две транзакции?


 
clickmaker ©   (2009-11-30 15:21) [34]

> две транзакции?

нет, потому что if - атомарная операция
вот отдельно селект и инсерт не связанные - две


 
Anatoly Podgoretsky ©   (2009-11-30 15:22) [35]

> картман  (30.11.2009 15:19:33)  [33]

Одна, это называется пакет.


 
Petr V. Abramov ©   (2009-11-30 15:23) [36]


> if exists(select * from table where id = 13234)
>    insert into...


вот тут-то похоже собака и порылась


 
Игорь Шевченко ©   (2009-11-30 15:26) [37]


>  if exists(select * from table where id = 13234)
>    insert into...


я говорил, что приложение плохое


 
Petr V. Abramov ©   (2009-11-30 15:28) [38]


> Игорь Шевченко ©   (30.11.09 15:26) [37]

шаман!


 
картман ©   (2009-11-30 15:30) [39]


> clickmaker ©   (30.11.09 15:21) [34]


> Anatoly Podgoretsky ©   (30.11.09 15:22) [35]


> Petr V. Abramov ©   (30.11.09 15:23) [36]

ужас. Я в шоке.


> Игорь Шевченко ©   (30.11.09 15:26) [37]

я сейчас тремя строчками исправлю эту плохоту, новый код сам подгрузится?


 
Petr V. Abramov ©   (2009-11-30 15:33) [40]


> картман ©   (30.11.09 15:30) [39]


> ужас. Я в шоке.
>

от чего ты в шоке? от того, что скорость селекта разная на 1000 записей и на миллионе?


 
Anatoly Podgoretsky ©   (2009-11-30 15:34) [41]

> картман  (30.11.2009 15:30:39)  [39]

Легко проверить, если изменить запрос на

Insert into 1
Insert into 2

и во встором инсерте сделать ошибку, далее посмотреть вставился ли 1 или отменен.
И тогда не надо будет впадать в ужас, а сразу станет ясно, кто прав, а кто нет


 
картман ©   (2009-11-30 15:41) [42]


> Anatoly Podgoretsky ©   (30.11.09 15:34) [41]

ну да, действительно, просто не думал, что для селекта тоже... мда...


> И тогда не надо будет впадать в ужас, а сразу станет ясно,
>  кто прав, а кто нет

да я не оспариваю Вашу правоту и других - немного пошутил:)

Итак:
start transaction
begin try
 ...
 commit transaction
end try
begin catch
 rollback transaction
end catch

 Изменения в скорости не наблюдаются - либо новый код не подгрузился, либо собака рылась не тут:(

 Искренне надеюсь на разнообразие интересов друга человеческого.


 
Игорь Шевченко ©   (2009-11-30 15:42) [43]


>  ...


а тут что ?


 
картман ©   (2009-11-30 16:00) [44]


> Игорь Шевченко ©   (30.11.09 15:42) [43]

а тут плохая программа:
 declare a int, b int, c int
 if exists(select * from ...)
     select a = id from table 1 where ...
 if exists(select * from ...)
     select b = id from table 1 where ...
 if exists(select * from ...)
     select c = id from table 1 where ...
 if exists(select * from ...)

 insert into...

изменить все это можно только переделав службу, написанную на шарпе, код которого вызывает у меня рвотный рефлекс, плюс, данные нужно передавать xml, который я не знаю как обрабатывать в SQL Server.


 
Anatoly Podgoretsky ©   (2009-11-30 16:03) [45]

> картман  (30.11.2009 15:41:42)  [42]

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


 
clickmaker ©   (2009-11-30 16:03) [46]

> if exists(select * from ...)
>     select a = id from table 1 where ...

надеюсь, не if exists(select * from table 1 ?


 
Игорь Шевченко ©   (2009-11-30 16:04) [47]

картман ©   (30.11.09 16:00) [44]

Тогда смирись с проблемами - подумаешь, медленно добавляется. Ну и фиг с ним.


 
картман ©   (2009-11-30 16:13) [48]


> clickmaker ©   (30.11.09 16:03) [46]

описался


> Игорь Шевченко ©   (30.11.09 16:04) [47]

Вы как всегда добавляете мне мотивации и учите правильно работать:)

 Как бы там ни было, избавиться от нескольких запросов к разным таблицам при вставке не получится. Никак - такова специфика.

 А если анализируемые данные добавлять в отдельную таблицу, а потом все перегонять в основную одним запросом - такой велосипед имеет право на жизнь?


> Anatoly Podgoretsky ©   (30.11.09 16:03) [45]

Почему они два разных, да еще и противоположных?)))


 
Anatoly Podgoretsky ©   (2009-11-30 16:24) [49]

> картман  (30.11.2009 16:13:48)  [48]

Ты спрашивал, сколько транзакций и получил два ответа - одна и две.
Я предложил способ это проверить.


 
b z   (2009-11-30 16:34) [50]


> данные нужно передавать xml, который я не знаю как обрабатывать
> в SQL Server.
Ну так немного изучить сей вопрос, и потом написать все 1-м (2-мя) запросам(и) если логики там не очень.


 
картман ©   (2009-11-30 16:35) [51]


> Anatoly Podgoretsky ©   (30.11.09 16:24) [49]

спасибо, очень наглядный способ


> b z   (30.11.09 16:34) [50]

согласен


 
boriskb ©   (2009-11-30 19:07) [52]

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

Все бы так спрашивали и реагировали на замечания.

картман ©  - речь не мальчика, но мужа :)


 
Galera   (2009-12-01 19:02) [53]


> boriskb ©   (30.11.09 19:07) [52]

Это точно.
Тут такое впечатление что каждый вопрошающий как призывник



Страницы: 1 2 вся ветка

Текущий архив: 2010.02.07;
Скачать: CL | DM;

Наверх




Память: 0.61 MB
Время: 0.014 c
2-1260450810
TAzimut
2009-12-10 16:13
2010.02.07
Чтение ключа реестра до инициализации форм


2-1260504031
KASioZ
2009-12-11 07:00
2010.02.07
TWebBrowser DOM


15-1259224145
brother
2009-11-26 11:29
2010.02.07
регистрация в домене .РФ


2-1260617922
Nucer
2009-12-12 14:38
2010.02.07
Универсальный список записей


15-1259624132
Kerk
2009-12-01 02:35
2010.02.07
Дживс и Вустер