خوش آموز درخت تو گر بار دانش بگیرد، به زیر آوری چرخ نیلوفری را


افزودن رکورد از یک جدول به جدول دیگر در SQL Server با استفاده از INSERT INTO SELECT یا SELECT INTO

افزودن رکورد از یک جدول به جدول دیگر در SQL Server با استفاده از INSERT INTO SELECT  یا SELECT INTO
در شرایطی داده های بزرگ ورکوردهای زیادی در یک Table دارید که می خواهید آنها را به یک جدول دیگر انتقال دهید. خب هر چه داده ها بزرگتر و رکوردها بیشتر باشد، طبیعتا اینکار زمان گیرتر خواهد بود. شما از اسکریپت ها و دستورات مختلفی مثل INSERT INTO SELECT و SELECT INTO استفاده می کنید که هر دوی آنها یک کار را انجام می دهند ولی تفاوت اصلی در Performance این دستورات خواهد بود.

سیستم یکپارچۀ سازمانی راهکار
در ادامه از یک جدول برای تست این مورد استفاده خواهم کرد. پس برنامه SQL Server خود را اجرا کرده و بدان لاگین کنید و در ادامه پنجره New Query را باز کیند.


با استفاده از اسکریپت زیر یک جدول ایجاد خواهیم کرد که در آن 10 میلیون رکورد ایجاد خواهیم کرد.

USE [WideWorldImporters]
GO
-- SampleTable Build
CREATE TABLE [10MillionRows](
[StockItemTransactionID] [int] NOT NULL,
[StockItemID] [int] NOT NULL,
[TransactionTypeID] [int] NOT NULL,
[CustomerID] [int] NULL,
[InvoiceID] [int] NULL,
[SupplierID] [int] NULL,
[PurchaseOrderID] [int] NULL,
[TransactionOccurredWhen] [datetime2](7) NOT NULL,
[Quantity] [decimal](18, 3) NOT NULL,
[LastEditedBy] [int] NOT NULL,
[LastEditedWhen] [datetime2](7) NOT NULL)
GO
INSERT INTO [10MillionRows]
SELECT TOP 10000000 SI.*
FROM [Warehouse].[StockItemTransactions] SI
CROSS JOIN [Warehouse].[StockItemTransactions] SI1
GO


افزودن رکورد از یک جدول به جدول دیگر در SQL Server با استفاده از INSERT INTO SELECT  یا SELECT INTO . آموزشگاه رایگان خوش آموز

حالا ما یک Table داریم که دارای 10 میلیون رکورد است. پس حالا آزمایش خود را آغاز می کنیم.
در تست اول از حالت INSERT INTO SELECT استفاده خواهیم کرد:

-- Creating Table
CREATE TABLE [InsertIntoTest](
[StockItemTransactionID] [int] NOT NULL,
[StockItemID] [int] NOT NULL,
[TransactionTypeID] [int] NOT NULL,
[CustomerID] [int] NULL,
[InvoiceID] [int] NULL,
[SupplierID] [int] NULL,
[PurchaseOrderID] [int] NULL,
[TransactionOccurredWhen] [datetime2](7) NOT NULL,
[Quantity] [decimal](18, 3) NOT NULL,
[LastEditedBy] [int] NOT NULL,
[LastEditedWhen] [datetime2](7) NOT NULL)
GO
-- Actual Test
SET STATISTICS TIME ON
INSERT INTO [InsertIntoTest]
SELECT *
FROM [10MillionRows]
GO
SET STATISTICS TIME OFF
-- Clean up
DROP TABLE [InsertIntoTest]
GO

افزودن رکورد از یک جدول به جدول دیگر در SQL Server با استفاده از INSERT INTO SELECT  یا SELECT INTO . آموزشگاه رایگان خوش آموز

حالا اجازه دهید که گزارش اجرای این کوئری را ببینیم:

SQL Server Execution Times:
CPU time = 18937 ms, elapsed time = 19046 ms.

لطفا از جزئیات و گزارش این کوئری اسکرین بگیرید و روش بعد را امتحان کنید:
در این روش از SELECT INTO استفاده می کنیم:

SET STATISTICS TIME ON
SELECT *
INTO [dbo].[SelectIntoTest]
FROM [10MillionRows]
OPTION (MAXDOP 1)
GO
SET STATISTICS TIME OFF

syntax این اسکریپت همانطور که به نظر می رسد ساده است ولی نمی خواهیم بر اساس کوتاهی یا سادگی یک کد در مورد ان تصمیم بگیریم بلکه باید به گزارش خروجی آن دقت کنیم.

SQL Server Execution Times:
CPU time = 6625 ms, elapsed time = 6861 ms.

همانطور که مشاهده می کنید، هر دو کوئری یک کار را انجام دادند ولی گزارشات این دو با هم فرق دارند. اگر به دستور فوق دقت کنید از OPTION (MAXDOP 1) استفاده شده است. دلیل آنهم این است که وقتی کوئری اول اجرا شد، از یک CPU استفاده شد ولی در کوئری دوم، بصورت پارالل این کوئری انجام شد که عملکرد کوئری را افزایش می دهد.
خب، اگر بخواهید می توانید همین کوئری فوق را بدون OPTION (MAXDOP 1) اجرا کنید و Performance اجرای دستور را متفاوت خواهید دید.

SQL Server Execution Times:
CPU time = 14611 ms, elapsed time = 2517 ms.

شما به وضوح می توانید ببینید که وقتی یک پرس و جو به طور موازی اجرا می شود، از CPU کمی بیشتر استفاده می کند و زمان اجرای ان هم کاهش پیدا خواهد کرد.
پس با مشاهده هر دو آزمایش، به وضوح می توانید ببینید که عملکرد و سرعت دستور SELECT INTO از INSERT INTO SELECT سریعتر می باشد.





نمایش دیدگاه ها (0 دیدگاه)

دیدگاه خود را ثبت کنید:

انتخاب تصویر ویرایش حذف
توجه! حداکثر حجم مجاز برای تصویر 500 کیلوبایت می باشد.


دسته بندی مطالب خوش آموز