SQL Server'da Etkili Bir Sütun Ekleme ve Satırları Güncelleştirme

Temp mail SuperHeros
SQL Server'da Etkili Bir Sütun Ekleme ve Satırları Güncelleştirme
SQL Server'da Etkili Bir Sütun Ekleme ve Satırları Güncelleştirme

SQL Server'da Tablo Değişikliklerinde Mastering: Adım Adım Kılavuz

Bazen büyük veri kümeleriyle çalışmak, yüzlerce görevi aynı anda yürütmeye çalışmak gibi gelebilir. Son zamanlarda kendimi bir milyonun üzerinde satır içeren bir tabloya sütun eklemem gereken bir durumda buldum. Bu ilk bakışta basit bir görev gibi görünse de, birçok SQL Server kullanıcısının karşılaştığı bir engelle karşılaştım: korkunç "Geçersiz sütun adı" hatası. 🧐

ALTER TABLE ve UPDATE komutlarımı birlikte çalıştırmak için birkaç deneme yaptıktan sonra sorunun mantıkta değil, sorgularımın dizilişinde olduğunu fark ettim. SQL Server, önce sütunu eklemenizi ve herhangi bir veriyle güncellemeden önce bu değişikliği uygulamanızı gerektirir. Bunun yapılmaması hatayla sonuçlanır çünkü güncelleme yürütüldüğü sırada sistem yeni eklenen sütunu tanımaz.

Örneğin, büyük bir müşteri veritabanı için belirli bir tarih eşiğine göre "IS_CURRENT" işaretini güncellemekle görevlendirildiğinizi düşünün. Sütunu eklerseniz ve satırları tek bir komut dosyasında güncellemeye çalışırsanız, SQL Server "Geçersiz sütun adı" hatası verebilir. Bunun nedeni, güncelleme sorgusu onu kullanmaya çalışmadan önce sütunun tam olarak kaydedilmemiş olmasıdır. 🚀

Bu makalede, sütun eklemek ve satırları güncellemek için doğru sırayı inceleyeceğiz, böylece büyük veri kümelerinde bile sorunsuz bir yürütme sağlanacak. Ayrıca, veri operasyonlarınızın sorunsuz çalışmasını sağlamak için SQL komut dosyalarını milyonlarca satırı verimli bir şekilde işleyecek şekilde optimize etmeye yönelik ipuçlarına da değineceğiz. Adımları keşfederken ve yol boyunca sık karşılaşılan sorunları giderirken bizi takip etmeye devam edin!

