martedì 21 giugno 2011

Top 10 Index T-SQL che gli amministratori di database di SQL Server deve sapere

Amministratori di database di SQL Server sapere che gli indici nei database sono molto simili agli indici nelle biblioteche.Un indice in un database è una struttura associata a una tabella o vista che accelera il recupero delle righe della tabella o vista.

Questo articolo elenca i top indicizzato T-SQL che sono utili per gli amministratori di database di SQL Server.Il T-SQL trattati in questo articolo sono classificati in tre categorie: definizione dell'indice o Crea, query - Query informazioni sugli indici relativi e manutenzione.

Definizione - Crea indice

1.Indice cluster

Indici cluster memorizzare i dati di righe in modo ordinato nella tabella in base alla loro valori fondamentali.Un solo indice cluster possono essere creati per ogni tabella, in quanto le righe di dati stessi possono solo essere ordinati in un unico ordine.

Un indice cluster può essere creato durante la creazione di vincoli come chiave primaria su una tabella esistente.Esempio:


ALTER TABLE [MyAddress]
ADD CONSTRAINT [PK_Address_AddressID] PRIMARY KEY CLUSTERED
(
[AddressID] ASC
) ON [PRIMARY]
GO

Un indice cluster possono anche essere creati su una colonna senza clausola di vincoli legati.Esempio:


CREATE INDEX CLUSTERED [MyAddress_id_CIX] ON [MyAddress1]
(
[ID] ASC
) ON [PRIMARY]
GO

2.Non indice cluster

In generale, gli indici non cluster vengono creati per migliorare le prestazioni delle query di uso frequente non coperte dal indice cluster.In un indice non cluster, l'ordine logico dell'indice non corrisponde l'ordine fisico delle righe memorizzate su disco.

Un indice non cluster può essere creato su una tabella esistente che copre le colonne non coperti da indice cluster.Esempio:


CREATE UNIQUE INDEX NONCLUSTERED
[NIX_col5_col2_col3_col4_col6]
ON [MyAddress]
(
[AddressLine1] ASC,
[AddressLine2] ASC,
[Città] ASC,
[StateProvinceID] ASC,
[CAP] ASC
) ON [PRIMARY]
GO

Un indice non cluster possono anche essere creati durante la creazione di vincoli sulla tabella esistente.Esempio:


ALTER TABLE [MyAddressType]
ADD CONSTRAINT [DEFF_MyAddressType_ModifiedDate]
DEFAULT (GETDATE ()) PER [ModifiedDate]
GO

3.XML Index

Un indice XML può essere creato su una colonna XML e la tabella deve avere un indice cluster sulla chiave primaria.L'indice XML può essere primaria o secondaria.

Un indice XML primario può essere creato come illustrato di seguito:


CREATE INDEX PRIMARIA idx_xCol_MyTable XML MyTable (xCol)

Un indice XML secondario può essere creato come illustrato di seguito:


CREATE TABLE MyTable (Col1 tasto INT PRIMARY XmlCol XML)
GO
- Creazione di indice primario.
CREATE XML INDEX PRIMARIA PIdx_MyTable_XmlCol
SU T (XmlCol)
GO
- Creazione di indici secondari (PATH, VALUE, PROPRIETÀ).
CREATE XML INDEX PIdx_MyTable_XmlCol_PATH ON MyTable (XmlCol)
Utilizzo di XML INDEX PIdx_MyTable_XmlCol
PER PERCORSO
GO
CREATE XML INDEX PIdx_MyTable_XmlCol_VALUE SU T (XmlCol)
Utilizzo di XML INDEX PIdx_MyTable_XmlCol
PER VALORE
GO

4.Indice spaziale

SQL Server 2008 ha fornito un particolare tipo di colonna chiamata una colonna spaziale, che è una colonna della tabella che contiene i dati di un tipo di dati spaziali, come la geometria o geografia.

Un indice spaziale può essere creato utilizzando la seguente sintassi:


CREATE TABLE MySpatialTable (id chiave primaria int, geometria geometry_col);
CREATE SIndx_MySpatialTable_geometry_col1 SPATIAL INDEX
ON MySpatialTable (geometry_col)
CON (BOUNDING_BOX = (0, 0, 500, 200));

Query dei metadati relativi Indice

5.Trova tutti gli indici

La seguente interrogazione può essere usato per interrogare tutte le tabelle, colonne e indici sul database corrente:


SELECT OBJECT_SCHEMA_NAME (BaseT. [object_id], DB_ID ()) AS [Schema],
BaseT. [Nome] AS [nome_tabella], I. [nome] AS [nome_indice], AC. [Nome] AS [nome_colonna],
I. [type_desc]
DA sys. [Tabelle] AS BaseT
INNER JOIN sys. [Indici] Ho ON BaseT. [Object_id] = I. [object_id]
INNER JOIN sys. [Index_columns] IC ON I. [object_id] = IC. [Object_id]
INNER JOIN sys. [All_columns] AC ON BaseT. [Object_id] = AC. [Object_id] e IC. [Column_id] = AC. [Column_id]
DOVE BaseT. [Is_ms_shipped] = 0 e I. [type_desc] <> 'HEAP'
ORDER BY BaseT. [Nome], I. [index_id], IC. [Key_ordinal]

6.Frammentazione

La seguente interrogazione può essere utilizzato per trovare la frammentazione indice su tutte le tabelle nel database corrente:


Object_name SELECT (IPS.object_id) AS [TableName],
SI.name AS [IndexName],
IPS.Index_type_desc,
IPS.avg_fragmentation_in_percent,
IPS.avg_fragment_size_in_pages,
IPS.avg_page_space_used_in_percent,
IPS.record_count,
IPS.ghost_record_count,
IPS.fragment_count,
IPS.avg_fragment_size_in_pages
DA sys.dm_db_index_physical_stats (DB_ID (DB_NAME ()), NULL, NULL, NULL, 'DETTAGLIATE') IPS
JOIN sys.tables ST CON (nolock) = ON IPS.object_id ST.object_id
JOIN sys.indexes SI CON (nolock) = ON IPS.object_id SI.object_id E IPS.index_id = SI.index_id
DOVE ST.is_ms_shipped = 0
ordine di IPS.avg_fragment_size_in_pages disc

7.Missing indice

SQL Server registra gli indici che si pensa che si dovrebbe creare che aiuteranno a migliorare le prestazioni delle query.La lista seguente query tutti gli indici mancanti.


