$lang['tuto'] = "tutorials"; ?> Com afegir eficaçment una columna i actualitzar files a SQL

Com afegir eficaçment una columna i actualitzar files a SQL Server

Temp mail SuperHeros
Com afegir eficaçment una columna i actualitzar files a SQL Server
Com afegir eficaçment una columna i actualitzar files a SQL Server

Dominar les modificacions de la taula a SQL Server: una guia pas a pas

De vegades, treballar amb grans conjunts de dades pot tenir la sensació d'intentar fer malabars amb cent tasques alhora. Recentment, em vaig trobar en una situació en què necessitava afegir una columna a una taula que conté més d'un milió de files. Tot i que semblava una tasca senzilla a la superfície, ràpidament em vaig trobar amb un obstacle que molts usuaris de SQL Server s'enfronten: el temut error "Nom de columna no vàlid". 🧐

Després d'executar diversos intents d'executar les meves ordres ALTER TABLE i UPDATE junts, em vaig adonar que el problema no era amb la lògica sinó amb la seqüència de les meves consultes. SQL Server requereix que afegiu primer la columna i compromeu el canvi abans d'actualitzar-lo amb qualsevol dada. Si no ho feu, es produirà un error perquè el sistema no reconeix la columna recentment afegida en el moment en què s'executa l'actualització.

Per exemple, imagineu-vos que teniu l'encàrrec d'actualitzar la marca "IS_CURRENT" en funció d'un llindar de data específic per a una gran base de dades de clients. Si afegiu la columna i intenteu actualitzar les files en un sol script, SQL Server podria generar un error "Nom de columna no vàlid". Això es deu al fet que la columna no està completament compromesa abans que la consulta d'actualització intenti utilitzar-la. 🚀

En aquest article, repassarem la seqüència adequada per afegir la columna i actualitzar les files, garantint una execució fluida fins i tot amb grans conjunts de dades. També aprofundirem en consells per optimitzar els scripts SQL per gestionar milions de files de manera eficient, garantint que les vostres operacions de dades funcionin sense cap problema. Estigueu atents mentre explorem els passos i solucionem problemes habituals al llarg del camí!

Comandament Exemple d'ús
ALTER TABLE Aquesta ordre s'utilitza per modificar l'estructura d'una taula existent, com ara afegir columnes noves. Per exemple, `ALTER TABLE dbo.sample ADD IS_CURRENT BIT;` afegeix una nova columna anomenada `IS_CURRENT` a la taula `dbo.sample`.
UPDATE L'ordre `UPDATE` s'utilitza per modificar els registres existents en una taula. Per exemple, `UPDATE dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE
CAST A SQL Server, `CAST` s'utilitza per convertir un tipus de dades a un altre. A l'exemple, `CAST(DATEADD(mes, DATEDIFF(mes, 0, DATEADD(DAY, -60, GETDATE())), 0) AS DATA)` converteix un resultat de manipulació de data en un tipus de data.
DATEADD Aquesta funció s'utilitza per afegir un interval de temps específic a una data. Per exemple, `DATEADD(DAY, -60, GETDATE())` resta 60 dies de la data actual.
DATEDIFF La funció `DATEDIFF` calcula la diferència entre dues dates. En aquest cas, `DATEDIFF(mes, 0, GETDATE())` troba el nombre de mesos entre la data base (0, que és '1900-01-01') i la data actual.
BEGIN TRANSACTION Aquesta ordre inicia un bloc de transaccions. És essencial per garantir que s'executen diverses sentències SQL com una sola unitat, mantenint la integritat de les dades. `BEGIN TRANSACTION;` comença la transacció, i qualsevol canvi es pot confirmar o revertir.
COMMIT TRANSACTION S'utilitza per desar tots els canvis realitzats durant la transacció a la base de dades. `COMMIT TRANSACTION;` garanteix que tots els canvis fets dins del bloc `BEGIN TRANSACTION` es finalitzin i persisteixin.
UPDATE TOP Aquesta versió de l'ordre `UPDATE` s'utilitza per limitar el nombre de files afectades per l'actualització. Per exemple, `UPDATE TOP (10000) dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE
EXEC msdb.dbo.sp_add_job Aquest procediment emmagatzemat s'utilitza a SQL Server Agent per crear un treball nou. `EXEC msdb.dbo.sp_add_job @job_name = 'Actualitza el treball IS_CURRENT';` crea un treball que es pot programar per executar ordres SQL específiques automàticament.

Entendre les ordres d'SQL Server per modificar taules i actualitzar files