Emretmek Kullanım Örneği
ALTER TABLE Bu komut, yeni sütunlar eklemek gibi mevcut bir tablonun yapısını değiştirmek için kullanılır. Örneğin, 'ALTER TABLE dbo.sample ADD IS_CURRENT BIT;', 'dbo.sample' tablosuna 'IS_CURRENT' adlı yeni bir sütun ekler.
UPDATE 'UPDATE' komutu bir tablodaki mevcut kayıtları değiştirmek için kullanılır. Örneğin, `UPDATE dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE
CAST SQL Server'da 'CAST' bir veri türünü diğerine dönüştürmek için kullanılır. Örnekte, 'CAST(DATEADD(ay, DATEDIFF(ay, 0, DATEADD(DAY, -60, GETDATE()))), 0) AS DATE)`, bir tarih değiştirme sonucunu tarih türüne dönüştürür.
DATEADD Bu işlev bir tarihe belirli bir zaman aralığı eklemek için kullanılır. Örneğin, 'DATEADD(DAY, -60, GETDATE())' geçerli tarihten 60 gün çıkarır.
DATEDIFF 'DATEDIFF' işlevi iki tarih arasındaki farkı hesaplar. Bu durumda, 'DATEDIFF(ay, 0, GETDATE())' temel tarih (0, yani '1900-01-01') ile geçerli tarih arasındaki ay sayısını bulur.
BEGIN TRANSACTION Bu komut bir işlem bloğunu başlatır. Veri bütünlüğünü koruyarak birden fazla SQL ifadesinin tek bir birim olarak yürütülmesini sağlamak için gereklidir. `BEGIN TRANSACTION;` işlemi başlatır ve herhangi bir değişiklik gerçekleştirilebilir veya geri alınabilir.
COMMIT TRANSACTION İşlem sırasında yapılan tüm değişiklikleri veritabanına kaydetmek için kullanılır. `COMMIT TRANSACTION;`, `BEGIN TRANSACTION` bloğu içerisinde yapılan tüm değişikliklerin sonlandırılmasını ve kalıcı olmasını sağlar.
UPDATE TOP 'UPDATE' komutunun bu sürümü, güncellemeden etkilenen satır sayısını sınırlamak için kullanılır. Örneğin, `UPDATE TOP (10000) dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE
EXEC msdb.dbo.sp_add_job Bu saklı prosedür, SQL Server Agent'ta yeni bir iş oluşturmak için kullanılır. `EXEC msdb.dbo.sp_add_job @job_name = 'IS_CURRENT İşini Güncelle';` belirli SQL komutlarını otomatik olarak çalıştırmak üzere programlanabilen bir iş oluşturur.

Tabloları Değiştirmek ve Satırları Güncellemek için SQL Server Komutlarını Anlamak

SQL Server ile, özellikle de büyük veri kümeleri içeren tablolarla çalışırken, bir tabloyu değiştirirken ve satırlarını güncellerken düzenli bir yaklaşım izlemek çok önemlidir. Yaygın bir senaryo, bir tabloya yeni bir sütun eklemek ve ardından tarihlere dayalı bir bayrak ayarlamak gibi belirli koşullara göre satırları güncellemektir. Sağladığım komut dosyası buna basit bir yaklaşım gösteriyor ancak bu görevleri verimli bir şekilde gerçekleştirmek için gerekli olan temel SQL Server komutlarını vurguluyor. TABLOYU DEĞİŞTİR Tabloya yeni bir sütun eklemek için kullanılan komuttur. Örneğin, 'ALTER TABLE dbo.sample ADD IS_CURRENT BIT;' komutunu çalıştırdığımızda, tablo yapısını 'BIT' türünde (bir boole türü, 0 veya 1) 'IS_CURRENT' adlı yeni bir sütunu tanıtacak şekilde değiştiriyoruz.

Sütunu ekledikten sonra bir sonraki adım, tablodaki satırları belirli koşullara göre güncellemektir. Bu, aşağıdakiler kullanılarak elde edilir: GÜNCELLEME emretmek. Örneğin, `UPDATE dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE sorgusu

Bazı durumlarda, özellikle milyonlarca satır içeren büyük tablolarla uğraşırken, SQL komutlarının verimli bir şekilde yürütülmesini sağlamak önemlidir. Burası gibi işlevlerin olduğu yer TARİHADDD Ve DATEDIFF oyuna gel. Bu işlevler tarihleri ​​hassas bir şekilde değiştirmenize ve karşılaştırmanıza olanak tanır. İkinci güncelleme sorgusunda, 'DATEADD(ay, DATEDIFF(ay, 0, DATEADD(DAY, -60, GETDATE())) 0)', geçerli tarihten (`GETDATE()`) 60 günü çıkarır ve sıfırlar ayın başlangıcına kadar zaman var. Bu işlevleri kullanarak, zaman ilerledikçe ayarlanan daha dinamik tarih aralıkları tanımlayabilir ve verilerin eskise bile güncel kalmasını sağlayabiliriz.