SELECT sys.objects.name
(* Avg_total_user_cost avg_user_impact) * (+ user_seeks user_scans) AS Impact
, 'CREATE ix_IndexName indice non cluster' + sys.objects.name COLLATE database_default + '(' + IsNull (mid.equality_columns,'') + CASO QUANDO mid.inequality_columns IS NULL
ALLORA''
CASO QUANDO mid.equality_columns ELSE IS NULL
ALLORA''
ELSE END ',' + mid.inequality_columns FINE + ')' + CASO QUANDO mid.included_columns IS NULL
ALLORA''
ELSE 'CONTENERE (' + mid.included_columns + ')' + FINE ';' COME CreateIndexStatement
, Mid.equality_columns
, Mid.inequality_columns
, Mid.included_columns
COME DA sys.dm_db_missing_index_group_stats RPI
INNER JOIN sys.dm_db_missing_index_groups COME ON mig migs.group_handle = mig.index_group_handle
INNER JOIN sys.dm_db_missing_index_details COME ON metà mig.index_handle = mid.index_handle E mid.database_id = DB_ID ()
INNER JOIN sys.objects CON (nolock) = ON mid.OBJECT_ID sys.objects.OBJECT_ID
WHERE (migs.group_handle IN
(
SELECT TOP (500) group_handle
DA sys.dm_db_missing_index_group_stats CON (NOLOCK)
ORDER BY (avg_total_user_cost avg_user_impact *) * (+ user_seeks user_scans) DESC))
E OBJECTPROPERTY (sys.objects.OBJECT_ID, 'isusertable') = 1
ORDER BY DESC 2, 3 DESC

8.Indice inutilizzate

La seguente dichiarazione elenca tutti gli indici che non sono stati utilizzati.Ciò genera anche l'istruzione DROP INDEX che può tornare utile quando si eliminano gli indici.


SELECT o.name, nomeindice = i.name, i.index_id
, Si legge = user_seeks + + user_scans user_lookups
, Scrive = user_updates
, Righe = (SELECT SUM (p.rows) DA DOVE p.index_id sys.partitions p = s.index_id E s.object_id = p.object_id)
, CASE
QUANDO s.user_updates <1 THEN 100
ELSE 1.00 * (s.user_seeks + + s.user_scans s.user_lookups) / s.user_updates
FINE COME reads_per_write
, 'DROP INDEX' + QUOTENAME (i.name)
+ 'ON' + QUOTENAME (c.name) + '.'+ QUOTENAME (OBJECT_NAME (s.object_id)) come 'dichiarazione drop'
DA sys.dm_db_index_usage_stats s
INNER JOIN i sys.indexes ON i.index_id = s.index_id E s.object_id = i.object_id
INNER JOIN sys.objects o su s.object_id = o.object_id
INNER JOIN c sys.schemas su o.schema_id = c.schema_id
DOVE OBJECTPROPERTY (s.object_id, 'IsUserTable') = 1
E s.database_id = DB_ID ()
E i.type_desc = 'cluster'
E i.is_primary_key = 0
E i.is_unique_constraint = 0
E (SELECT SUM (p.rows) DA DOVE p.index_id sys.partitions p = s.index_id E s.object_id = p.object_id)> 10000
ORDER BY legge

Indice Maintainenance

9.Ricostruisci indice

Quando un indice viene frammentato, richiede deframmentazione.Deframmentazione può essere fatto utilizzando la clausola di ricostruire quando alterare una tabella.Questo comando è equivalente a DBREINDEX DBCC nelle versioni di SQL Server prima del 2005.Il comando che possono essere utilizzate per ricostruire l'indice è la seguente:


USE AdventureWorks2008R2;
GO
ALTER INDEX PK_Employee_BusinessEntityID ON HumanResources.Employee
RICOSTRUZIONE;
GO

Se TUTTI non è specificato nel ricostruire, non sarà ricostruire un indice non cluster.

10.REORGANIZE indice

Specifica che il livello foglia dell'indice sarà riorganizzato.Il REORGANIZE dichiarazione viene sempre eseguita in linea.Questo comando è equivalente a DBCC INDEXDEFRAG nelle versioni di SQL Server prima del 2005.


USE AdventureWorks2008R2;
GO
ALTER PK_ProductPhoto_ProductPhotoID INDEX ON Production.ProductPhoto
REORGANIZE;
GO

Corso SQL Server - Corso Hyper-V -Corso Windows Server

Certificazione Microsoft

10 suggerimenti su SQL Server che ogni sviluppatore dovrebbe conoscere

Lavorare come DBA per un ambiente corporativa per oltre 5 anni, ho visto cose che anche il meno esperto sviluppatore di SQL Server avrebbe creduto. Ad esempio, ogni sviluppatore che i programmi per SQL Server sa, o almeno dovrebbe sapere, che uno dei principali requisiti per assicurare il buon andamento della sua interrogazione è di analizzare il suo piano di esecuzione e per assicurare che si tratta di un adeguato impiego delle del tavolo della indici.
Tuttavia, quello che ho evidenziato nel mio giorno per giorno è che ancora molti sono gli sviluppatori che tanto preoccuparsi indici della tabella. Ciò che si nota, è che almeno in un primo momento, lo sviluppatore è più preoccupato di fare il suo lavoro di query e nella fornitura dei dati per l'utente.
Come risultato, nel medio termine, quello che hai è enorme dispendio di risorse del server e il ritardo così odiato nell'applicazione. E 'chiaro che esistono molti altri punti che riducono le prestazioni di un'applicazione, ad esempio: le statistiche di accesso dati obsoleti, blocca le connessioni' (il più delle volte, a causa della mancanza di indici), uso eccessivo di cursori, ecc
Ma si può essere certi: il cattivo uso di indici e anche la loro assenza è la principale causa dei problemi di prestazioni delle applicazioni SQL Server '. In questo articolo presenterò 10 suggerimenti importante che ogni sviluppatore deve sapere quando si lavora con SQL Server.
Suggerimenti su come analizzare il piano di esecuzione, i metodi per la sostituzione di cursori, l'uso di sub-query, l'uso di colonna indicizzata nella clausola WHERE, alla fine, suggerimenti che certamente vi aiuteranno a ottenere un maggiore beneficio da SQL Server.
Bene, data questa piccola introduzione, passiamo a ciò che conta.
1. Ho sempre analizzare il piano di esecuzione query.
Come ho già detto in precedenza, l'analisi del piano di esecuzione è una delle principali esigenze per garantire buone prestazioni della query. Il piano di esecuzione descrive il percorso utilizzato dai Optimizer di SQL Server per arrivare a dei dati richiesti e mostra quali operazioni fossero state eseguite nel corso della elaborazione delle query. Nel piano di esecuzione, ogni operazione è rappresentata da un'icona e una serie di frecce che uniscono queste icone. In questo modo è facile capire caratteristiche prestazionali di una query.
Per vedere piano di esecuzione di una query, immettere Query Analyzer di SQL Server 2000 o editor di query di SQL Server 2005, scrivere la query e digitare Ctrl + L o selezionare l'opzione di menu Query> Visualizza piano di esecuzione stimato nella barra dei menu.
Noterete che la query non viene effettivamente eseguito, che si verificherà solo prima della creazione del piano di esecuzione. Quando si analizza un piano di esecuzione, è necessario avere in mente che è generato in base alle statistiche esistenti per la tavola o gli indici utilizzati dalla query, quindi è molto importante che quando si analizza il piano di esecuzione l'accesso oggetti statistiche vengono aggiornate.
Se le statistiche non sono aggiornate, il piano di esecuzione verrà generato in cima dati incoerenti che possono non riflettere la realtà. Si deve sempre aggiornare le statistiche dopo aver eseguito le operazioni che mettono in moto grandi fasci di dati o la creazione e l'alterazione degli indici.
Nella figura 1 abbiamo l'esempio del piano di esecuzione di una query eseguita sulle tabelle Editori e il titolo del database Pubs di SQL Server 2000.


