trešdiena, 2013. gada 30. oktobris

In-Memory database (hekaton)

Vakar (2013-10-29) TechDay cita starpā bija lekcija par  datu bāzēm "SQL Server 2014: in Memory Database – What is It and Why We Need It ". Demonstrētie piemēri un slaidi atrodami- http://sdrv.ms/HennTechDay2013.

In memory datu bāzes ir viens no visinteresantākajiem SQL 2014 jaunumiem. Lai šos piemērus pamēģinātu, protams, vajag SQL 2014 CTP2 (kad iznāks gala versija- šobrīd vēl neviens nezin vai nesaka).

Lai nu kā, mēģinot piemērus, neaizmirstiet "SET NOCOUNT ON". Demonstrācijā miljons rindu ievietošanas lielāko daļu laika patērēja tieši ziņojuma "1 row affected" izvadīšana.
set nocount on; -- bez šīs rindas: 00:02:09, ar šo rindu 00:00:49
declare @start datetime = getdate()
declare @i int = 0
begin tran
while (@i < 1000000)
begin                                                                           
    insert Test1 values (@i, 'Product ' + cast(@i as char(6)), 10)   -- 22
    insert Test2 values (@i, 'Product ' + cast(@i as char(6)), 10)   -- 5
    insert Test3 values (@i, 'Product ' + cast(@i as char(6)), 10)   -- 7
    insert Test4 values (@i, 'Product ' + cast(@i as char(6)), 10)   -- 4
    insert Test5 values (@i, 'Product ' + cast(@i as char(6)), 10)   --
    set @i += 1
end
commit
select DATEDIFF(ms, @start, getdate())

otrdiena, 2013. gada 15. oktobris

Izpildes laika izvadīšana

Ja SQL Server Profiler darbināt slinkums, te viens īsais veids kā to vēl var izdarīt:
Declare @StartTime datetime = getdate();
select 1 -- mans vaicājums/procedūra vai vienalga kas..
Print ' Duration = ' + CONVERT(VARCHAR(30), getDate() - @StartTime, 114) + ' (hh:mi:ss:mmm)';
Piebildes
  • DateTime dēļ procedūras rezultātu precizitāte līdz 3 ms (Jauno SQL Server versiju Profiler strādā ar mikrosekundēm, lai arī GUI rāda milisekundes)
  • Uz SQL Server 2005 vai vecākām versijām piemērs ir jāpiekoriģē (sanāks vairāk rindu)
Kāpēc šis variants?
  • Slinkums vērt vaļā profiler
  • Statistics Time ir detalizētāks, taču, piemēram, procedūrā ar kursoru sanāk katras komandas laiks atsevišķi. Un man šeit tas tikai traucēja.
Ko darīt, ja ir daudzas komandas (piemēram, procedūras iekšienē) un vajag/gribas redzēt izpildes laikus procedūras izpildes laikā?

Print vietā izmantot Raiserror (Ziņojumu izvadīšana izmantojot RAISERROR), no sākuma gan ziņojums būs jāpiešķir kādam mainīgajam:
RAISERROR ('Tiks izvadīts momentāli un šī nav kļūda!', 0, 1) WITH NOWAIT;