Ancak, hem ALTER TABLE hem de UPDATE deyimlerini tek bir komut dosyasında birleştirirken, SQL Server bazen "Geçersiz sütun adı" hatası verebilir. Bunun nedeni, "ALTER TABLE" tarafından eklenen sütunun, aynı grupta sonraki sorguların yürütülmesi sırasında SQL Server tarafından tam olarak işlenememesi veya tanınmaması olabilir. Bu sorunun çözümü, 'ALTER TABLE' deyimi ile 'UPDATE' komutlarını ayırıp, güncellemeler yapılmadan önce tablo değişikliğinin tam olarak yapılmasını sağlamaktır. Bunu yaparak, SQL Server yeni sütunun şemasına düzgün bir şekilde kaydedilmesini sağlayacak ve tablonun sorunsuz şekilde güncellenmesine olanak tanıyacaktır. Büyük veri kümelerini işlerken, sürecin mümkün olduğunca verimli olmasını sağlamak ve olası zaman aşımlarını veya kilitlenmeleri önlemek için bu işlemleri toplu olarak yürütmeyi veya işlemleri kullanmayı düşünün. 🚀

Çözüm 1: Tabloyu Değiştirmek ve Satırları Güncellemek İçin Standart Yaklaşım

Bu çözüm, SQL Server Management Studio'yu (SSMS) kullanan standart yaklaşımı içerir; burada önce sütunu ekleriz ve ardından satırları uygun koşullarla güncelleriz. ALTER TABLE deyimini çalıştırıyoruz ve herhangi bir güncelleme yapmadan önce onu taahhüt ediyoruz.

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

Çözüm 2: Atomicity için İşlem Kullanarak Optimize Edilmiş Yaklaşım

Bu çözüm, tablo değişikliğinin ve satır güncellemelerinin atomik olarak yapılmasını sağlar. İşlemleri bir işlem içerisine sararak tutarlılık ve başarısızlık durumunda geri dönüş sağlıyoruz.

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;

Çözüm 3: Büyük Veri Kümeleri İçin Toplu İşlemeyi Kullanma Yaklaşımı

Bir milyondan fazla satır içeren tablolarla uğraşırken kilitlemeyi en aza indirmek ve işlem boyutunu azaltmak önemlidir. Bu çözüm, performansı artırmak ve zaman aşımlarını önlemek için güncellemeleri daha küçük gruplar halinde işler.

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

4. Çözüm: Performans İyileştirmesi için Dizine Alınmış Görünümlerin Kullanımı

Büyük veri kümelerini sorgularken performansı artırmak için SQL Server'da dizinli görünümler oluşturabilirsiniz. Bu yaklaşım, karmaşık sorguların sonuçlarını depolamak için somutlaştırılmış görünümlerden yararlanır ve tekrarlanan veri işleme ihtiyacını azaltır.

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

Çözüm 5: Zamanlanmış Güncellemeler için SQL Server Agent İşlerine Yaklaşım

Tabloyu planlı bir şekilde güncellemeniz gerekiyorsa, SQL Server Agent, manuel yürütme ihtiyacını ortadan kaldırarak belirli aralıklarla güncelleme işlemini yürüten işler oluşturmak için kullanılabilir.

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';

Komut Dosyalarında Kullanılan Belirli SQL Komutlarının Açıklaması

Büyük Tablolar için SQL Server Komut Dosyalarını Optimize Etme

SQL Server'da büyük tablolarla çalışırken, tablo yapısını değiştirirken ve mevcut satırları güncellerken performans optimizasyon tekniklerini dikkate almak önemlidir. Büyük tablolarda komut dosyaları çalıştırırken karşılaşılan en yaygın sorunlardan biri, özellikle tablo bir milyonun üzerinde satır içerdiğinde, bu işlemlerin tamamlanması için gereken süredir. Söz konusu işlemler, örneğin bir sütun eklemek gibi TABLOYU DEĞİŞTİR belirli tarih koşullarına göre satırları komutlandırmak ve güncellemek önemli miktarda zaman alabilir. Performansın öncelikli olduğu üretim veritabanları üzerinde çalışırken bu işlemleri optimize etmek daha da önemli hale gelir. Tek bir komut dosyası, diğer sorguları ve kullanıcıları etkileyerek tabloyu uzun süre kilitleyebilir.