Figura 1. Esempio di un piano di esecuzione
Si osservi che ogni icona rappresenta una specifica operazione e le frecce indicano il percorso da seguire. La freccia rossa indica che l'analisi deve sempre essere eseguita da destra verso sinistra e dall'alto verso il basso.
Piano di esecuzione
Il piano di esecuzione descrive il percorso utilizzato da ottimizzatore di SQL Server per raggiungere i dati richiesti e mostra quali operazioni sono state eseguite lungo l'elaborazione della query.

2. Quando si analizza il piano di esecuzione, inizia la ricerca di operazioni con un alto consumo.
Durante l'analisi del piano di esecuzione, alla ricerca di iniziare le operazioni che hanno un alta percentuale di consumo. Alla ricerca di operazioni con un alto consumo consente di disporre in ordine di priorità, che problema dovrebbe essere "attaccato" per primo. Tra le operazioni che hanno un maggiore consumo e che, pertanto, deve essere prevenuto abbiamo:
· Tabella e le operazioni Index Scan;
Operazioni · che hanno frecce troppo "densa";
· Ricerche Bookmark operazioni;
· Operazioni di ordinamento.
Di tabelle e indici delle operazioni di scansione
Scansioni tavolo e scansioni Indice operazioni sono operazioni lente e che generano un elevato consumo di server. Questo perché queste sono operazioni che navigare attraverso tutte le righe della tabella o l'indice, eseguendo una pulizia sequenziale e restituendo le linee che soddisfano la clausola in cui (sempre che si utilizza una clausola where).
E 'vero che a seconda delle dimensioni della tavola, la quantità di linee di ritorno, e che la qualità della regola di filtro, Table Scan non può puntare un problema, ma soprattutto, quando si parla di grandi tavole, la Table Scan è la peggiore di tutte le operazioni e indica che la tabella non ha indice o, se lo è, non viene utilizzato in modo adeguato dalla query.
Ogni volta che trovate una scansione di tabella nel piano di esecuzione, non trattenersi dal indagarlo. L'indice di scansione e Clustered Index Scan esegue una travolgente sequenza di pagine di indice di una tabella. Dal momento che agiscono su un indice, sono migliori rispetto alla tabella di scansione, ma anche meritano un'indagine. Questo perché, in generale, se avete Index Scan, poi una grande quantità di dati viene restituito e nella maggior parte delle volte non avete bisogno di tutti questi dati.
Le scansioni, nella loro maggioranza, sono risolti attraverso la modifica o la creazione di indici appropriati. Alcune soluzioni includono anche modificare la query in modo da essere più selettivi, cioè, di utilizzare la clausola WHERE per filtrare al massimo possibile i registri restituiti.
La figura 2 mostra la rappresentazione grafica della tabella, cluster Indice di scansione e indice operatori di scansione.


Figura 2. Rappresentazione grafica della tabella, cluster Indice di scansione e indice operatori di scansione
Le operazioni che hanno frecce troppo "densa"
Le frecce non sono operatori: sono semplicemente utilizzati per unire un operatore ad un altro. Attraverso le frecce che abbiamo una stima della quantità di linee interessate dall'operazione in quanto il suo spessore è direttamente proporzionale alla quantità di linee restituito dall'operazione.
Più grande è lo spessore della freccia, maggiore è la quantità di linee coinvolte nel funzionamento o la quantità di linee passato da un operatore ad un altro. In modo per voi di vedere la quantità e la stima della numerosità delle linee interessate, è sufficiente posizionare il cursore sulla freccia.
Quando si analizza il piano di esecuzione, sempre dare una particolare attenzione alle frecce più spesso, per una freccia molto spesso può indicare un funzionamento ad alta di contenimento di I / O e, di conseguenza, nel sottosistema disco del server.Un altro punto importante è che il più delle volte, le frecce molto spesso sono associate a una scansione di tabella.
Per risolvere questo tipo di problema, dobbiamo ancora una volta fare uso della clausola WHERE per filtrare i dati restituiti e fare la freccia più sottile possibile. Se la freccia è associata a una scansione di tabella, prima di analizzare il secondo, perché probabilmente quando la soluzione del Table Scan potrete risolvere anche lo spessore della freccia. Il suggerimento è: evitare di ottenere linee più del necessario.
Nella Figura 3 abbiamo piano di esecuzione di una query (tabella Employee modificata del database Pubs) che restituisce circa 700 migliaia di record. Si osservi che la query non utilizzare la clausola where.


Figura 3. Piano di esecuzione per una query senza clausola where
Bookmark Operazioni ricerche
L'operatore di ricerca preferiti avviene quando l'indice può essere utilizzato per soddisfare il criterio di ricerca, ma non ha tutti i dati richiesti dalla query.Normalmente si verifica insieme ad un Index Scan quando la query richiede informazioni sulle colonne che non fanno parte della chiave di indice. In questo scenario, per cercare di ricerca preferiti, che ha un alta percentuale di consumo.
Nella Figura 4 si può osservare che, per ottenere i dati richiesti dalla query, SQL Server esegue un'operazione di ricerca preferiti, che consuma il 41% del tempo totale della query di esecuzione.


