Thiết Lập Cho xp_cmdshell

SQL Server là hệ quản trị dữ liệu, khả năng chính của nó là lưu trữ và truy xuất dữ liệu. Tuy nhiên đôi lúc bạn cần thực hiện một số thao tác của windows từ SQL Server, ví dụ khi bạn cần viết sql script để copy file từ folder này sang folder khác; hoặc tự động restore từ file backup mới nhất dựa theo ngày tạo (tên file không biết trước). SQL Server cung cấp thủ tục xp_cmdshell trong master database để làm việc này.
Để có thể gọi đến xp_cmdshell đòi hỏi một vài bước thiết lập.
Nếu bạn là DBA với quyền sysadmin, bạn cần cấu hình lại server để bật xp_cmdshell (khi SQL Server mới cài đặt tính năng này bị tắt): … đọc tiếp »

Posted on 14/3/2014 by Vũ Huy Tâm | Categories: Bảo mật, Database Administration, Uncategorized

[LINH TINH] Từ Vựng Lớp 3

Con trai mình học lớp 3, thấy có bảng từ có mấy từ khá khó. Không nói về ngôn ngữ tiếng Anh hay tiếng Việt, nhưng những khái niệm khá trừu tượng như estimate (ước lượng), tone (giọng điệu của một bài viết), hay generalization (khái quát hóa). Hồi lớp 3 của mình thì chắc chưa được học mấy cái này (dù bằng tiếng Việt). Không biết trẻ con ở VN giờ học thế nào?
Hỏi thêm: có từ nào bạn chưa biết? (Xem ảnh dưới) … đọc tiếp »

Posted on 28/2/2014 by Vũ Huy Tâm | Categories: Linh tinh

LEFT JOIN Với Mệnh Đề WHERE

Trong bài Một Vài Kiểu Viết Join tôi có đưa ra một số cách viết câu lệnh join tương đương nhau, trong đó điều kiện JOIN có thể chuyển qua lại với mệnh đề WHERE. Tuy điều này đúng với INNER JOIN, khi bạn dùng LEFT JOIN sẽ dẫn đến kết quả sai ngoài mong đợi. Hãy xem xét qua ví dụ: bạn có một database về bán hàng điện thoại, gồm có hai bảng là MatHang bao gồm các loại điện thoại, và BanHang chứa các giao dịch bán hàng. Dữ liệu như sau: … đọc tiếp »

Posted on 26/2/2014 by Vũ Huy Tâm | Categories: SQL Server Programming

Di chuyển Database File

Khi bạn cần chuyển database file (data file hoặc log file) sang ổ cứng khác để giải phóng không gian đĩa hiện tại, một cách hiển nhiên bạn có thể làm là backup database đó hoặc lấy file backup gần đây nhất, và restore lại trên cùng server với lựa chọn đặt file sang ổ đĩa mới. Bài viết Di Chuyển File Khi Khôi Phục Dữ liệu mô tả chi tiết cách làm này. Tuy nhiên trong suốt quá trình restore, database sẽ không truy cập được. Nếu database lớn, thời gian restore sẽ kéo dài gây gián đoạn sử dụng cho người dùng. Một cách làm đơn giản hơn là đặt database thành offline và copy file sang thư mục mới, như ví dụ dưới đây:

ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE --đóng hết các connection tới database
 
ALTER DATABASE MyDB SET OFFLINE --đặt database thành offline
 
ALTER DATABASE MyDB MODIFY FILE 
(
   Name = MyDB,
   Filename = 'N:\DATA\MyDB.MDF' --Giả dụ N: là ổ đĩa mới
)

Điểm quan trọng nhất trong đoạn lệnh trên là lệnh ALTER DATABASE thứ ba, lệnh này cập nhật system catalog để báo cho hệ thống biết file giờ nằm ở đâu. Bước tiếp theo bạn cần copy file MyDB.MDF từ thư mục hiện tại sang thư mục mới N:\DATA\, bước này nằm ngoài SQL Server và bạn cần dùng windows để copy. Sau khi copy xong, bạn quay lại Management Studio và chạy hai lệnh:

ALTER DATABASE MyDB SET ONLINE --đặt database trở lại online
 
ALTER DATABASE MyDB SET MULTI_USER --đặt trở lại chế độ nhiều người dùng

Đến đây bạn có thể xóa file MyDB.MDF ở folder cũ và quá trình như vậy là hoàn tất.

Posted on 24/2/2014 by Vũ Huy Tâm | Categories: Database Administration

Khai Trương Trang SQL Việt Q&A

Hân hạnh giới thiệu cùng các bạn trang web mới SQL Việt Q&A tại địa chỉ www.sqlviet.com/qa. Với mục đích chính giành cho hỏi – đáp về SQL Server cho cộng đồng IT Việt Nam, website này cung cấp các tính năng thuận tiện, giúp cho việc hỏi và trả lời cũng như việc tìm kiếm trở nên dễ dàng hơn. Các tính năng này đòi hỏi các bạn phải thực hiện một bước đăng ký tài khoản đơn giản, hy vọng đó không phải là trở ngại đáng kể.

Trang hỏi-đáp trên SQL Việt Blog tại địa chỉ sqlviet.com/blog/hoi-dap sẽ được đóng lại trong vòng 1 tuần nữa để hoàn thành nốt những câu hỏi còn dang dở. Sau khi đóng, toàn bộ nội dung vẫn được giữ nguyên để phục vụ mục đích tra cứu. Tuy nhiên, trang này sẽ không nhận thêm câu hỏi mới.

Để đưa ra thắc mắc, chia sẻ hiểu biết và tham gia bàn luận, xin mời các bạn cùng tham gia SQL Việt Q&A tại: www.sqlviet.com/qa

Posted on 19/2/2014 by Vũ Huy Tâm | Categories: Community, Cộng đồng

Tâm Sự Cuối Năm

Trước hết mình chân thành cám ơn các bạn đã đến thăm trang sqlviet blog, các bạn là lý do và động lực duy nhất giúp mình tiếp tục duy trì blog này (viết ra không có ai đọc thì chán chết). Hy vọng các bạn đã học hỏi được ít nhiều kiến thức về SQL Server tại đây. Vẫn còn rất nhiều thứ để viết, có rất nhiều thứ để chia xẻ, chắc chắn mình sẽ tiếp tục viết. Tuy nhiên do quĩ thời gian eo hẹp mà mình không thể giành thời gian cho nó nhiều như mong muốn. Mặt khác mình cũng không muốn các bạn vào đây nhìn nó như một blog “chết”, mọi thứ nguội lạnh. Vì thế mình mới có vài dòng tâm sự này, mong các bạn hưởng ứng để giúp sqlviet blog luôn là điểm trao đổi kiến thức nhộn nhịp về SQL Server.

Về phía mình, mình sẽ cố gắng giành một số giờ (ví dụ một buổi) hàng tuần để trả lời những câu hỏi tồn đọng.

Về phía các bạn có kinh nghiệm như bạn Red Devilic hay bạn nguoihanoi và nhiều bạn khác, mong các bạn ghé thăm thường xuyên hơn và giúp trả lời các bạn đang cần giải đáp. Nếu câu hỏi thuộc về một bài viết, các bạn đừng coi trách nhiệm trả lời chỉ là của tác giả bài viết, mà nên coi đây là dịp để mình giúp đỡ các bạn khác. Ngoài ra, mình rất mong các bạn có thể viết những bài hoàn chỉnh, mình sẽ đăng liền tại đây. Mục đích tối cao ở đây là chia xẻ kiến thức. Bài viết ở đây không phải là một bài báo, cuốn sách, hay bản luận văn, nên cách hành văn hay bố cục bài chỉ là thứ yếu. Giá trị duy nhất là lượng kiến thức chứa trong nó.