Quan es treballa amb SQL Server, especialment amb taules que contenen grans conjunts de dades, és crucial seguir un enfocament ordenat per alterar una taula i actualitzar-ne les files. Un escenari comú és la necessitat d'afegir una columna nova a una taula i, a continuació, actualitzar les files en funció de condicions específiques, com ara establir una bandera basada en les dates. L'script que he proporcionat demostra un enfocament senzill d'això, però destaca les ordres clau d'SQL Server que són essencials per assolir aquestes tasques de manera eficient. El ALTERA LA TAULA L'ordre s'utilitza per afegir una nova columna a la taula. Per exemple, quan executem `ALTER TABLE dbo.sample ADD IS_CURRENT BIT;`, estem modificant l'estructura de la taula per introduir una nova columna anomenada `IS_CURRENT' de tipus `BIT' (un tipus booleà, ja sigui 0 o 1).

Després d'afegir la columna, el següent pas és actualitzar les files de la taula en funció de determinades condicions. Això s'aconsegueix utilitzant el ACTUALITZACIÓ comandament. Per exemple, la consulta `UPDATE dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE

En alguns casos, especialment quan es tracta de taules grans que contenen milions de files, és important assegurar-se que les ordres SQL s'executen de manera eficient. Aquí és on funciona com DATEADD i DATEDIFF entrar en joc. Aquestes funcions us permeten manipular i comparar dates amb precisió. A la segona consulta d'actualització, `DATEADD(mes, DATEDIFF(mes, 0, DATEADD(DAY, -60, GETDATE())), 0)` resta 60 dies de la data actual (`GETDATE()`) i restableix el temps per començar el mes. Mitjançant aquestes funcions, podem definir intervals de dates més dinàmics que s'ajusten a mesura que avança el temps, garantint que les dades es mantinguin actuals encara que envelleixin.

Tanmateix, quan es combinen les sentències "ALTER TABLE" i "UPDATE" en un sol script, de vegades SQL Server pot generar l'error "Nom de columna no vàlid". Això passa perquè la columna afegida per `ALTER TABLE` pot ser que SQL Server no hagi confirmat o reconegut completament durant l'execució de consultes posteriors en el mateix lot. La solució a aquest problema és separar la instrucció `ALTER TABLE` i les ordres `UPDATE`, assegurant-se que l'alteració de la taula està totalment compromesa abans de realitzar les actualitzacions. En fer-ho, SQL Server tindrà la nova columna registrada correctament al seu esquema, permetent actualitzacions fluides de la taula. Quan manegeu grans conjunts de dades, considereu executar aquestes operacions per lots o utilitzar transaccions per garantir que el procés sigui el més eficient possible, evitant possibles temps d'espera o bloquejos. 🚀

Solució 1: Enfocament estàndard per alterar la taula i actualitzar les files

Aquesta solució implica l'enfocament estàndard que utilitza SQL Server Management Studio (SSMS), on primer afegim la columna i després actualitzem les files amb les condicions adequades. Executem la instrucció ALTER TABLE i la comprometem abans de realitzar cap actualització.

ALTER TABLE dbo.sample ADD IS_CURRENT BIT;
GO
UPDATE dbo.sample
SET IS_CURRENT = 0
WHERE LOAD_DATE < '2025-01-01';
GO
UPDATE dbo.sample
SET IS_CURRENT = 0
WHERE LOAD_DATE >= CAST(DATEADD(month, DATEDIFF(month, 0, DATEADD(DAY, -60, GETDATE())), 0) AS DATE);
GO

Solució 2: Enfocament optimitzat mitjançant la transacció per a l'atomicitat

Aquesta solució garanteix que la modificació de la taula i les actualitzacions de la fila es facin de forma atòmica. En embolicar les operacions en una transacció, assegurem la coherència i el retrocés en cas de fallada.

BEGIN TRANSACTION;
ALTER TABLE dbo.sample ADD IS_CURRENT BIT;
UPDATE dbo.sample
SET IS_CURRENT = 0
WHERE LOAD_DATE < '2025-01-01';
UPDATE dbo.sample
SET IS_CURRENT = 0
WHERE LOAD_DATE >= CAST(DATEADD(month, DATEDIFF(month, 0, DATEADD(DAY, -60, GETDATE())), 0) AS DATE);
COMMIT TRANSACTION;

Solució 3: Enfocament mitjançant el processament per lots per a grans conjunts de dades

Quan es tracta de taules que contenen més d'un milió de files, és essencial minimitzar el bloqueig i reduir la mida de la transacció. Aquesta solució processa les actualitzacions en lots més petits per millorar el rendiment i evitar temps d'espera.