Figura 4. Piano di esecuzione con una ricerca Bookmark
Questo è accaduto perché il fname e le colonne lname non fanno parte della chiave di indice, che è composto solo della colonna hire_date, e con quella di SQL Server deve accedere a pagine di dati della tabella al fine di ottenere i dati relativi fname e lname.
Se il costo di ricerca preferiti operazione è troppo alta, controllare se un indice cluster o non cluster indice, composto dalle colonne ricercato, può essere utilizzato.Nella Figura 5, la creazione di un indice cluster composto dal fname e colonne lname risolto il problema.


Figura 5. Piano di esecuzione dopo la creazione di un indice cluster
Un consiglio: sempre quando è possibile evitare l'operazione di ricerca preferiti nella query. Questo perché, anche se la ricerca segnalibro che si occupa di piccole quantità di dati non è un problema, questa operazione in grande quantità di dati aumenta la velocità di I / O e di conseguenza danneggia le prestazioni delle query.
Le operazioni di smistamento
L'operazione di ordinamento ajust tutte le linee in ordine crescente o decrescente, a seconda della clausola Order By delle sue query. Operazioni di ordinamento, oltre ad utilizzare il database di sistema tempdb per una zona di stoccaggio temporaneo, anche aggiungere un grande I / O tasso per le operazioni.
Quindi, se siete abituati a vedere l'operatore Sort di frequente nelle sue query e questo operatore è un'operazione di alto consumo, provare a rimuovere la clausola menzionati. D'altra parte, se si sa che sarà sempre organizzare la vostra query da una colonna specifica, si consideri che l'indicizzazione.
Nel comando Crea indice è possibile determinare la direzione di ordinamento (ASC o DESC) di un determinato indice. Figura 6 presenta un'operazione di ordinamento consuma il 23% del tempo totale di esecuzione della query.


Figura 6. Operazione di ordinamento con il 23% dei consumi
3. Evitare l'uso di cursori e quando possibile li sostituire "mentre".
Il grande problema nell'uso dei cursori è che questi, per loro natura sono lenti e consumano una grande quantità della risorsa server. Ciò accade perché il database relazionali sono ottimizzati per lavorare con set di record.
Ogni set di record è conosciuto come set di risultati e trattato come una singola unità.Come esempio, il set di record restituiti da un'istruzione Select consiste di tutte le linee che soddisfano la condizione della clausola WHERE.
Il cursore va nella direzione opposta di questo concetto, dal momento che è stato sviluppato pensando alla linea di lavoro per riga. Cioè, lo si usa per navigare riga per riga all'interno di un set di record o un set di risultati restituito da un'istruzione Select.
Come conseguenza di questo uso, abbiamo un grande volume di pacchetti inviati attraverso la rete, il tempo di compilazione alta e analizzare il Fetch dichiarazioni, il blocco dei collegamenti a causa dei blocchi nelle tabelle o record, infine, un elevato consumo di risorse del server e basso rendimento della sua applicazione.
Di fronte a questo, alcuni metodi emersi utilizzando Transact SQL, che può essere utilizzato per sostituire l'uso dei cursori. In seguito, mi presenterà due di questi metodi.
In primo luogo, in modo che tu possa capire come il cursore è utilizzato, nel Listato 1 abbiamo un esempio molto semplice di cursore che naviga riga per riga nella tabella Authors del database Pubs, visualizzando le informazioni del id, nome e cognomecampi.
Listato 1. Esempio di utilizzo del cursore
1. DECLARE @ au_id varchar (15)
2. DECLARE @ au_fname varchar (15)
3. DECLARE @ au_lname varchar (15)
4. DECLARE CURSOR cur_authors
5. PER SELEZIONARE au_id, au_fname, au_lname FROM autori
6. Cur_authors OPEN
7. FETCH NEXT FROM cur_authors IN au_id @, @ au_fname,
@ Au_lname
8. MENTRE @ @ FETCH_STATUS = 0
9. BEGIN
10. SELECT @ au_id, au_fname @, @ au_lname
11. FETCH NEXT FROM cur_authors IN @ au_id,
@ Au_fname, @ au_lname
12. FINE
13. Cur_authors CHIUDI
14. DEALLOCATE cur_authors

Nell'esempio, dalle linee 1-3 abbiamo la dichiarazione delle variabili che verranno utilizzate per memorizzare i dati dei campi restituiti da selezionare. E 'importante osservare che queste variabili devono avere lo stesso tipo di dati delle colonne della tabella
Nelle linee 4 e 6, abbiamo la dichiarazione e l'apertura del cursore stesso. Si osservi che il set di risultati generato all'apertura del cursore include tutti i record e solo le colonne au_id, au_fname e au_lname della tabella autori. In linea 7, Fetch successiva si fa carico di prendere il record successivo e compilando le variabili con i dati ottenuti dal record.
Dalle linee da 8 a 12, abbiamo il ciclo che continuerà a essere giustiziato per tutto il tempo in quanto vi sono ancora record (@ @ FETCH_STATUS = 0). In pratica, la linea 8 verifica se è ancora record, se ci sono, in linea 10 "stampe" il contenuto delle variabili sullo schermo e nella riga 11, prende il record successivo di nuovo e riempie le variabili con i dati ottenuti in il record.
Nella riga 13, abbiamo la chiusura del cursore e alla riga 14 il rilascio della memoria utilizzata dal cursore si svolge. Dato l'esempio, vedremo due metodi che possono essere utilizzati per eseguire la stessa operazione, ma senza l'uso di cursori.
Il primo metodo, che viene presentato nel Listato 2, si avvale di tabella temporanea e la clausola di Top. Con questo metodo, si crea uno snapshot delle informazioni desiderate gettare il risultato di selezionare in una tabella temporanea.

Listato 2. Metodo per sostituire il cursore con tabella temporanea
1. DECLARE @ au_id char (11)
2. SELECT au_id, au_fname, au_lname
IN # tb_tmp_authors FROM autori
3. SELECT TOP = 1 @ au_id au_id FROM # tb_tmp_authors
4. MENTRE @ @ ROWCOUNT <> 0
5. BEGIN
6. SELECT au_id, au_fname, au_lname
8. DA DOVE # tb_tmp_authors au_id = @ au_id
9. DELETE # tb_tmp_authors DOVE au_id = @ au_id
10. SELECT TOP = 1 @ au_id au_id FROM # tb_tmp_authors
11. FINE
12. DROP TABLE # tb_tmp_authors

