Xử lý 48 triệu dòng trong SQL Server (2 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

dhuykhoi

Thành viên mới
Tham gia
19/12/08
Bài viết
49
Được thích
91
Dear các bác cao thủ,

Em hiện có bảng A gồm 48 triệu dòng dữ liệu có cột số máy của xe. Kèm đó em có bảng B gồm loại số máy và model xe. Em muốn cập nhật model vào bảng A thì làm như thế nào tốt nhất nhỉ? Em có database ở SQL Server và muốn dùng lệnh SQL để chạy tự động ạ

Bảng A và B em gửi kèm theo file dưới đây.

Em xin cảm ơn các bác trước ạ!
 

File đính kèm

Lần chỉnh sửa cuối:
Câu lệnh có thể là, mình không test được:
Select A.*, B.model, B.hang_xe From A Left Join B On A.so_may Like B.so_may + '%'
 
Lần chỉnh sửa cuối:
Sử dụng DIC

Tôi cũng chỉ nghe láng máng SQL nên chưa biết j. Với dữ liệu hơn 40 triệu dòng khả dùng DIC cũng chạy được
E có học mót sử dụng DIC, tuy nhiên theo yêu cầu của bài toán, Nếu như loại số máy bên Bang A giống hệt như loại số máy bên Bang B thì e làm được. Nhưng loại số máy bên bảng A có bổ sung thêm các ký tự đằng sau nên chưa biết sử lý tình huống thế nào
Nhân tiện bài toán của chủ Topic, E pốt file hỏi các thành viên
Mong nhận được sự trợ giúp
Mã:
Sub LoaiXe()
    Application.ScreenUpdating = False
    Dim T As Double, Dic1 As Object
    Dim MyRng As Range
    Dim SoMay, SoKhung, MoDel, HangXe
    Dim Source, ThongTin, Itm
    Dim I As Long
    T = Timer
    With Sheet1
        SoMay = .Range(.[E2], .[E1048576].End(3)).Value
    End With
    With Sheet2
        Set MyRng = Range(.Range("A2"), .Range("A1048576").End(xlUp))
        Source = MyRng
        MoDel = MyRng.Offset(, 1)
        HangXe = MyRng.Offset(, 2)
    End With
    ReDim ThongTin(1 To UBound(SoMay), 1 To 2)
    Set Dic1 = CreateObject("Scripting.Dictionary")
        For I = 1 To UBound(Source)
            Itm = CStr(Source(I, 1))
            If Itm > "" And Not Dic1.exists(Itm) Then
                Dic1.Add Itm, I
            End If
        Next
    For I = 1 To UBound(SoMay)
        Itm = CStr(SoMay(I, 1))
        If Dic1.exists(Itm) Then
            ThongTin(I, 1) = MoDel(Dic1.Item(Itm), 1)
            ThongTin(I, 2) = HangXe(Dic1.Item(Itm), 1)
        End If
    Next
    Sheet1.Range("G2").Resize(UBound(SoMay), 2) = ThongTin
    MsgBox Timer - T, , "Thoi gian"
    Application.ScreenUpdating = True
End Sub
 

File đính kèm

Câu lệnh có thể là, mình không test được:
Select A.*, B.model, B.hang_xe From A Left Join B On A.so_may Like B.so_may + '%'

Người ta hỏi cập nhật mà. Câu của bạn chỉ truy vấn thôi, không có cập nhật.

Mã:
update A set A.Model = B.Model, A.HangXe = B.HangXe
from A
    inner join B on
        A.SoMay Like B.SoMay + '%'

(*) Ở đâu ra 48 triệu số máy vầy nè trời. Dân làm việc với dữ liệu dạng này là dân Data Mining, bậc thầy của tôi. Tại sao phải lên đây hỏi?
 
cám ơn các bác nhiều nhé!!

em chưa làm Data Mining bao giờ nên chả biết gì. Giờ em cứ để máy chạy thôi :D... hy vọng chạy trong 1 tuần là ra :D
 
cám ơn các bác nhiều nhé!!

em chưa làm Data Mining bao giờ nên chả biết gì. Giờ em cứ để máy chạy thôi :D... hy vọng chạy trong 1 tuần là ra :D
Thử như sau:
1. Tạo 1 select query để nối 2 bảng đó lại với nhau

[GPECODE=sql]SELECT BangA.ma_nhan, BangA.ma_loai, BangA.cc, BangA.loaixe, BangA.so_may, BangA.so_khung, BangB.Model, BangB.[Hãng xe]
FROM BangB RIGHT OUTER JOIN
BangA ON BangA.so_may LIKE BangB.[Loai số máy] + '%'[/GPECODE]
2. Tạo bảng mới với subquery trên.
3. Xóa bảng A cũ đi.

Đó chỉ là 1 trong nhiều cách đơn giản, nếu không muốn dùng update query. Theo mình nghĩ thì tốc độ sẽ khá hơn khi dùng update.
Trên đây chỉ là ý kiến chủ quan của tôi vì tôi chưa từng test thử với dữ liệu khủng như bạn hiện có. Nếu dùng được thì dùng còn không thì thôi, đừng ném đá nhé.
 
Lần chỉnh sửa cuối:
Người ta hỏi cập nhật mà. Câu của bạn chỉ truy vấn thôi, không có cập nhật.

Mã:
update A set A.Model = B.Model, A.HangXe = B.HangXe
from A
    inner join B on
        A.SoMay Like B.SoMay + '%'

(*) Ở đâu ra 48 triệu số máy vầy nè trời. Dân làm việc với dữ liệu dạng này là dân Data Mining, bậc thầy của tôi. Tại sao phải lên đây hỏi?

Cách dùng update theo tôi nhận xét thì kết quả sẽ quá ngon, tuy nhiên với dữ liệu khủng như trên thì cực chẳng đã mới dùng nó. Bởi tốc độ của nó sẽ rất chậm.

TB: Cái chữ màu xanh tôi không biết nghĩa là gì. Bạn thường hay bắt bẻ người ta dùng tiếng Tây trong tiếng Việt mà.
 
Data Mining là một thuật ngữ và mang tính chuyên ngành dành cho các bác chiên gia xử lý những kho dữ liệu lớn và không phải là cái gì phổ dụng để tất cả chúng ta cần phải biết. Đối với các chuyên gia thì trích dẫn thuật ngữ "Data Mining" sẽ có tính chất biểu cảm hơn nhiều là việc dùng một cụm thuần việt. Vụ đó tôi thấy khá bình thường. Nhưng nếu cứ thỉnh thoảng nói surf web, download hoặc post .... thì cũng kém mỹ quan.
Việc ai đó có cơ hội động chạm đến dữ liệu với vài chục triệu dòng thì phải nói là người đấy được cấp quyền hơi cao rồi vì thế bác VietMini mới phỏng đoán như vậy. Và với quyền quản lý, truy cập cao như vậy với kho dữ liệu đó thì nghiệp vụ phân tích, quản trị data của bác đó cũng cao lắm chứ mèng gì mấy vụ SQL đơn giản.
Bản thân từ Data Mining chưa có một thuật ngữ tương đương thoát nghĩa trong tiếng Việt. Dịch thuần ra thì đơn giản là Khai phá/ khai thác dữ liệu. Từ Mining có nghĩa là đào mỏ, khai mỏ, khai thác...
Nhưng dịch sang như vậy nó không hoàn toàn đúng với cách định nghĩa gốc trong tiếng Tây.
Trích dẫn định nghĩa như thế này:
"Generally, data mining (sometimes called data or knowledge discovery) is the process of analyzing data from different perspectives and summarizing it into useful information - information that can be used to increase revenue, cuts costs, or both. Data mining software is one of a number of analytical tools for analyzing data. It allows users to analyze data from many different dimensions or angles, categorize it, and summarize the relationships identified. Technically, data mining is the process of finding correlations or patterns among dozens of fields in large relational databases."
http://www.anderson.ucla.edu/faculty/jason.frand/teacher/technologies/palace/datamining.htm
Tạm dịch thế này
Nói chung Khai phá dữ liệu (thỉnh thoảng người ta còn gọi là khám phá dữ liệu hoặc tri thức) là một quá trình phân tích dữ liệu theo các khía cạnh khác nhau và tóm tắt lại thành các thông tin hữu ích - những thông tin có thể dùng để tăng doanh thu, giảm giá thành hoặc cả hai. Phần mềm khai phá dữ liệu là một nhóm các công cụ phân tích dữ liệu. Chúng cho phép người dùng phân tích số liệu theo các chiều hoặc góc nhìn khác nhau, phân loại, tổ hợp,tóm tắt các mối quan hệ xác định được. Về mặt kỹ thuật, đây là quá trình tìm các mối liên hệ hoặc các dấu hiệu mang tính quy tắc từ hàng chục trường dữ liệu trong các cơ sở dữ liệu lớn.

Túm lại, với một người làm liên quan đến số liệu, không phải lúc nào anh ta cũng được phép tiếp cận với những kho dữ liệu lớn. Nếu ai đó được quyền khai thác, sử dụng số liệu cỡ lớn như vậy, anh ta phải có kiến thức hoặc được quyền truy cập hoặc ít ra là có quyền truy vấn những chuyên gia trong ngành (chẳng hạn lãnh đạo yêu cầu nhân viên chẳng hạn).
Vì vậy, xem phép được múa mấy dòng thô kệch! Nếu các bạn muốn hiểu kỹ về Data mining, Data warehouse .. xin gúc gờ... sẽ rất thú vị.
 
Lần chỉnh sửa cuối:
Data Mining là một thuật ngữ và mang tính chuyên ngành dành cho các bác chiên gia xử lý những kho dữ liệu lớn và không phải là cái gì phổ dụng để tất cả chúng ta cần phải biết. Đối với các chuyên gia thì trích dẫn thuật ngữ "Data Mining" sẽ có tính chất biểu cảm hơn nhiều là việc dùng một cụm thuần việt. Vụ đó tôi thấy khá bình thường. Nhưng nếu cứ thỉnh thoảng nói surf web, download hoặc post .... thì cũng kém mỹ quan.
Việc ai đó có cơ hội động chạm đến dữ liệu với vài chục triệu dòng thì phải nói là người đấy được cấp quyền hơi cao rồi vì thế bác VietMini mới phỏng đoán như vậy. Và với quyền quản lý, truy cập cao như vậy với kho dữ liệu đó thì nghiệp vụ phân tích, quản trị data của bác đó cũng cao lắm chứ mèng gì mấy vụ SQL đơn giản.
Bản thân từ Data Mining chưa có một thuật ngữ tương đương thoát nghĩa trong tiếng Việt. Dịch thuần ra thì đơn giản là Khai phá/ khai thác dữ liệu. Từ Mining có nghĩa là đào mỏ, khai mỏ, khai thác...
Nhưng dịch sang như vậy nó không hoàn toàn đúng với cách định nghĩa gốc trong tiếng Tây.
Trích dẫn định nghĩa như thế này:
"Generally, data mining (sometimes called data or knowledge discovery) is the process of analyzing data from different perspectives and summarizing it into useful information - information that can be used to increase revenue, cuts costs, or both. Data mining software is one of a number of analytical tools for analyzing data. It allows users to analyze data from many different dimensions or angles, categorize it, and summarize the relationships identified. Technically, data mining is the process of finding correlations or patterns among dozens of fields in large relational databases."
http://www.anderson.ucla.edu/faculty/jason.frand/teacher/technologies/palace/datamining.htm
Tạm dịch thế này
Nói chung Khai phá dữ liệu (thỉnh thoảng người ta còn gọi là khám phá dữ liệu hoặc tri thức) là một quá trình phân tích dữ liệu theo các khía cạnh khác nhau và tóm tắt lại thành các thông tin hữu ích - những thông tin có thể dùng để tăng doanh thu, giảm giá thành hoặc cả hai. Phần mềm khai phá dữ liệu là một nhóm các công cụ phân tích dữ liệu. Chúng cho phép người dùng phân tích số liệu theo các chiều hoặc góc nhìn khác nhau, phân loại, tổ hợp,tóm tắt các mối quan hệ xác định được. Về mặt kỹ thuật, đây là quá trình tìm các mối liên hệ hoặc các dấu hiệu mang tính quy tắc từ hàng chục trường dữ liệu trong các cơ sở dữ liệu lớn.

Túm lại, với một người làm liên quan đến số liệu, không phải lúc nào anh ta cũng được phép tiếp cận với những kho dữ liệu lớn. Nếu ai đó được quyền khai thác, sử dụng số liệu cỡ lớn như vậy, anh ta phải có kiến thức hoặc được quyền truy cập hoặc ít ra là có quyền truy vấn những chuyên gia trong ngành (chẳng hạn lãnh đạo yêu cầu nhân viên chẳng hạn).
Vì vậy, xem phép được múa mấy dòng thô kệch! Nếu các bạn muốn hiểu kỹ về Data mining, Data warehouse .. xin gúc gờ... sẽ rất thú vị.

Nói túm lại là không có từ tiếng Việt nào để dịch sát nghĩa của nó? Vậy ta có quyền dùng kết hợp giữa Tây và ta trong tiếng Việt. Đó là một ví dụ minh chứng có thể dịch nghĩa ra tiếng Việt sẽ không hiểu hết nghĩa khi để nguyên gốc.
 
Đúng thì nếu ghi lại một bảng mới sẽ nhanh hơn update toàn thể một bảng cũ. Nhưng đó là trường hợp bảng chỉ giản dị có thế.

Ở đây ta nói chuyện SQL Server chứ không phải Excel, phải không? Đối với một CSDL, việc lập bảng mới xoá bảng cũ không phải cứ muốn làm thì làm. Có ai biết được bảng này có đặt những luật constraints như thế nào? có bao nhiêu khoá chính khoá phụ? index?

Vì vậy, trước khi biết hết chi tiết thiêt kế của CSDL, chỉ có cách update là an toàn.

Về trình độ chuyên nghiệp:
Xét ra thì 2 bảng trên được thiết kế theo chuẩn bậc 2 (2nd order normalisation). Để bảng A dễ tra cứu dữ liệu từ B, người thiết kế thuờng sẽ đặt ra thêm một cái View. Code của cái view này sẽ tương tự như code của bài #6 trên.

Đem cập nhật dữ liệu như thế này là hành động giải chuẩn (denormalisation).
Dân chuyên nghiệp đôi khi phải hy sinh chuẩn để đạt hiệu suất. VD trong tường hợp này, vì 2 bảng quá lớn cho nên người thiết kế có thể muốn tránh phải dùng phép join mỗi lần cần truy cập dữ liệu. Tuy nhiên, khi dùng cách này, người ta cũng đã có sẵn những biện pháp chống dư thừa và lêch dữ liệu (data inconsistency and redundancy)
Do vậy tôi mới nhắc nhở chủ thớt về trình độ chuyên nghiệp.
 
Đúng thì nếu ghi lại một bảng mới sẽ nhanh hơn update toàn thể một bảng cũ. Nhưng đó là trường hợp bảng chỉ giản dị có thế.

Ở đây ta nói chuyện SQL Server chứ không phải Excel, phải không? Đối với một CSDL, việc lập bảng mới xoá bảng cũ không phải cứ muốn làm thì làm. Có ai biết được bảng này có đặt những luật constraints như thế nào? có bao nhiêu khoá chính khoá phụ? index?

Vì vậy, trước khi biết hết chi tiết thiêt kế của CSDL, chỉ có cách update là an toàn.

Về trình độ chuyên nghiệp:
Xét ra thì 2 bảng trên được thiết kế theo chuẩn bậc 2 (2nd order normalisation). Để bảng A dễ tra cứu dữ liệu từ B, người thiết kế thuờng sẽ đặt ra thêm một cái View. Code của cái view này sẽ tương tự như code của bài #6 trên.

Đem cập nhật dữ liệu như thế này là hành động giải chuẩn (denormalisation).
Dân chuyên nghiệp đôi khi phải hy sinh chuẩn để đạt hiệu suất. VD trong tường hợp này, vì 2 bảng quá lớn cho nên người thiết kế có thể muốn tránh phải dùng phép join mỗi lần cần truy cập dữ liệu. Tuy nhiên, khi dùng cách này, người ta cũng đã có sẵn những biện pháp chống dư thừa và lêch dữ liệu (data inconsistency and redundancy)
Do vậy tôi mới nhắc nhở chủ thớt về trình độ chuyên nghiệp.

Nếu đúng là người quản trị CSDL thì đâu ngại những cái gọi là căn bản như khoá chính, khoá phụ, mối quan hệ giữa bảng này và bảng kia... Khi tiến hành công việc quan trọng người ta thường sao lưu trước khi làm, kiểm tra xem cấu trúc dữ liệu như thế nào rồi mới tiến hành gỡ bỏ mối quan hệ... Đảm bảo rằng phải trả lại 100% cấu trúc như cũ sau khi xoá.
 
TB: Cái chữ màu xanh tôi không biết nghĩa là gì. Bạn thường hay bắt bẻ người ta dùng tiếng Tây trong tiếng Việt mà.

Thế thì bạn không hiểu rồi. Không ai chỉ trích người khác chỉ vì dùng tiếng Tây. Nếu có những từ mà mình không biết dịch thế nào, hoặc không biết dịch cho chính xác, đúng nghĩa thì viết tiếng Tây là chuyện bình thường, thậm chí nên khuyến khích. Vì nguyên bản có thể nhiều người hiểu được nhưng một tràng "lảm nhảm" thì chả ai hiểu. Nhưng nếu những từ chắc chắn ai cũng biết mà phải dùng tiếng Tây thì "chửi" là quá đúng. Không có lý gì khi cám ơn, xin lỗi, chào hỏi mà phải dùng tới tiếng Tây để nói với người Việt.

Ngoài ra đã dùng từ Tây thì hãy cố viết cho đúng. Bởi nếu viết sai thì cả tai Việt lẫn tai Tây đều thấy chối.
 
Thế thì bạn không hiểu rồi. Không ai chỉ trích người khác chỉ vì dùng tiếng Tây. Nếu có những từ mà mình không biết dịch thế nào, hoặc không biết dịch cho chính xác, đúng nghĩa thì viết tiếng Tây là chuyện bình thường, thậm chí nên khuyến khích. Vì nguyên bản có thể nhiều người hiểu được nhưng một tràng "lảm nhảm" thì chả ai hiểu. Nhưng nếu những từ chắc chắn ai cũng biết mà phải dùng tiếng Tây thì "chửi" là quá đúng. Không có lý gì khi cám ơn, xin lỗi, chào hỏi mà phải dùng tới tiếng Tây để nói với người Việt.

Ngoài ra đã dùng từ Tây thì hãy cố viết cho đúng. Bởi nếu viết sai thì cả tai Việt lẫn tai Tây đều thấy chối.
Tôi đã viết:
Cái chữ màu xanh tôi không biết nghĩa là gì.

Thì tôi phải thắc mắc, có thể nó quá thường và quen thuộc đối với bạn nhưng đối với tôi và một số người khác không hẳn biết "data mining" là gì. Chắc bạn nghĩ không biết thì kệ bạn, bạn không biết thì tự tìm hiểu lấy, lên google tìm 1 phát ra cả kí... Nhưng hãy suy nghĩ là có cần phải như vậy không?
 
Tôi đã nói biết nó ra sao thì đã là thầy của tôi rồi.
Thắc mắc cái gì nữa.
 
Tôi đã viết:


Thì tôi phải thắc mắc, có thể nó quá thường và quen thuộc đối với bạn nhưng đối với tôi và một số người khác không hẳn biết "data mining" là gì.

"Không biết" là chuyện như cơm bữa, chuyện thường có trong thiên hạ. "Không biết thì hỏi" cũng là chuyện thường.

Nhưng tôi cho là không phải bạn muốn hỏi. Bạn chỉ muốn viết dòng sau đây

Bạn thường hay bắt bẻ người ta dùng tiếng Tây trong tiếng Việt mà

Tôi hiểu được chủ tâm của bạn. Chính vì thế tôi chấm hết không giải thích gì cho bạn nữa.

chấm_hết.com
 
Web KT

Bài viết mới nhất

Back
Top Bottom