PDA

View Full Version : ذخیره با حجم بالای اطلاعات در SQL



navidiran
پنج شنبه 19 اردیبهشت 1392, 11:45 صبح
با سلام.
دوستان من برنامه ای دارم که اطلاعات اکسل رو به یک دیتاگرید وارد می کند.

تعداد سطرها تقریبا 143،000 سطر و 20 ستون هستند که همه خانه ها حاوی اطلاعات هستند.
یعنی من باید 143000*20 = 2،860،000 خانه را در SQL Server ذخیره کنم.

1- با استفاده از متدهای معمولی لینکو و ADO کلا برنامه هنگام ثبت زمین گیر میشه و خیلی ساعت برای ثبت همه خانه ها زمان میبره.
2- یک کوئری نوشتم توی دیتاست


INSERT INTO tbl_ExcelInsert
(FileNameId, Row, Columns, ColumnHeader, CellContent)
VALUES (@filenameId,@row,@column,@colHeader,@cell)


بازهم زمان زیادی برای ثبت اطلاعات لازم داره.


الان چیکار کنم دیتاگرید رو در زمان کوتاهی ثبت کنم؟
دوستان کمک کنید.

Tiam121
پنج شنبه 19 اردیبهشت 1392, 12:32 عصر
از thread استفاده کن

tooraj_azizi_1035
پنج شنبه 19 اردیبهشت 1392, 15:46 عصر
سلام
با این فرض که نمی خواید از Import Export در SQL Server استفاده کنید،
می تونی با این دستور تمام رکورد ها رو یکجا درج کنی:

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;
Database=C:\pathToExcelFile.xlsx;HDR=Yes', 'Select * from [Sheet1$]')


البته باید این رو هم نصب کنی:
http://www.microsoft.com/en-us/download/details.aspx?id=23734

با دستور INSERT INTO به همراه SELECT بالا کار کن:


USE AdventureWorks2008R2;
GO
SELECT c.FirstName, c.LastName, e.JobTitle, a.AddressLine1, a.City,
sp.Name AS [State/Province], a.PostalCode
INTO dbo.EmployeeAddresses
FROM Person.Person AS c
JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = c.BusinessEntityID
JOIN Person.BusinessEntityAddress AS bea
ON e.BusinessEntityID = bea.BusinessEntityID
JOIN Person.Address AS a
ON bea.AddressID = a.AddressID
JOIN Person.StateProvince as sp
ON sp.StateProvinceID = a.StateProvinceID;
GO

navidiran
جمعه 20 اردیبهشت 1392, 00:07 صبح
در مورد Thread باید بگم که دوست عزیز ، استاد گرامی ، همکار عزیز ببینید Thread اونجایی لازم هست که چند تا کار رو با هم بخواییم انجام بدیم و خودشم در برنامه هایی که گرافیک درگیر هست. نه اینجا که من فقط میخوام دیتا بریزم توی پایگاه. لطفا کمی با مسئولیت جواب بدین. برنامه همینطوری هم زمین گیر هست ، من چیکار به Thread دارم.

در مورد دوم هم جدول من کاملا نرمال سازی شده هست و نیازی به join های دیگر ندارم و با این وجود کوئری که در بالا نوشتم باز زمان زیادی برای ثبت حتی با دیتاست نیاز داره ، چه رسد به اینکه join داشته باشه.
دوستان این راهها زمانبر هستند.

طبق راهنمایی هایی که دوستان داشتند کلاس SQL Bulk Copy باید بکار بگیرم که کمی بیشتر منطقی به نظر میرسه . اما من تابحال باهاش کار نکردم.
اگر کسی کار کرده ممنون میشم یه راهنمایی اولیه در این مورد داشته باشه.

khokhan
جمعه 20 اردیبهشت 1392, 00:13 صبح
دوستان این راهها زمانبر هستند.

طبق راهنمایی هایی که دوستان داشتند کلاس SQL Bulk Copy باید بکار بگیرم که کمی بیشتر منطقی به نظر میرسه . اما من تابحال باهاش کار نکردم.
اگر کسی کار کرده ممنون میشم یه راهنمایی اولیه در این مورد داشته باشه.

http://www.codeproject.com/Tips/309564/SQL-Bulk-copy-method-to-insert-large-amount-of-dat

navidiran
جمعه 20 اردیبهشت 1392, 00:49 صبح
http://www.codeproject.com/Tips/309564/SQL-Bulk-copy-method-to-insert-large-amount-of-dat

ممنون. مفید هست ، اما با exception ها چیکار کنم. از دوستان کسی با SQL Bulk کار کرده ؟
آیا راه دیگری هم بجز اون برای بالا بردن سرعت در ذخیره اطلاعات وجود داره؟
بازیابی این حجم بالای اطلاعات چطوری انجام میشه؟
من که کم آوردم.