Nel metodo del Listato 2, riga 1 dichiara semplicemente una variabile per memorizzare il contenuto della colonna au_id. In linea 2, abbiamo la stessa Select che è stato utilizzato nel Listing 1 dichiarazione del cursore. La differenza è qui che invece di buttare il risultato della Selezione in un cursore, questo risultato è stato gettato in una tabella temporanea denominata # tb_tmp_authors.
Dopo il carico tabella temporanea, possiamo lavorare con esso a che fare con la linea registri per riga. Si osservi che nella riga 3 la clausola TOP viene utilizzata con valore 1. La Top 1 clausola assicura che solo il primo record della tabella temporanea sarà restituito da selezionare e di conseguenza avremo il valore della colonna au_id dal primo record memorizzato nella variabile @ au_id.
Nella riga 4, mentre il comando è usato per fare la Loop e per controllare il valore della variabile @ @ conteggio delle righe globale. Si tratta di una variabile di sistema che viene automaticamente riempito con la quantità di record interessati dalla Seleziona eseguito in linea 3. Dal momento che usiamo nella Top 1 nel Select, questo effetto sarà sempre un record alla volta e la variabile @ @ conteggio delle righe sarà sempre 1 fino a quando la tabella temporanea è vuota.
Da righe da 6 a 10 sono poi eseguiti tutti i trattamenti desiderati, in questo caso abbiamo solo stampare i dati nella schermata, e osservare che, in linea 9 il record della tabella temporanea au_id cui è stato ottenuto nella Selezione della linea 3 è esclusa .
Questo farà in modo che il secondo record della tabella temporanea diventa il primo.Nella riga 10 la stessa Selezione della linea 3 è ancora una volta eseguito prendendo il valore dal primo record del au_id colonna. E così il processo continuerà fino a quando la tabella temporanea è vuota e con questo @ @ conteggio delle righe è uguale a 0. Alla fine del trattamento, la linea 12 esclude la tabella temporanea.
Il secondo metodo, che viene presentato nel Listato 3, non usa una tabella temporanea, ma usa il Min () per prendere un record alla volta dalla tabella authors.

Lista 3. Metodo per sostituire il cursore con il Min () funzione
1. DECLARE @ au_id char (11)
2. SELECT @ au_id = min (au_id) di autori
3. MENTRE @ au_id non è nullo
4. BEGIN
5. SELECT au_id, au_fname, au_lname FROM autori
6. DOVE au_id = @ au_id
7. SELECT @ au_id = min (au_id) FROM autori
DOVE au_id> @ au_id
8. FINE

Dato che il metodo utilizza la funzione min () è necessario garantire che la verifica è fatta più di una colonna che è single e mezzaluna. Questo garantirà che le nuove linee avranno sempre un identificatore più grande l'identificativo della linea in fase di elaborazione.
In questo esempio, nella linea 1 abbiamo la dichiarazione della variabile che memorizza il contenuto della colonna au_id. In linea 2, la Selezione ottiene dalla tabella authors il record che ha il valore minore per la colonna au_id e memorizza questo valore nella variabile @ au_id.
Nella riga 3, mentre il comando è usato per fare la Loop e per verificare se la variabile @ au_id non è nullo, perché quando si è nullo vuol dire che nessun record di più di essere trattati esistenti e con questo lasciamo il Loop. Essendo la variabile @ au_id diverso da quello nullo, abbiamo poi entrare nel loop e da linee da 5 a 7 abbiamo eseguire l'elaborazione desiderata.
In questo caso abbiamo solo stampare i dati sullo schermo e in linea 7 si ottiene un nuovo record in cui il valore della colonna au_id è maggiore del valore già memorizzato nella variabile @ au_id. E così l'elaborazione continua fino a raggiungere l'ultimo record della tabella.
Come abbiamo visto, non sempre abbiamo bisogno di usare il cursore per elaborare i nostri dati all'interno del server SQL. Se si esegue i tre esempi citati qui vedrete che il risultato sarà lo stesso.
4. Sostituire l'operatore UNION da UNION ALL, quando possibile.
Quando si utilizza l'operatore UNION per combinare il risultato di due query, tenere presente che questa esegue una SELECT DISTINCT nel risultato finale per rimuovere eventuali record duplicati, anche se non ci sono record duplicati.
Prima di questo, il consiglio è che non avendo la possibilità di record duplicati o se ci sono problemi per l'applicazione che il risultato finale presenta duplicazioni, utilizzare l'operatore UNION ALL. Dato che questo operatore non esegue SELECT DISTINCT nel risultato finale, utilizza meno risorse di SQL Server e, quindi, migliora le prestazioni delle query.
In figura 7 abbiamo due query che eseguono la stessa operazione sulla tabella Ordini del database Northwind, uno utilizzando l'operatore e l'altro dell'Unione, l'Unione Tutti.
Si osservi che la query con Unione Tutti mostrerà tutti i record compresi i duplicati.Ma questa consuma meno delle risorse del server per non eseguire la SELECT DISTINCT nel risultato finale.


Figura 7. Esempio di query utilizzando l'Unione e l'Unione Tutti gli operatori
5. Sostituire sub-query join.
Molte istruzioni Transact SQL che fanno uso di sub-query può essere riscritta utilizzando join. E 'vero che molte delle volte non avrete benefici prestazioni quando si usano sub-query o join, ma in alcuni casi in cui, per esempio, l'esistenza di un valore deve essere verificato, l'uso di join produrranno risultati migliori.
Così è, se possibile cercare di sostituire il sub-query di join. Nel Listato 4 abbiamo due istruzioni Seleziona essendo uno scritto con sub-query e l'altra con unirsi.

Listato 4. Seleziona le istruzioni tramite sub-query e unisciti
- L'istruzione SELECT che utilizza sub-query
SELECT ProductID, IDFornitore, ProductName
FROM Prodotti WHERE IDFornitore IN
(SELECT IDFornitore da fornitori
WHERE (paese = 'Brasile'))

- L'istruzione SELECT che utilizza unirsi
SELECT prd.ProductID, prd.SupplierID, prd.ProductName
DA Prodotti PRD INNER JOIN Fornitori sup
ON prd.SupplierID = sup.SupplierID
DOVE sup.country = 'Brasile'

