Профил
Loading...
+ Нов въпрос
milen8204 avatar milen8204 302 Точки

[Homework] Databases - Performance

Здравейте колеги,

Оказа се (поне за мен), че базите данни не са толковоа скучни колкото си мислех. Също така на пръв поглед скучното домашно за перформанс се оказа доста интересно ако се "заиграеш".

Наблъскването на 10000000 записа е напръв поглед проста задача и може да го решиш със следния код:

CREATE DATABASE [Test] GO
USE Test
CREATE TABLE DateAndTex
(
    CurrentTime DATETIME NULL,
    TextInput NVARCHAR(MAX) NULL
)
GO 
INSERT INTO DateAndTex
VALUES(GETDATE(), 'ала бала');
GO 10000000

Но това отнема на моята щайга много време не изтърпях да го изчакам и да видя колко точно, ако се замислим как да подобрим перформанса ще се сетим за това, че дефоутната база е голяма 3 мб и се разшерява с 1мб. И с помоща на Google ще добавим реда: ALTER DATABASE Test MODIFY FILE
( NAME = N'Test' , SIZE = 1GB , MAXSIZE = UNLIMITED, FILEGROWTH = 100MB ) GO

До тук добре съборихме малко време :). Като помислих още малко... абе WHILE цикъла няма ли да работи по - бързо от колкото GO (н пъти). Дай да пробваме... Оказа се, че GO 10000 пъти на моята машина пълни таблицата за 7 секунди..., а като си направя while 10000 заедно с декларирането на брояча и при изчистен кеш ми ги тъпче за 4 секунди. Така че най - вероятно работи по - бързо с WHILE отколкото с GO.

Някой сеща ли се за други оптимизации?

 

Тагове:
5
Databases Basics 22/02/2015 13:43:54
crazy7 avatar crazy7 177 Точки
Best Answer

При мен когато вкарах WHILE в трансакция се оптимизира още повече. Но все пак при мен пак е доста бавно.. незнам дали е заради щайгата или заради това че реших да сменям датата на всеки запис и в крайна сметка го направих с 5 000 000 записа.

При мен изглежда така:

BEGIN TRANSACTION
WHILE(@n>0)
BEGIN
INSERT INTO Task
VALUES (@date, ('Text' + convert(nvarchar,@n)))
SET @n = @n - 1
SET @date = DATEADD(MINUTE, 1, @date)
END
COMMIT TRANSACTION

4
milen8204 avatar milen8204 302 Точки

Аз пробвам с по 10000 записа зада хвана оптимизацията.... За транзакция не се бях сетил.

0
22/02/2015 20:37:02
XmUrF avatar XmUrF 362 Точки

С вкарването на всичко в една транзакция, операцията по записването на 10 милиона реда се оптимизира в пъти. Значи по дефолт както си е всяка операция да е транзакция, за 5мин ми беше вкарало 3 милиона реда. Като го направих всичко в една транзакция, за малко над 3 минути беше готово всичко.

Недостатъкът е, че транзакшън лога расте като луд при тоя случай :).

 

П.П.

Само при мен ли няма разлика между кешираното търсене и такова без кеш? Все за едно  и също време стават.

1
23/02/2015 15:55:24
g.stoyanov avatar g.stoyanov 760 Точки

След индексирането по дата и при мен е така :)

1
XmUrF avatar XmUrF 362 Точки

Да ти кажа при мен и преди, и след индексиране все тая. Даже на втора задача където се тества точно разликата с и без индекс... при мен не успях да намеря такава. Форсвам некеширано търсене, гледам execution plan-овете, виждам, че са различни, в единия случай ползва index Scan, на другото Index Seek и пак.... Пусках го бая пъти и почти винаги беше 1:1 като време, имаше примерно едно 20-на процента където да се забави с 2-3сек най-много търсенето без индекс, ама при 10милиона записа  и търсене от около 30-на секунди, 2секунди са си в рамките на статистическата грешка.

0
g.stoyanov avatar g.stoyanov 760 Точки

Селектирай само датата без текст колоната  ;)

0
slavi.koen avatar slavi.koen 38 Точки

Мерси на crazy7 , Ей го моя бисер , 1 мил го направи за 12 секунди 10 мил за 3и половина а в студиото ми изписа 7 минути, някой да има идея защо.

DECLARE @n int = 10000000
DECLARE @date date = '10-10-2010'

BEGIN TRANSACTION
WHILE(@n>0)
BEGIN
INSERT INTO TestTable
VALUES (@date, 'Text')
SET @n = @n - 1
END

rollback tran

 

1
g.stoyanov avatar g.stoyanov 760 Точки

Опитай се да импортваш поне различна дата за всеки запис иначе си губи смисъла пълненето на тестови данни :).

0
slavi.koen avatar slavi.koen 38 Точки

За да не спамя предния ми коментар ще пиша направя нов, тъй като като гледах лекцията не бях на моя лаптоп и се сетих, че лектора направи настройки на самия сървър още преди всичко хванах се и аз и в момента в който му зададох да не е 2 петабайта а 1024 (както беше и на неговия) ми се скапа сървъра и сега немога да се вържа някой има ли идея защо :С

 

Ето какво ми изписва

0
23/02/2015 21:43:52
G.Burlakova avatar G.Burlakova 36 Точки

Можеш да опиташ от Start менюто да отвориш SQL Server Configuration Manager и в раздела SQL Server Services да провериш дали SQLEXPRESS е running - ако не е можеш да го пуснеш и да опиташ пак да се свържеш.

4
slavi.koen avatar slavi.koen 38 Точки

Да точно това направих и хукна мерси много :)

0