Hiển thị kết quả từ 1 đến 10 / 10
  1. #1
    Tham gia
    12-04-2013
    Bài viết
    70
    Like
    66
    Thanked 0 Times in 0 Posts

    Câu hỏi, cần giúp đỡ Giúp em xem câu truy vấn nào tối ưu nhất?

    Chào anh chị

    em có 3 table như sau
    NHANVIEN(manv, hoten, phong)
    DEAN(mada,tenda)
    PHANCONG(manv, mada, thoigian)

    câu hỏi: cho biết tên nhân viên có mada ='DA04'.

    Để giải bài này em có 5 cách như sau và tất cả điều cho ra cùng kết quả đúng

    --cách 1 và 2 giống hay khác nhau? nếu khác thì cách nào tối ưu hơn?
    --cach 1
    select tennv
    from nhanvien nv, phancong pc
    where nv.manv = pc.manv and
    mada='DA04'

    --cach2
    select tennv
    from nhanvien nv join phancong pc on nv.manv=pc.manv
    where mada ='DA04'

    --cach 3
    select tennv
    from nhanvien
    where manv in (select manv
    from phancong
    where mada ='DA04')


    --trong trường hợp dưới đây thì cách 4 và 5 có gì khác ko? nếu khác thì cách nào hay hơn
    --cach 4
    select tennv
    from nhanvien nv JOIN (select manv
    from phancong
    where mada='DA04') DA04 on nv.manv=DA04.manv

    --cach5
    select tennv
    from nhanvien nv, ( select manv
    from phancong
    where mada='DA04') DA04
    where nv.manv = DA04.manv
    ==> Anh chị cho em xin lời nhận xét trong từng cách giải
    Em cám ơn nhiều ạ!
    Được sửa bởi saly1012 lúc 09:48 ngày 13-04-2013
    Quote Quote

  2. #2
    Tham gia
    12-04-2013
    Bài viết
    70
    Like
    66
    Thanked 0 Times in 0 Posts

    Buồn quá đi !

    Xin mọi người giúp đỡ em với, cho em xin!

  3. #3
    Tham gia
    14-12-2005
    Bài viết
    139
    Like
    5
    Thanked 10 Times in 8 Posts
    Nếu đơn giản chỉ là Select mình sẽ chọn viết một Stored Procedure hay một View là nhanh nhất. Sau nay sửa cũng dễ thay vì mở code sửa Query rồi upload lại lên host.
    Về xử lý query thực thi cũng nhanh hơn vì gói tin từ clien gởi lên Server nhỏ hơn bạn gởi một đoạn query lớn.

  4. Thành viên Like bài viết này:


  5. #4
    Tham gia
    02-11-2009
    Bài viết
    115
    Like
    0
    Thanked 3 Times in 2 Posts

    Câu truy vấn tối ưu nhất

    Tất cả các cách trên điều như nhau thôi bạn à: thời gian chạy cũng như quy trình chạy hoàn toàn là như nhau
    Bạn có thể xem Executive Plan của nó là sẽ hiểu, câu lệnh của bạn là như thế nhưng khi nó chạy thì nó sẽ chuyển về dạng tối ưu nhất (tự động). Tôi không biết là các phiên bản của sql từ 2005 trờ về trước có tự chuyển hay không nhưng tôi thử thực hiện các câu lệnh của bạn trên MS 2008 thì hoàn toàn thấy nó chỉ thực hiện một exc plan của nó mà thôi. Để test lại bản chạy câu lệnh đó (từng cách 1 --> 5) sau đó bạn chuột phải trên câu lệnh đó chọn Display Estimated Execute Plan là một bảng bên dưới hiện ra bạn trỏ chuột đến từng phân đoạn nó sẽ hiện thị từng giá trị đã ước lượng và thực hiện cho bạn xem.

    Cách sử dụng sp của một bạn đã nói cũng rất tốt bạn có thể tìm hiểu thêm. Nhưng với cách sp(store procedure) thì bảo mật hơn mọi hoạt động truy xuất đều dồn về cho tận nơi nơi của server thực hiện, cách các kia cũng như vậy nhưng các thông tin truyền về cho server bằng sp thì ít hơn nên nó được xem là tốt hơn về khả năng truyền tải thông tin về(theo tôi nghỉ) nhưng điều quan trọng ở việc sử dụng sp là nó BẢO MẬT./

    Chúc bạn tìm hiểu tốt, diễn đàn này cũng là nơi mà tôi đã học những điều mà tôi hiểu về sql.

  6. 2 thành viên Like bài viết này:


  7. #5
    Tham gia
    15-03-2010
    Bài viết
    1,562
    Like
    84
    Thanked 1,571 Times in 860 Posts
    Như gust2012 đã đưa ra, sau khi server plan xong thì các kiểu truy vấn trên như nhau. Vì vậy chỉ có thể trả lời câu hỏi trên theo bình diện lý thuyết mà thôi:

    CSDL liên hệ dựa trên lý thuyết đại số tập hợp cho nên cái nào gần với lô gíc đại số nhất là tối ưu. Thông thường thì lệnh JOIN gần nhất.

    Stored Procedure:

    Nếu nói chuyện tối ưu thì sp chỉ khác ad hoc query ở chỗ sp đã được server dịch và plan rồi, trong khi ad hoc query lúc gởi lên server mới bắt đầu dịch - tuy nhiên thời buổi bây giờ server xịn đều cache query lại cho nên nếu chạy nhiều lần thì lại là việc khác.

    Việc sp dễ bảo trì hơn ad hoc thì chưa hẳn đúng. Cái này còn phải tùy theo framework mà mình dùng.

    Việc sp gởi đi nhanh hơn vì gói nhỏ hơn cũng không hẳn đúng. Mấy cái gói này nhỏ xíu, không đáng gọi là khác nhau. Trong khi đó dữ liệu trả về hằng triệu MB mới là quan trọng.

  8. 3 thành viên Like bài viết này:


  9. #6
    Tham gia
    10-01-2009
    Location
    Hà Nội
    Bài viết
    148
    Like
    3
    Thanked 19 Times in 16 Posts
    Quote Được gửi bởi saly1012 View Post
    Chào anh chị

    em có 3 table như sau
    NHANVIEN(manv, hoten, phong)
    DEAN(mada,tenda)
    PHANCONG(manv, mada, thoigian)

    câu hỏi: cho biết tên nhân viên có mada ='DA04'.

    Để giải bài này em có 5 cách như sau và tất cả điều cho ra cùng kết quả đúng

    --cách 1 và 2 giống hay khác nhau? nếu khác thì cách nào tối ưu hơn?
    --cach 1
    select tennv
    from nhanvien nv, phancong pc
    where nv.manv = pc.manv and
    mada='DA04'

    --cach2
    select tennv
    from nhanvien nv join phancong pc on nv.manv=pc.manv
    where mada ='DA04'

    --cach 3
    select tennv
    from nhanvien
    where manv in (select manv
    from phancong
    where mada ='DA04')


    --trong trường hợp dưới đây thì cách 4 và 5 có gì khác ko? nếu khác thì cách nào hay hơn
    --cach 4
    select tennv
    from nhanvien nv JOIN (select manv
    from phancong
    where mada='DA04') DA04 on nv.manv=DA04.manv

    --cach5
    select tennv
    from nhanvien nv, ( select manv
    from phancong
    where mada='DA04') DA04
    where nv.manv = DA04.manv
    ==> Anh chị cho em xin lời nhận xét trong từng cách giải
    Em cám ơn nhiều ạ!
    - Cách 1 và cách 2 là cùng 1 cách nhưng viết theo 2 chuẩn khác nhau (1)
    - Cách 4 và cách cũng tương tự, chỉ là 1 cách (2)

    Đến đây tập lời giải của bạn thực chất chỉ còn là 3 lời giải (1), (2), và cách 3 (3)

    Sau khi xem excution plan ( thực ra điều này cũng chẳng có ý nghĩa gì nếu môi trường test là ảo có vài chục bản ghi) thì đều có cách xử lý như nhau.

    Do vậy cả 5 cách trên đều ra kết quả và tốc độ xử lý như nhau.

    Trong trường hợp bạn muốn phân tích kĩ hơn thì có thể đọc excution plan thì sẽ thấy. Tôi chưa test với trường hợp của bạn nhưng có thể nói SQL Server sẽ xử lý như thế này trong cả 3 cách giải

    1 - Tìm ra rows có mada ='DA04' trong bảng PHANCONG bằng cách sử dụng Index, hoặc Table Scan.

    Cách (1) "có thể" thực hiện bước này trước.
    Thực ra có thể hiểu bài toán ở đây có 2 phép toán. 1 là Join, 2 là lọc ra các rows có mada ='DA04'.
    Thứ tự thực hiện thường sẽ là lọc trước, sau đó Join trong đa số các trường hợp (ngoại lệ nếu có thời gian tôi sẽ trình bày kĩ hơn nhưng chắc chắn nó không phổ biến)

    Cách (2) sẽ xử lý bước này đầu tiên do bạn thực hiện 1 bảng có sẵn với 1 bảng chưa xác định, nên nó phải thực hiện bước này để biết là sẽ phải Join với cái gì

    Cách (3) cũng vậy do mệnh đề trong IN là chưa rõ ràng. Cần chạy trước để trả về tập giá trị trong IN

    2 - Với tập manv thu được từ bước 1, Tiếp tục sử dụng Index hoặc Table Scan để tìm ra rowid tương ứng với manv đó trong bảng NHANVIEN

    3 - Với rowid tương ứng đó, lookup lại bảng NHANVIEN (Lookup chỉ khi bạn có Index) để lấy ra tên nhân viên

    Như vậy cả 3 cách trên đều có cách xử lý như nhau trong đa số trường hợp, chỉ là cách viết có khác nhau Một số trường hợp đặc biệt có thể xảy ra khiến cho cách (1) có thể có execution plan khác với 2 cách trên nhưng cũng không thể đánh giá là nó tốt hơn hay tồi hơn nếu không đưa dữ liệu cụ thể.

    Thân
    Oracle DBA - Hướng dẫn Oracle HCM Y!M red_devilic

  10. Thành viên Like bài viết này:


  11. #7
    Tham gia
    12-04-2013
    Bài viết
    70
    Like
    66
    Thanked 0 Times in 0 Posts
    em cám ơn các anh chị đã nhiệt tình giúp em giải đáp thắc mắc, em đã hiểu hơn rồi ạ, cám ơn các anh chị nhiều nhiều.

  12. #8
    Tham gia
    08-01-2010
    Location
    Washington, DC
    Bài viết
    168
    Like
    2
    Thanked 16 Times in 16 Posts
    Quote Được gửi bởi megaownage View Post
    Nếu nói chuyện tối ưu thì sp chỉ khác ad hoc query ở chỗ sp đã được server dịch và plan rồi, trong khi ad hoc query lúc gởi lên server mới bắt đầu dịch - tuy nhiên thời buổi bây giờ server xịn đều cache query lại cho nên nếu chạy nhiều lần thì lại là việc khác.
    Đính chính cho bác là stored procedure được lưu trong server ở sạng text (source code). Khi nào được gọi đến mới được biên dịch (nếu không có sẵn trong cache), và phương án thực thi cũng được tạo ra vào thời điểm đó.
    Về các ý kiến ủng hộ và phản đối dùng SP vs. ad hoc code, mời các bác xem thêm ở đây:
    http://www.sqlviet.com/blog/vi-sao-n...trong-ung-dung

  13. #9
    Tham gia
    25-04-2013
    Bài viết
    7
    Like
    1
    Thanked 1 Time in 1 Post
    Cái title đã không "tối ưu" rồi, đã "tối ưu" thì không có "tối ưu nhất" nhé!

  14. #10
    Tham gia
    09-05-2013
    Bài viết
    4
    Like
    0
    Thanked 0 Times in 0 Posts
    tùy bạn hiểu cách nào hay hơn thui...hjhjhj

Tags for this Thread

Bookmarks

Quy định

  • Bạn không thể tạo chủ đề mới
  • Bạn không thể trả lời bài viết
  • Bạn không thể gửi file đính kèm
  • Bạn không thể sửa bài viết của mình
  •