Osservare che quando viene eseguito sia produrrà lo stesso risultato: una lista con tutti i prodotti dei fornitori in Brasile.
6. Nella clausola WHERE non utilizzare colonna indicizzata nelle funzioni.
Il modo più semplice per fare una colonna non in grado di essere indicizzato, è di mettere questa colonna in una funzione! In SQL Server, l'uso della funzione di sottostringa nella clausola WHERE è ogni comune, tuttavia, quello che pochissimi sanno è che quando si inserisce una colonna indicizzata all'interno di una funzione, di SQL Server non finisce con l'indice in modo conveniente e molte volte non ha nemmeno utilizzarla affatto.
In queste situazioni, la cosa migliore da fare è spostare la funzione dall'altra parte dell'equazione nella clausola in cui, se possibile, o non lo usano affatto. Nella Figura 8 abbiamo un esempio di come l'uso della funzione di colonna indicizzata nella clausola WHERE può impedire l'SQL Server di utilizzare l'indice corretto.


Figura 8. Esempio di query utilizzando la funzione SUBSTRING e il comando LIKE
Le due interrogazioni presentate in Figura 8 hanno come obiettivo di ottenere tutti i dipendenti il ​​cui nome inizia con i caratteri "Ma". Si osservi che nella prima query la funzione sottostringa viene utilizzato per rompere la colonna fname prendendo solo i primi due caratteri e confrontandole con la stringa "Ma".
Dal momento che non SQL Server sa quale sarà il carattere da ricercare, il processo viene eseguito per ciascuna delle linee della tabella, finisce per l'esecuzione di un Index Scan, spazzando tutte le pagine di indice in modo sequenziale.
Nella seconda query la funzione è stata sottratta dal comando Like. In questo caso, dal momento che la colonna indicizzata non è interessato, di SQL Server riesce a utilizzare l'indice in modo adeguato l'esecuzione di un Index Seek nelle pagine di indice.
7. Quando è possibile cerca di utilizzare gli operatori che sono in grado di essere indicizzato.
Simile al problema dell'uso di colonne indicizzate nelle funzioni, c'è anche un insieme di operatori che, quando utilizzati, possono evitare che il SQL Server di utilizzare l'indice in modo conveniente. Questi sono conosciuti come operatori in grado di essere indicizzato.
Gli operatori positivi sono generalmente in grado di essere indicizzati: =,>,> =, <, <=, Tra e Come quando utilizzati nel: Come maniera '% parola'. Gli operatori negativi sono generalmente incapaci di essere indicizzati: <>, Non, non esiste, non in, Non Mi Piace Come e quando viene utilizzato in: Come maniera 'parola%'.
8. Quando ha bisogno di ottenere una quantità di record forma un tavolo, evitare di utilizzare il Select Count (*).
Ogni volta che abbiamo bisogno di ottenere la quantità di record da una tabella, il primo T-SQL istruzione che viene in mente è: "Select Count (*) Dalla tabella".
Il problema con questa istruzione è che il più delle volte svolge una tabella o Index Scan per riportare la quantità di record nella tabella. Per tabelle di grandi dimensioni questo è un sinonimo di query lenta e un elevato consumo di risorse del server.
Un modo più semplice per eseguire la stessa operazione senza causare impatto utilizzando la tabella dei sistemi chiamati sysindexes. Questa tabella ha una colonna chiamata righe che memorizza la quantità totale di record per ogni tabella del database.
Essendo così, quando è possibile usare il T-SQL istruzione che segue, per ottenere la quantità di record nella tabella.

Selezionare le righe da sysindexes
WHERE id = OBJECT_ID ('nome_tabella') E indid <2

Poiché la tabella sysindexes non ha una colonna con il nome delle tabelle, ma solo i loro identificativi, l'istruzione utilizza il OBJECT_ID () in modo che il server SQL può, con il nome della tabella, identificare il suo id rispettivi all'interno del sysindexestavolo.
9. Utilizzare sempre il SET NOCOUNT ON all'interno di stored procedure.
Si tratta di una "best practice" che io uso raramente vedere gli sviluppatori.Sicuramente durante l'esecuzione di istruzioni T-SQL, come Select, Insert, Update e Delete è necessario aver già visto il "nn fila (s) affected" facendo parte del messaggio del risultato della query.
Forse non lo so, ma questo messaggio apparentemente innocuo può generare un grande impatto nello svolgimento della vostra stored procedure. Questo perché quando si esegue un SP che ha diverse istruzioni T-SQL, questo messaggio viene inviato al client per ogni istruzione all'interno del PS, che finisce per generare un inutile traffico di rete.
L'opzione SET NOCOUNT disabilita l'invio di questi messaggi. Con questo, la SP che possiedono diversi T-SQL istruzioni, può presentare un significativo miglioramento delle prestazioni una volta che il traffico di rete sarà notevolmente ridotto.
10. Durante la creazione di indice composto, per le colonne dell'indice, in modo da soddisfare la clausola Where della maggior parte delle vostre domande.
Una cosa che deve sempre essere tenuto presente quando si lavora con composti (indici con due o più colonne della tabella), è che l'indice verrà utilizzato soltanto dalla query se la prima colonna della chiave di un indice composto è specificata nel la clausola WHERE.
Pertanto, quando si lavora con indice composto, l'ordine delle colonne dell'indice è molto importante. Per farvi capire meglio, passiamo ad un esempio: supponiamo che il database ha una tabella chiamata tb_employee e che questa tabella ha un indice composto dal cognome colonne, first_name in questo ordine rispettivo.Quando si analizza il piano di esecuzione di una query che ha la clausola WHERE come:

dove cognome = 'Pinheiro'

Vedrete che l'indice è stato adeguatamente utilizzato dallo Strumento per ottimizzare la consultazione di SQL Server, ma quando si analizza il piano da una consultazione che ha la clausola WHERE come:

dove fist_name = 'Nilton'

Vedrete che l'indice non è stato utilizzato. Pertanto, quando si utilizza indici composti, assicurarsi che la clausola in cui si è sempre la prima colonna dell'indice.
Conclusione
Come abbiamo visto, innumerevoli sono le risorse e le tecniche che possiamo utilizzare per estrarre un profitto migliore di SQL Server. In generale, quando lavoriamo con i problemi di prestazioni in query, uno dei punti fondamentali è quello di assicurare che le tabelle sono indici e soprattutto garantire che le query stanno facendo uso corretto di questi indici.
L'analisi del piano di esecuzione può aiutare in questo. Un altro punto importante è quello di garantire che le statistiche siano sempre aggiornati. Ricordate che Optimizer di SQL Server utilizza le statistiche di prendere le sue decisioni. Saluti e si vede la prossima volta.