DECLARE @BatchSize INT = 10000;
DECLARE @RowCount INT;
SELECT @RowCount = COUNT(*) FROM dbo.sample WHERE IS_CURRENT IS ;
WHILE @RowCount > 0
BEGIN
    UPDATE TOP (@BatchSize) dbo.sample
    SET IS_CURRENT = 0
    WHERE LOAD_DATE < '2025-01-01' AND IS_CURRENT IS ;
    SET @RowCount = @RowCount - @BatchSize;
END

Solució 4: ús de vistes indexades per a la millora del rendiment

Per millorar el rendiment en consultar grans conjunts de dades, podeu crear vistes indexades a SQL Server. Aquest enfocament aprofita les vistes materialitzades per emmagatzemar els resultats de consultes complexes, reduint la necessitat de processament repetitiu de dades.

CREATE VIEW dbo.Sample_View AS
SELECT LOAD_DATE, IS_CURRENT
FROM dbo.sample
WHERE LOAD_DATE < '2025-01-01';
GO
CREATE UNIQUE CLUSTERED INDEX idx_sample_view ON dbo.Sample_View (LOAD_DATE);
GO
UPDATE dbo.sample
SET IS_CURRENT = 0
FROM dbo.Sample_View v
WHERE dbo.sample.LOAD_DATE = v.LOAD_DATE;
GO

Solució 5: Enfocament amb les feines de l'agent SQL Server per a les actualitzacions programades

Si necessiteu actualitzar la taula de manera programada, l'Agent SQL Server es pot utilitzar per crear treballs que executin el procés d'actualització a intervals específics, evitant la necessitat d'execució manual.

EXEC msdb.dbo.sp_add_job @job_name = 'Update IS_CURRENT Job';
EXEC msdb.dbo.sp_add_jobstep @job_name = 'Update IS_CURRENT Job',
@step_name = 'Update IS_CURRENT Step',
@subsystem = 'TSQL',
@command = 'UPDATE dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE < ''2025-01-01'';',
@retry_attempts = 5, @retry_interval = 5;
EXEC msdb.dbo.sp_add_schedule @schedule_name = 'Daily Schedule',
@enabled = 1, @freq_type = 4, @freq_interval = 1, @active_start_time = 010000;
EXEC msdb.dbo.sp_attach_schedule @job_name = 'Update IS_CURRENT Job', @schedule_name = 'Daily Schedule';
EXEC msdb.dbo.sp_start_job @job_name = 'Update IS_CURRENT Job';

Explicació de les ordres SQL específiques utilitzades als scripts

Optimització de scripts d'SQL Server per a taules grans

Quan es treballa amb taules grans a SQL Server, és important tenir en compte les tècniques d'optimització del rendiment a l'hora d'alterar l'estructura de la taula i actualitzar les files existents. Un dels problemes més habituals que s'enfronten quan s'executen scripts en taules grans és el temps que triguen a completar aquestes operacions, especialment quan una taula conté més d'un milió de files. Les operacions en qüestió, com ara afegir una columna amb el ALTERA LA TAULA L'ordre i l'actualització de files en funció de condicions de data específiques poden trigar un temps important. L'optimització d'aquestes operacions és encara més important quan treballeu en bases de dades de producció on el rendiment és una prioritat. Un únic script pot bloquejar la taula durant períodes prolongats, afectant altres consultes i usuaris.

Per mitigar els problemes de rendiment, un dels millors enfocaments és dividir les tasques en passos més petits. Per exemple, en comptes d'afegir una columna i actualitzar totes les files en un sol script, penseu en executar el ALTERA LA TAULA comanda per separat, seguit de l'agrupació per lots UPDATE operacions. Si actualitzeu els registres en trossos més petits, l'script no aclapararà el servidor. Podeu aprofitar el UPDATE TOP comanda per limitar el nombre de files afectades en cada transacció. A més, també és una bona idea crear índexs a les columnes utilitzades al vostre WHERE clàusules (com ara LOAD_DATE) per accelerar el procés de cerca. Per a conjunts de dades grans, els índexs redueixen el temps que triga a filtrar les files en funció dels intervals de dates.

Una altra consideració important és l'ús de transaccions i la gestió d'errors per garantir que les operacions s'executen atòmicament. En embolicar el teu UPDATE declaracions dins a BEGIN TRANSACTION i COMMIT, us assegureu que els canvis es realitzen d'una manera segura i coherent. Si alguna part del procés falla, podeu utilitzar ROLLBACK per revertir els canvis, evitant actualitzacions parcials. A més, l'execució de scripts durant les hores de baixa intensitat o l'ús de l'agent SQL Server per programar aquestes operacions garanteix un impacte mínim en el rendiment del sistema. Amb aquestes optimitzacions, podeu executar de manera segura modificacions complexes en taules grans mantenint la integritat del sistema. 🖥️