Performans sorunlarını azaltmak için en iyi yaklaşımlardan biri görevleri daha küçük adımlara bölmektir. Örneğin, bir sütun eklemek ve tüm satırları tek bir komut dosyasında güncellemek yerine, TABLOYU DEĞİŞTİR ayrı ayrı komut, ardından toplu olarak UPDATE operasyonlar. Kayıtları daha küçük parçalar halinde güncelleyerek, komut dosyası sunucuyu bunaltmaz. Şunlardan yararlanabilirsiniz: UPDATE TOP Her işlemde etkilenen satır sayısını sınırlama komutu. Ayrıca, kullandığınız sütunlarda dizinler oluşturmak da iyi bir fikirdir. WHERE hükümler (örneğin LOAD_DATE) arama sürecini hızlandırmak için. Büyük veri kümeleri için dizinler, satırların tarih aralıklarına göre filtrelenmesi için gereken süreyi azaltır.

Bir diğer önemli husus, işlemlerin atomik olarak yürütülmesini sağlamak için işlemlerin ve hata işlemenin kullanılmasıdır. Sarılarak UPDATE içindeki ifadeler BEGIN TRANSACTION Ve COMMIT, değişikliklerin güvenli ve tutarlı bir şekilde yapılmasını sağlarsınız. Sürecin herhangi bir kısmı başarısız olursa, şunu kullanabilirsiniz: ROLLBACK kısmi güncellemeleri önleyerek değişiklikleri geri almak için. Ek olarak, komut dosyalarının yoğun olmayan saatlerde çalıştırılması veya bu işlemleri planlamak için SQL Server Agent'ın kullanılması, sistem performansı üzerindeki etkinin minimum düzeyde olmasını sağlar. Bu optimizasyonlarla, sistem bütünlüğünü korurken büyük tablolarda karmaşık değişiklikleri güvenle gerçekleştirebilirsiniz. 🖥️