venerdì 17 giugno 2011

Desktop Virtualization - Una sola taglia non è adatta per tutti

di technet

L'abbiamo sentito dai nostri clienti ogni giorno: oggi forza lavoro sempre più mobile vuole senza soluzione di continuità, affidabile, in qualsiasi momento l'accesso alle applicazioni e dati su una serie crescente di dispositivi quali computer portatili, dispositivi mobili e PC di casa. Come rispondere e affrontare queste esigenze utente, è la priorità è quella di mantenere la conformità e gestire l'ambiente aziendale in maniera responsabile ed efficiente.

Sono finiti i giorni in cui professionisti IT potrebbe prendere in considerazione la parte PC delle loro infrastrutture IT, almeno, di essere abbastanza semplice da sostenere. E 'sempre più difficile da ricordare quei tempi, quando le popolazioni business potrebbe essere divisa nettamente in due gruppi: dipendenti a tempo pieno che ha lavorato principalmente presso gli uffici sui computer desktop e un insieme ridotto di utenti che generalmente funzionato da lontano sui portatili.

Oggi, è un mondo molto diverso: le aziende sono sempre più globali, che operano su 24 x 7 orari e affidamento sull'aiuto in outsourcing quasi quanto in lavoratori a tempo pieno. Il risultato è un mashup utente finale dei lavoratori tradizionali desktop office e road warrior, telelavoratori che dividono il loro tempo tra la sede e l'ufficio casa e il contract personale ubicato in loco e offshore. I lavoratori potrebbero utilizzare i computer, alcuni più riusciti, alcuni bisogni di accesso non-e la loro applicazione e dei dati sono più complicate.

La crescente varietà di scenari utente che sono stati creati da nuove esigenze di business richiede che i responsabili IT di ottimizzare e semplificare l'infrastruttura desktop attraverso la virtualizzazione. Ma la virtualizzazione del desktop non è una sola soluzione per tutti. Piuttosto, è un insieme di tecnologie volte a risolvere le problematiche di business che sono stati portati da un infrastruttura client più complesso di elaborazione.

Professionisti IT bisogno di poter scegliere se si vuole sostenere in modo efficiente ed efficace base di clienti eterogenei e lontani di oggi. Avete bisogno di affrontare l'aumento dei costi totali di proprietà desktop che vanno di pari passo con la necessità di sostenere una diversa popolazione di utenti finali? Avete bisogno di essere più agile per rispondere alle nuove opportunità e sviluppi? Con ogni probabilità, la maggior parte IT Pro probabilmente prendere in considerazione entrambi i requisiti e implementare le soluzioni che siano appropriate per ogni scenario.

Microsoft Desktop Virtualization fornisce una suite completa di soluzioni che permette ad un'azienda di fornire i propri dipendenti la flessibilità di lavorare in tutto il mondo su una serie di dispositivi, semplificando la conformità e la gestione attraverso una infrastruttura centralizzata e unificata.

Qui ci sono un paio di esempi per lo più esplorati dai clienti:

Con Microsoft Application Virtualization (App-V), IT in grado di trasformare le applicazioni tradizionali in servizi gestiti centralmente che sono disponibili su qualsiasi PC autorizzato in qualsiasi momento. Gli utenti non devono attendere per le applicazioni da installare e non c'è bisogno di riavviare il computer per iniziare a utilizzare le nuove applicazioni. IT possono utilizzare App-V integrata nella gestione di applicazioni tempo reale agli utenti su richiesta. E 'facile cedere, o andare in pensione, le applicazioni agli utenti che utilizzano i gruppi di Active Directory.

App-V si integra anche con System Center Configuration Manager, per cui le aziende possono gestire le applicazioni virtuali e tradizionali, con sistema operativo implementazione, hardware e software per la sicurezza delle scorte, gestione delle patch e degli endpoint con uno strumento di gestione.

App-V è disponibile attraverso il Microsoft Desktop Optimization Pack per Software Assurance. Non sono sicuro se App-V è per la vostra organizzazione? Check out post sul blog Karri Alexion-Tiernan sul Windows per il vostro business blog per saperne di più.

Remote Desktop Services (RDS) Virtualizzazione Session è un desktop e la consegna modello di applicazione che fornisce agli utenti l'accesso ad applicazioni, dati e desktop centralizzati nei data center. RDS consente l'accesso flessibile a Windows per i lavoratori a prescindere dalla loro ubicazione o dispositivo, dando agli utenti l'accesso alle applicazioni e desktop da una pagina web, un portale SharePoint, un desktop locale o su Internet. Se si desidera utilizzare la funzionalità RDS del software Windows Server, una licenza di accesso client RDS (CAL) è necessario (precedentemente noto come Servizi Terminal). Una CAL RDS è necessaria per ogni utente o dispositivo. App-V grandi opere in collaborazione con RDS, e App-V per Remote Desktop Services è incluso nel CAL RDS!

Virtual Desktop Infrastructure (VDI) è un'alternativa modello di distribuzione desktop che consente agli utenti di accedere ai desktop sicuro e gestito centralmente in esecuzione all'interno del datacenter. Le organizzazioni possono accelerare ed estendere la distribuzione di desktop e applicazioni a una vasta gamma di dispositivi client, compresi i client su cui il sistema operativo non può eseguire in modo nativo, rendendo gli utenti finali possono più produttivi da qualsiasi luogo. Per le licenze delle infrastrutture VDI, i clienti hanno essenzialmente due opzioni: possono licenza con componenti di infrastruttura VDI con una CAL RDS, mentre i componenti di gestione delle licenze VDI separatamente. Oppure, possono scegliere una delle due offerte, il nuovo Volume License Microsoft Virtual Desktop Infrastructure Standard Suite e Microsoft Virtual Desktop Infrastructure Suite Premium.

Virtual Desktop Access (VDA) VDA Windows è progettato per aiutare i clienti virtuali copie licenza di Windows. Si tratta di un dispositivo basato abbonamento, il che significa che il numero totale di licenze è pari al numero totale di dispositivi che accedono al ambiente virtuale (cioè client Windows in esecuzione su un server o Datacenter). I clienti possono ottenere VDA tramite un dispositivo basato abbonamento o attaccando Software Assurance (SA).

