web-dev-qa-db-fra.com

Extrait de données SQL Server avec un impact limité sur la performance

Fond:

J'ai une base de données SQL Server 2008 Enterprise Edition contenant trois tables. Les tables contiennent environ 3 millions, soit 14 millions de roupies respectivement ~ 14,5 millions de dollars.

Problème:

Je dois faire un extrait de données de la base de données à des fins de déclaration. Cela impliquera de rejoindre les trois tables et d'écrire chaque ligne à un fichier texte. Cette base de données prend actuellement le trafic de production et je tiens à limiter l'impact des performances. Cet extrait de données ne doit pas empêcher les lectures, les écrites ou les mises à jour de l'octroi du processus au cours du processus.

À partir de la recherche que j'ai faite, je pense que l'ajout de l'indice "Nolock" à la requête d'extrait de données permettra au trafic de production de se comporter normalement tout en accomplissant ma tâche principale de l'extrait de données. Je suppose que les lectures sales associées à l'indice "Nolock" seront isolées à la requête d'extrait de données.

Ai-je raison de supposer que l'indice "Nolock" sur la requête d'extrait de données n'affectera-t-il qu'une requête particulière? Cela affecte-t-il toutes les requêtes exécutées sur la base de données pendant que la requête d'extraction de données est en cours d'exécution?

Existe-t-il une meilleure approche pour atteindre mon objectif que ce que j'ai présenté ci-dessus?

2
SpeaksBinary

De nombreuses façons de pouvoir aborder ce scénario.

Je dois faire un extrait de données de la base de données à des fins de déclaration.

  • L'approche de restauration de la sauvegarde est la mieux adaptée si vous souhaitez cela sur une base peu fréquente et effectuez une déclaration statique des données.
  • Snapshot de base de données est une fonction de version d'entreprise uniquement et cela vous donne également une vue statique point à temps de la base de données.

Notez que les instantanés de base de données prennent de l'espace sur le disque et les avoir trop nombreux peuvent remplir votre espace disque, en particulier dans un environnement de production où les données sont mises à jour fréquemment. De plus, l'utilisation d'instantanés de base de données dégradera un peu les performances, car les E/S sont augmentés sur la base de données en raison du fait que les pages de données sont copiées car l'opération d'écriture est effectuée.

Reportez-vous à Snapshots de base de données Microsoft SQL Server et Synonymes Pour surmonter certaines limitations que les instantanés ont des instantanés et des contours de contournement.

  • Recherchez la réplication surtout T-REP si vous voulez faire près de Real-Time Rapport et souhaitez décharger le travail de rapport du serveur principal. T-REP vous donnera les avantages de la cohérence transactionnelle, de la faible latence, du débit élevé, des frais généraux minimaux ainsi que la capacité de filtrer des lignes.
  • Enfin, si aucune des options ne vous est réalisable, alors avec des tests appropriés Vous cherchez à modifier le niveau d'isolement de la base de données vers RCSI (isolement instantané de la lecture) . Ce sera au coût de des performances de TEMPDB .

    -- check if RCSI is enabled
    SELECT name, is_read_committed_snapshot_on
    FROM sys.databases
    WHERE name = '<dbname>'
    -- Enable RCSI
    ALTER DATABASE <dbname> SET READ_COMMITTED_SNAPSHOT ON
    

À partir de le Guide de performance de chargement de données :

RCSI empêchera essentiellement des requêtes de lecture de données à bloquer ou à être bloquées par d'autres requêtes modifiant les données dans la même table. Il s'agit d'une alternative puissante à Nolock car elle garantit une vue complète et cohérente transactionnelle des données et ne nécessite pas d'indice spécial. Bien que RCSI ciblait à l'origine des scénarios communs à OLTP Workloads, la fonctionnalité peut être un outil puissant dans les charges de travail de l'entrepôt de données ou des scénarios impliquant des opérations d'insertion en vrac à grande échelle.

RCSI est activé en tant que paramètre à l'échelle de la base de données. Lorsqu'elles sont activées, les requêtes de lecteurs n'acquistent pas les verrous partagés sur des lignes, des pages ou des tables et, par conséquent, ils ne sont pas bloqués par X ou Bu-Serrures prises par d'autres. Au lieu de cela, des lignes neuves ou modifiées dans une table portent un identifiant de version de 17 octets, et les images précédentes de toutes les lignes modifiées par une transaction (mise à jour ou supprimée) sont copiées sur TEMPDB à l'aide des mécanismes de version de ligne de SQL Server. Les requêtes de lecteur considèrent que les lignes qui ont été commises à partir du début de la requête - en ignorant les numéros de version ultérieures et en référençant TEMPDB pour des versions antérieures appropriées des lignes.

Lisez également sur: Comparaison de résultats différents avec RCSI & Load engagé de l'équipe SQL CAT.

Enfin, pour toucher Nolock Astuce, je vous suggérerais de lire

4
Kin Shah