SQL Server Tablo Değişiklikleri Hakkında Sıkça Sorulan Sorular

  1. SQL Server'daki bir tabloya nasıl yeni bir sütun eklerim?
  2. kullanarak yeni bir sütun ekleyebilirsiniz. ALTER TABLE emretmek. Örneğin: ALTER TABLE dbo.sample ADD IS_CURRENT BIT; BIT veri türüne sahip IS_CURRENT adlı bir sütun ekler.
  3. SQL Server'da yalnızca belirli bir satır aralığını nasıl güncelleyebilirim?
  4. Kullanın UPDATE ile komut WHERE satırları filtrelemek için yan tümce. Örneğin: UPDATE dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE
  5. Komut dosyam neden "Geçersiz sütun adı" hatası veriyor?
  6. Bu hata şu durumlarda oluşur: ALTER TABLE komut çalıştırılmadan önce tam olarak işlenmedi UPDATE ifade. Bunu önlemek için, çalıştırın ALTER TABLE önce komutu verin, sütunun eklenmesini bekleyin, ardından komutu çalıştırın. UPDATE ayrı ayrı sorgular.
  7. Performansı artırmak için satırları toplu olarak nasıl güncelleyebilirim?
  8. Şunu kullanın: UPDATE TOP Aynı anda güncellenen satır sayısını sınırlama komutu. Örneğin: UPDATE TOP (1000) dbo.sample SET IS_CURRENT = 0 WHERE LOAD_DATE
  9. Atomik güncellemeleri sağlamak için bir işlem kullanabilir miyim?
  10. Evet! Sarın UPDATE ifadeleri bir BEGIN TRANSACTION Ve COMMIT tüm güncellemelerin tek bir birim olarak uygulanmasını sağlamak için blok. Herhangi bir hata meydana gelirse şunu kullanın: ROLLBACK Değişiklikleri geri almak için.
  11. SQL Server'daki büyük güncellemelerin performansını optimize etmenin en iyi yolu nedir?
  12. Güncellemeyi daha küçük parçalara ayırmayı, ilgili sütunlarda dizinler oluşturmayı ve betiği yoğun olmayan saatlerde çalıştırmayı düşünün. Ek olarak, kullanarak UPDATE TOP yöntemi kilitleme sorunlarını önlemeye yardımcı olur ve kaynak tüketimini azaltır.
  13. SQL Server'da tarih karşılaştırmalarını nasıl daha dinamik hale getirebilirim?
  14. Gibi tarih işlevlerini kullanın DATEADD Ve DATEDIFF Dinamik tarih hesaplamaları yapmak için. Örneğin, 60 gün önceki bir tarihi ayarlamak için DATEADD(DAY, -60, GETDATE()) işlevini kullanın.
  15. Milyonlarca satırı bir tarihe göre güncellemem gerekirse ne yapmalıyım?
  16. Daha iyi performans için dizine alınmış sütunları kullanmayı düşünün. Ayrıca güncellemenizi daha küçük işlemlere bölün ve UPDATE TOP satırları toplu olarak güncellemek için.
  17. Büyük bir tabloyu güncellerken kilitleme sorunlarını nasıl önleyebilirim?
  18. Kilitlenme sorunlarını önlemek için güncellemeleri daha küçük gruplara ayırmayı deneyin, değişiklikleri aşamalı olarak gerçekleştirmek için işlemleri kullanın ve güncellemeyi kullanımın düşük olduğu saatlerde çalıştırmayı düşünün.
  19. SQL Server'da büyük güncelleme komut dosyalarını zamanlayabilir miyim?
  20. Evet, SQL Server Agent, sistem performansı üzerindeki etkiyi en aza indirmek amacıyla yoğun olmayan saatlerde büyük güncelleme komut dosyalarını planlamak için kullanılabilir. SQL Server Agent'ta bir iş oluşturun ve istediğiniz zamanlamayı ayarlayın.

SQL Server'da Büyük Tablo Değişikliklerini Optimize Etme

Büyük tabloları değiştirmek için SQL Server ile çalışırken operasyonlarınızı parçalara ayırmak performansı artırmanın anahtarıdır. Milyonlarca satır içeren bir tabloya sütun eklemek ve verileri belirli koşullara göre güncellemek zor olabilir. Bu, aşağıdaki gibi komutların stratejik olarak yürütülmesini gerektirir: TABLOYU DEĞİŞTİR Ve UPDATE Değişikliklerin sistemi yormadan uygulanmasını sağlamak.

Ek olarak, güncellemeleri toplu olarak işlemek, dizin oluşturmayı kullanmak ve komut dosyalarını yoğun olmayan saatlerde çalıştırmak gibi en iyi uygulamaları uygulamak, tablo kilitleme ve performans düşüşü gibi sorunların önlenmesine yardımcı olabilir. İş yükünü bölerek ve sorguları optimize ederek, kesintilere veya "Geçersiz sütun adı" gibi hatalara neden olmadan büyük ölçekli değişiklikleri güvenle yapabilirsiniz. 💻

Referanslar ve Kaynaklar
  1. SQL Server'daki tabloları değiştirme ve verileri güncelleme sürecini ayrıntılarıyla anlatır. Tabloları değiştirme ve en iyi uygulamalar hakkında daha fazla bilgi için bkz. Microsoft SQL Sunucu Belgeleri .
  2. Büyük tablolarla çalışmaya ve SQL komutlarını optimize etmeye ilişkin bilgiler sağlar. SQL Kulübesi .
  3. SQL'de tarih tabanlı koşullu güncelleştirmelerin ve dizin oluşturmanın önemini açıklar; şu adreste mevcuttur: SQL Sunucu Merkezi .