Per usufruire di virtualizzazione del desktop, le organizzazioni dovrebbero cominciare con l'individuare i problemi di business che stanno cercando di risolvere e poi a comprendere come le diverse soluzioni di virtualizzazione desktop può soddisfare le loro specifiche esigenze aziendali. Una dimensione non va bene per tutti. Microsoft Desktop Virtualization è unico in quanto fornisce soluzioni in tutto lo stack intero desktop.

Per gli scenari in cui le organizzazioni vogliono fornire un'esperienza personalizzata di Windows su qualsiasi PC collegato o connesso aziendali e IT sta cercando di semplificare la gestione e accelerare l'implementazione di applicazioni aziendali agli utenti su richiesta, le organizzazioni devono iniziare con l'adozione di Microsoft App-V e la virtualizzazione dello Stato utente .

La scelta di un sistema operativo la tecnologia di virtualizzazione dipende dallo scenario e caso d'uso che l'organizzazione sta cercando di affrontare. Microsoft consiglia di VDI e virtualizzazione sessione RDS per gli scenari in cui consentire un accesso flessibile a Windows da più dispositivi, la gestione centralizzata del desktop, e la sicurezza e la compliance sono i requisiti di business primario. Le organizzazioni possono utilizzare entrambe le tecnologie per l'utente-dispositivo di flessibilità e consentire un accesso sicuro da non gestito-dispositivi. VDI è più utile quando gli utenti devono alto livello di personalizzazione e sistema di isolamento operativo, come nel caso dei medici o consulenti finanziari e che la virtualizzazione sessione RDS in grado di fornire agli utenti l'accesso a applicazioni singole o limitate LOB centrale ha ospitato con più scalabilità, come nel caso di agenti di call center, assicurazioni, ecc agenti Quindi, VDI e virtualizzazione sessione RDS sono buone per ogni azienda, ma non necessariamente per ogni desktop.

Così, quando si deve prendere in considerazione la virtualizzazione del desktop?Forse per tutti voi pensando, o attualmente migrazione a Windows 7, controlla Karri blog per ulteriori informazioni.
Vuoi vedere chi sta utilizzando la virtualizzazione dei desktop nel loro IT? Scopri il blog di Windows per maggiori informazioni.

Infine, si è pronti per iniziare a implementare la virtualizzazione del desktop? Check out blog Stephen Rose, per maggiori dettagli. Sappiamo che hai domande e ci piacerebbe sentirli. Facci sapere come possiamo aiutarvi!

Fake Microsoft Security Essentials a piede libero.Non lasciatevi ingannare!

La settimana scorsa, abbiamo visto il riemergere di un nuovo trojan che si sta mascherando come Microsoft a costo zero antimalware programma Microsoft Security Essentials .Questo impostore è conosciuto nel mondo della tecnica di combattimento antimalware come " Win32/FakePAV ".FakePAV è una canaglia che visualizza i messaggi che imitano Microsoft Security Essentials relazioni minaccia al fine di indurre l'utente a scaricare e pagare per uno scanner di sicurezza canaglia.La canaglia termina con insistenza a numerosi processi come Editor del Registro di Windows, Internet Explorer, Windows Ripristina e altre utility e applicazioni.

Questo software falso è distribuito da una tattica comunemente descritto come un " drive-by download "e si presenta come una Hotfix.exe o come file mstsc.exe.Inoltre, dopo il falso report Microsoft Security Essentials non è possibile pulire l'infezione malware affermato, offre l'installazione rogue antimalware aggiuntivi (con nomi come AntiSpySafeguard, Kit Maggiore della Difesa, Protezione picco, rilevatore di Pest e Croce Rossa).Infine, questo programma falso cercherà di spaventarvi ad acquistare un prodotto.


Prima di arrivare alla visione dettagliata di come funziona questo trojan, vogliamo che il messaggio sia molto chiaro: . Questo software è un falso Non fatevi ingannare da questa truffa .Questo malware può potenzialmente causare danno ai consumatori e piccoli business proprietari.Microsoft Security Essentials può essere scaricato e utilizzato senza alcun costo da parte degli utenti che eseguono Windows genuino . Quindi niente imitando Microsoft Security Essentials, ma per chiedere qualsiasi tipo di pagamento è chiaro fino a nulla di buono.

Se non hai già aggiornato il vostro software di sicurezza si prega di farlo.Rendere sicuro il vostro software di sicurezza è up-to-data e ha le definizioni più recenti è il modo migliore per prevenire le infezioni.E ora su un sguardo dettagliato alla FakePAV.Mentre diverse distribuzioni FakePAV hanno carichi utili diversi, ecco come quella attuale imitando Microsoft Security Essentials opere:


1.Esso modifica il sistema in modo che venga eseguito all'avvio di Windows

2.Quando si va ad eseguire qualcosa che sta guardando per, si apre la finestra di avviso che rivendicano il programma è infetto e blocca l'esecuzione.

3.Si può espandere per "ulteriori dettagli"
4.Se si fa clic su "computer pulito" o "Applica azioni", che simula un tentativo di pulire l'infezione ha affermato
5.Ti verrà fornito un 'in grado di pulire' attenti e essere istruiti a fare clic su 'Scan Online'6.Cliccando su questo, un elenco di programmi antimalware appare, tra cui diversi strumenti di rimozione falsi, e avresti bisogno di fare clic su Avvia scansione
7.Una volta che la scansione completa simulato, sarà rivendicare una soluzione è stata trovata e prodotti lista che puo 'pulire' il sistema (i prodotti elencati sono strumenti di rimozione falsi).8.Facendo clic su 'install gratis' su uno di quei download verrà scaricato il suo programma di installazione e avviare l'installazione diSe ritieni che il tuo computer è stato infettato, ti consigliamo di utilizzare Microsoft Security Essentials per controllare il vostro PC alla ricerca di malware e di contribuire a rimuovere dal vostro sistema.

È anche possibile scoprire come ottenere assistenza correlata al virus senza alcun costo da Microsoft qui:http://www.microsoft.com/protect/support/default.mspx .Per ulteriori informazioni su questo FakePAV si prega di visitare il nostro ingresso al enciclopedia % http://www.microsoft.com/security/portal/Threat/Encyclopedia/Entry.aspx?Name=Rogue 3aWin32% 2fFakePAV .Esso contiene un sacco di informazioni che possono aiutare a rispondere a domande su questo canaglia.E ricordate: Microsoft non richiede alcun pagamento per Microsoft Security Essentials .È possibile trovare la versione legittimi di Microsoft Security Essentials a http://www.microsoft.com/security_essentials .

Corso SQL Server - Corso Hyper-V -Corso Windows Server

Certificazione Microsoft