一部の列のデータ型をintからbigintに変更する必要があります。残念なことに、これらのテーブルの一部は大きく、約7〜100万行(ただし幅はありません)です。alter tableのSQL Serverのパフォーマンス列の変更の変更データ型
これらのテーブルでは、alter table alter列が永遠に使用されています。これを達成するためのより速い方法がありますか?
一部の列のデータ型をintからbigintに変更する必要があります。残念なことに、これらのテーブルの一部は大きく、約7〜100万行(ただし幅はありません)です。alter tableのSQL Serverのパフォーマンス列の変更の変更データ型
これらのテーブルでは、alter table alter列が永遠に使用されています。これを達成するためのより速い方法がありますか?
偶然、私は約3時間前に非常に似たようなことをしなければなりませんでした。テーブルには35メートルの列だった、それはかなり広く、それだけでこれを行うには永遠に取っていた:、今回
alter table myTable add myNewColumn int null;
while 1=1
begin
update top (100000) myTable
set
myNewColumn = 0
where
myNewColumn is null;
if @@ROWCOUNT = 0 break;
end
alter table myTable alter column myNewColumn int not null;
alter table myTable add constraint tw_def_myNewColumn default (0) for myNewColumn;
alter table
:
alter table myTable add myNewColumn int not null default 0;
ここで私は一緒に行くことになった何何をステートメントはほぼ瞬間でした。更新バッチを実行するのに約7〜8分(遅いサーバーで)かかりました。私は、SQL Serverが元のクエリで値を復元するために元に戻すを生成していると推測していますが、私はそれが始まるとは期待していませんでした。
とにかく、あなたのケースでは、似たようなものが役に立ちます。新しいbigint列を追加し、バッチで新しい列を更新し、次にその列に制約を設定することができます。
新しいcolumntypeとインデックスを使用して、新しいテーブルを作成します。 (古いテーブルを取り除いて名前を変更する)
新しいテーブル(列リスト)に挿入* from old_table;
old_tableの名前をold_table_backに変更し、new_tableの名前をold_tableに変更します。
新しいテーブルに古いインデックスを作成し、古いテーブルに任意のri制約をドロップし、それらを新しいテーブルに組み込みます。ここでも、あなたのrdbmsには、これを行うためのスクリプトを生成する簡単な方法があります。
は、任意の速い既存の列のデータ型を変更することとは異なるデータ型の列に新しいテーブルに選択されていますか?私たちは主キー列のためにこれをやっています。 –
一般にはるかに高速です。各行のサイズを変更するのではなく、正しいサイズの新しい行を作成するだけです。 – tpdi
私はこの数週間前に、639mの行のテーブルを使いました。私は新しいテーブルを作成し、データを「バッチ」でコピーすることになりました。メインサーバーで約2日間かかり、レプリケーションに3日間かかりました。私は古いテーブルに使用していたすべてのビューとprocsを変更しました。これにより、私が望んでいない列を取り除き、(場合によっては)より良いインデックスを選ぶようないくつかの問題を解決することができました。すべてのデータをsqlに変更した後、古いテーブルを削除しました。
今はそれが賢明です。システムが長生きし、数百万行の可能性がある場合は、IDの主キーに大きなintを使用します。
私はこの問題を横断しました...その中に447,732,310個のレコードがあるテーブル。同僚が素晴らしいソリューションを思いついていたら、新しいテーブルにデータをコピーするのに約24分、インデックスを作成するのに約40分しかかかりませんでした。ここで
は、私たちがやったことだ:
--Get ntiles of idOrders, split up into 100 groups - 1:20 minutes
IF(OBJECT_ID('TEMPDB..#x')) IS NOT NULL
DROP TABLE #x
SELECT nt, MIN(idOrder) idOrderMin, MAX(idOrder) idOrderMax
INTO #X
FROM (
SELECT idOrder, NTILE(100) OVER(ORDER BY idOrder) nt
FROM (
SELECT DISTINCT idOrder FROM order_raw_fields
) X
) Y
GROUP BY nt
-- view results
--SELECT * FROM #x ORDER BY idOrderMin
-- create new table
SELECT TOP 0 *
INTO ORDER_RAW_FIELDS_Intl
FROM ORDER_RAW_FIELDS
ALTER TABLE dbo.ORDER_RAW_FIELDS_Intl
ALTER COLUMN value nvarchar(500)
--Build queries
SELECT 'insert into ORDER_RAW_FIELDS_Intl select * from order_raw_fields
where idOrder >= ' + CAST(idOrderMIn AS VARCHAR(100)) + ' and idOrder <= ' + CAST(idOrderMax AS varchar) InsertStmt
INTO #inserts
FROM #X
ORDER BY idOrderMin
DECLARE insertCursor CURSOR LOCAL FAST_FORWARD FOR
SELECT InsertStmt
FROM #inserts
OPEN insertCursor
-- 24:04 minute execution time to match
DECLARE @insertStmt NVARCHAR(125)
FETCH NEXT FROM insertCursor INTO @insertStmt
WHILE @@FETCH_STATUS = 0
BEGIN
--EXECUTE @insertStmt
EXECUTE sp_executesql @[email protected]
PRINT 'Execution Complete: ' + @insertStmt
FETCH NEXT FROM insertCursor INTO @insertStmt
END
CLOSE insertCursor
DEALLOCATE insertCursor
-- Add indexes
-- 21:37 minutes completion time
ALTER TABLE [dbo].[ORDER_RAW_FIELDS_Intl] ADD CONSTRAINT [PK_ORDER_RAW_FIELDS_Intl] PRIMARY KEY CLUSTERED
(
[idRow] ASC,
[idOrder] ASC,
[remoteFieldName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 92) ON [PRIMARY]
GO
-- 13:45 minutes completion time
CREATE NONCLUSTERED INDEX [IX_idOrder_remoteFieldName2] ON [dbo].[ORDER_RAW_FIELDS_Intl]
(
[idOrder] ASC,
[remoteFieldName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 94) ON [PRIMARY]
GO
-- drop table
TRUNCATE TABLE [dbo].[ORDER_RAW_FIELDS]
DROP TABLE [dbo].[ORDER_RAW_FIELDS]
-- renamed new table to old tables's name
EXEC sp_rename 'ORDER_RAW_FIELDS_Intl', 'ORDER_RAW_FIELDS';
1000万の行を持つテーブルの列サイズを変更して新しい列にコピーするときに、パフォーマンスの違いはありませんでした。 –
どちらの場合も遅かったのですか? – Matt