Về phía các bạn đặt câu hỏi, mình chủ trương không có câu hỏi dở hơi (no stupid question), nhất là khi đây là lĩnh vực mới của bạn. Vì thế các bạn cứ mạnh dạn đặt câu hỏi nếu nó giúp thông thoáng mạch hiểu của bạn. Mình chỉ có một góp ý là các bạn nên cố gắng hỏi một cách có trách nhiệm hơn – đặt câu hỏi cho thấy mình đã có nỗ lực nhất định trong việc tìm kiếm lời giải. Cái này mình không đánh đồng tất cả và phần lớn các câu hỏi mình thấy là chính xác và hợp lý. Tuy nhiên có những câu nên được cải thiện điển hình là khi các bạn copy nguyên cả bài tập lên đây. Những câu hỏi như vậy không khuyến khích người khác trả lời, vì nó không nhằm truy tìm kiến thức (sẽ có tác dụng lâu dài cho người hỏi) mà chỉ nhằm tìm kiếm lời giải có sẵn cho bài toán (tác dụng rất ngắn hạn). Thay vì làm như vậy, các bạn nên giành thêm thời gian tìm hiểu bài toán và chỉ hỏi những điểm mấu chốt mà nhờ nó sẽ giúp bạn giải được toàn bộ bài toán. Ví dụ nếu bài tập qui về join nhiều bảng, dùng subquery, hay dùng hàm aggregate… bạn nên hỏi về những thứ này thay vì post toàn bộ bài tập. Chắc chắn là quá trình này sẽ giúp bạn tiến rất nhiều vì nó là kết quả cộng hưởng từ cả hai phía người hỏi và người trả lời. Ngôn ngữ SQL nói chung sẽ vẫn là công nghệ nền tảng trong nhiều năm tới. Cho dù bạn dùng công nghệ chính là gì, .Net, Java, hay Android… khả năng cao là bạn sẽ cần dùng đến lập trình SQL không ít thì nhiều.

Mỗi bạn đến đây với một mục đích khác nhau, nhưng mong rằng mỗi lần ghé thăm các bạn đều cảm thấy hài lòng, vì mình vừa tìm hiểu ra một điều lý thú hoặc vì mình vừa giúp người khác hiểu ra một điều lý thú.

Nhân dịp cuối năm, mình xin chúc các bạn một năm làm việc thành công, những khó khăn sắp đến hồi kết, và những dự định trong năm tới đều sẽ trở thành hiện thực.

Posted on 12/12/2013 by Vũ Huy Tâm | Categories: Community, Cộng đồng, Linh tinh

Partition Bảng Đã Có Sẵn

Trong loạt bài về phân đoạn bảng và index, tôi đã giới thiệu về kiến trúc phân đoạn của SQL Server. Các ví dụ nêu trong các bài đó đều sử dụng bảng được tạo lần đầu và áp dụng phân đoạn lên nó. Một câu hỏi thường gặp là, làm thế nào để phân đoạn một bảng đã có sẵn dữ liệu? Bảng này có thể chưa được phân đoạn, hoặc đã được phân đoạn theo một cách khác, nay bạn muốn phân đoạn lại theo cách hợp lý hơn.
Có một cách làm thực ra rất đơn giản mà nếu bạn để ý một tẹo là thấy ngay, đó là trong SQL Server clustered index chính là bảng, nói cách khác là bảng được lưu trữ thành một cây index và cây này chính là clustered index. Vì vậy để phân đoạn bảng bạn chỉ việc phân đoạn clustered index của nó, bằng cách tạo lại clustered index trên partition scheme. … đọc tiếp »

Posted on 31/10/2013 by Vũ Huy Tâm | Categories: Database Administration, Index, Table partitioning

Bảng Tạm và Biến Kiểu Bảng

Bảng tạm (temporary table) và biến kiểu bảng (table variable) là 2 phương tiện để lưu dữ liệu tạm thời khi đang xử lý. Bảng tạm có tên bắt đầu bằng dấu “#”, bạn có thể tạo bảng tạm bằng lệnh CREATE TABLE và khai báo các cột của nó; hoặc bạn có thể vừa tạo và thêm dữ liệu vào bằng SELECT INTO. Với biến kiểu bảng thì bạn phải khai báo trước mới có thể dùng được, và khi khai báo bạn phải định nghĩa các cột của nó:

--tạo bảng trực tiếp
CREATE TABLE #t1 (C VARCHAR(50))
 
--vừa tạo bảng và thêm dữ liệu vào
SELECT C
INTO #t2
FROM dbo.SomeTable
 
--khai báo biến kiểu bảng
DECLARE @t TABLE(C VARCHAR(50))
INSERT INTO @t SELECT 1
SELECT * FROM @t

Bảng tạm khai báo ở trên gọi là bảng tạm cục bộ (local temp table), SQL Server còn cung cấp bảng tạm toàn cục (global temp table) với tên bắt đầu bằng hai dấu “##”. Trong bài viết này khi nhắc đến bảng tạm là tôi chỉ nói về bảng tạm cục bộ, vì bạn sẽ chủ yếu dùng đến loại này. … đọc tiếp »

Posted on 9/10/2013 by Vũ Huy Tâm | Categories: SQL Server Programming

Tham Số Fill Factor

Trong buổi Seminar lần trước, có bạn đã hỏi ý nghĩa của tham số FILL FACTOR là gì và sử dụng nó có ý nghĩa như thế nào. Bẵng đi gần 2 năm, gần đây tôi có làm việc lại với SQL Server và đụng chạm đến tham số này.

I. Rebuild và Reorganize Index

Với những bảng có sử dụng Index mà những thao tác cập nhật, thêm dữ liệu (UPDATE, INSERT) xảy ra nhiều thì những Index trên bảng đó sẽ bị phân mảnh. Sự phân mảnh của Index được chia làm 2 loại:
Internal Fragmentation: Khi trang nhớ (Page) lưu Index có nhiều khoảng trống, dẫn đến việc SQL Server sẽ phải mất thêm nhiều chi phí (cần phải đọc nhiều trang hơn) khi quét qua toàn bộ Index.
Để dễ hình dung, bạn có thể hiểu nếu toàn bộ nội dung của Index có kích thước tương đương với 5 trang nhớ, nhưng mỗi trang nhớ chỉ lưu được 50%, như vậy cần tới 10 trang đế lưu index và bạn sẽ phải quét qua tổng cộng 10 trang này khi cần đọc toàn bộ index. Chi phí sẽ tăng lên gấp đôi so với trường hợp tối ưu. … đọc tiếp »

Hội thảo SQL Server – HCMC 2013

Buổi hội thảo đã diễn ra đúng như dự định. Cảm ơn các bạn đã đến tham dự, hy vọng mỗi bạn ra về đều thu lượm được một vài điều bổ ích. Dưới đây là link download slide và một vài hình ảnh trong buổi hội thảo:
Database Job Overview.pptx
DB Tuning Performance Overview.pptx




Thông báo ban đầu

Bạn Vũ Minh Tâm (red.devilic@gmail.com), một chuyên gia về SQL và là tác giả quen thuộc trên trang SQL Việt, sẽ tổ chức một buổi hội thảo free về SQL Server tại Thành phố Hồ Chí Minh vào ngày 22/12, Chủ nhật. Nội dung chi tiết ở dưới đây.

Thời gian: Diễn ra cả ngày 22/12/2013
Địa điểm: Tòa nhà ATHENA 92 NGuyễn Đình CHiểu, P. Đa Kao, Q1 TP Hồ Chí Minh
Sáng 9h-11h30:

  • Giới thiệu chung về vị trí, nghề nghiệp, các công việc….liên quan đến CSDL.
  • Kiến trúc cơ bản RDBMS.
  • OLTP vs DW.

Chiều 1h30-4h: Tối ưu hóa CSDL cơ bản.
4h-4h30: Q&A.

Giữa giờ có thể có tea break.
Các bạn đến tham dự (kể cả các bạn đã comment trong post thông báo này) xin hãy điền form đăng ký ngắn tại đây:
docs.google.com/forms/d/1Zqpd7ANUSJ5NXg9jpOWf-pCO6NMTVrolW7jEPoaS3uw/viewform

Posted on 7/10/2013 by Vũ Huy Tâm | Categories: Cộng đồng