Thursday, May 20, 2010

Rekreiranje indeksa nad tabelama

Iako na linku http://ola.hallengren.com/Documentation.html postoje vec gotove procedure za rekreiranje i reogranizovanje indeksa, video sam da rekreiranje bas i ne radi onako kako sam hteo.
Ista stvar se moze uraditi jednostavnije, mada sporije.
Prvo cemo proveriti fragmentaciju indeksa za videti sve tabele:
select OBJECT_NAME(object_id),index_type_desc,avg_fragmentation_in_percent,page_count
from sys.dm_db_index_physical_stats(DB_ID(N'Tabela'), NULL, NULL, NULL, NULL)
order by avg_fragmentation_in_percent desc

Zatim cemo izvrsiti upit koji radi reindeksiranje za sve tabele kojima je fragmentacja veca od 1% i koji moze da traje i nekoliko desetina minuta:
DECLARE @TableName VARCHAR(255)
DECLARE @cmd NVARCHAR(500)
DECLARE TableCursor CURSOR FOR
select OBJECT_NAME(object_id) AS TableName
from sys.dm_db_index_physical_stats(DB_ID(N'Tabela'), NULL, NULL, NULL, NULL)
where avg_fragmentation_in_percent > 1
order by avg_fragmentation_in_percent desc

OPEN TableCursor

FETCH NEXT FROM TableCursor INTO @TableName
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @TableName
SET @cmd = 'ALTER INDEX ALL ON ' + @TableName + ' REBUILD WITH (FILLFACTOR = 1)'
EXEC (@cmd)
FETCH NEXT FROM TableCursor INTO @TableName
END
CLOSE TableCursor
DEALLOCATE TableCursor

Wednesday, May 12, 2010

Rekurzija u SQL-u

WITH SvaOdeljenja (OdelenjeId, NadOdelenjeId)
AS
(
SELECT OdelenjeId, NadOdelenjeId FROM Odelenje
WHERE OdelenjeId = ISNULL(@OdeljenjeId, OdelenjeId)
UNION ALL
SELECT J.OdelenjeId, M.OdelenjeId FROM Odelenje J
INNER JOIN SvaOdeljenja AS M
ON J.NadOdelenjeId = M.OdelenjeId
)
SELECT OdelenjeId FROM SvaOdeljenja
GO

Thursday, May 6, 2010

Ali ZAŠTO? (jeftina radna snaga)

Cilj svakog pojedinca i firme je da prodje što jefitnije. Takodje, cilj svakog pojedinca je da bude što skuplje plaćen za svoj posao, a firmi da što više profitira.

Ovde nema vage, niti ću ulaziti u polemiku koja su merila, ali ono sto je osnov je da NEMA relanog, ni u jednom ni u drugom smislu vrednosti, ali treba imati neke umu da nekad najjefitnije ipak može da ne valja uopšte i da vredi ništa, tj 0 (nula), čega god.

Uzimam za primer projekat koji je vredan 100.000 evra, a za koji je programer (koji je inače bio i student) mesečno plaćan 300, iste monete (naravno po srpski bez doprinosa, odmora, zdravstvenog i dr.).

Sledi .NET kod:

public void Delete(Porez porez)
{
using (SqlConnection connection = new SqlConnection(_connectionString))
using (SqlCommand command = new SqlCommand())
{
command.CommandText = "DELETE FROM PoreskaObaveza";

if (porez != null)
{
command.CommandText += " WHERE PoreskaObavezaId = @PoreskaObavezaId";
command.Parameters.Add(new SqlParameter("@PoreskaObavezaId", porez.Id));
}

connection.Open();
command.Connection = connection;

result = command.ExecuteNonQuery();
}
}

Da bude jasnije, u ovom slučaju ako se pozove metoda Delete(null) svi podaci iz tabele PoreskaObaveza ĆE BITI OBRISANI!!!

Biznismeni, da li i dalje želite da plaćate na sitno neiskusne programere za vaše skupe projekte koje predajete klijentima BEZ ikakve provere kvaliteta?!