Preguntes freqüents sobre les modificacions de la taula de SQL Server

  1. Com puc afegir una nova columna a una taula a SQL Server?
  2. Podeu afegir una columna nova amb el botó ALTER TABLE comandament. Per exemple: ALTER TABLE dbo.sample ADD IS_CURRENT BIT; afegeix una columna anomenada IS_CURRENT amb un tipus de dades BIT.
  3. Com puc actualitzar només un rang específic de files a SQL Server?
  4. Utilitza el UPDATE comanda amb a WHERE clàusula per filtrar les files. Per exemple: UPDATE dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE
  5. Per què el meu script mostra l'error "Nom de columna no vàlid"?
  6. Aquest error es produeix si el ALTER TABLE L'ordre no s'ha confirmat completament abans d'executar l' UPDATE declaració. Per evitar-ho, executeu el ALTER TABLE primer, espereu que s'afegeixi la columna i, a continuació, executeu l'ordre UPDATE consultes per separat.
  7. Com puc actualitzar les files per lots per millorar el rendiment?
  8. Utilitza el UPDATE TOP comanda per limitar el nombre de files actualitzades alhora. Per exemple: UPDATE TOP (1000) dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE
  9. Puc utilitzar una transacció per assegurar les actualitzacions atòmiques?
  10. Sí! Emboliqui el teu UPDATE declaracions en a BEGIN TRANSACTION i COMMIT bloc per garantir que totes les actualitzacions s'apliquen com una sola unitat. Si es produeix algun error, utilitzeu ROLLBACK per desfer els canvis.
  11. Quina és la millor manera d'optimitzar el rendiment de les actualitzacions grans a SQL Server?
  12. Penseu en dividir l'actualització en fragments més petits, crear índexs a les columnes rellevants i executar l'script durant les hores baixes. A més, utilitzant el UPDATE TOP El mètode ajuda a evitar problemes de bloqueig i redueix el consum de recursos.
  13. Com puc fer que les comparacions de dates siguin més dinàmiques a SQL Server?
  14. Utilitzeu funcions de data com DATEADD i DATEDIFF per realitzar càlculs de dates dinàmics. Per exemple, per establir una data fa 60 dies, utilitzeu DATEADD(DAY, -60, GETDATE()).
  15. Què he de fer si he d'actualitzar milions de files en funció d'una data?
  16. Penseu en l'ús de columnes indexades per obtenir un millor rendiment. A més, divideix l'actualització en transaccions més petites i fes-ne servir UPDATE TOP per actualitzar les files per lots.
  17. Com puc evitar problemes de bloqueig quan actualitzo una taula gran?
  18. Per evitar problemes de bloqueig, proveu de dividir les actualitzacions en lots més petits, utilitzeu transaccions per confirmar canvis per etapes i considereu executar l'actualització durant les hores de baix ús.
  19. Puc programar scripts d'actualització grans a SQL Server?
  20. Sí, l'Agent SQL Server es pot utilitzar per programar scripts d'actualització grans durant les hores baixes per minimitzar l'impacte en el rendiment del sistema. Creeu una feina a SQL Server Agent i configureu la programació desitjada.

Optimització de les modificacions de taules grans a SQL Server

Quan treballeu amb SQL Server per modificar taules grans, desglossar les vostres operacions és clau per millorar el rendiment. Afegir una columna a una taula amb milions de files i actualitzar les dades en funció de condicions específiques pot ser un repte. Això requereix l'execució estratègica d'ordres com ALTERA LA TAULA i UPDATE per garantir que els canvis s'apliquen sense aclaparar el sistema.

A més, la implementació de pràctiques recomanades, com ara actualitzacions per lots, l'ús de la indexació i l'execució de seqüències d'ordres durant les hores baixes pot ajudar a prevenir problemes com el bloqueig de taules i la degradació del rendiment. En dividir la càrrega de treball i optimitzar les consultes, podeu fer canvis a gran escala amb seguretat sense provocar temps d'inactivitat o errors com ara "Nom de columna no vàlid". 💻

Referències i fonts
  1. Detalla el procés d'alteració de taules i d'actualització de dades a SQL Server. Per obtenir més informació sobre com modificar taules i pràctiques recomanades, vegeu Documentació de Microsoft SQL Server .
  2. Proporciona informació sobre com treballar amb taules grans i optimitzar les ordres SQL, des de les quals es fa referència SQL Shack .
  3. Explica la importància de les actualitzacions condicionals basades en la data i la indexació en SQL, disponible a SQL Server Central .