2010-05-28 55 views
15

thể trùng lặp:
Hidden Features of SQL ServerKỹ thuật ẩn SQL?

những kỹ thuật chuyên nghiệp/tinh tế mà SQL cung cấp và không nhiều người biết về mà cũng cắt mã và cải thiện hiệu suất là gì?

ví dụ: Tôi vừa mới học cách sử dụng các câu lệnh CASE bên trong các hàm tổng hợp và hoàn toàn thay đổi cách tiếp cận của tôi về mọi thứ.

Còn những người khác không?

CẬP NHẬT: Về cơ bản, bất kỳ nhà cung cấp nào. Nhưng PostgreSQL nếu bạn muốn chỉ tập trung vào một: D

+3

Đánh dấu là bản sao của [Tính năng ẩn của SQL Server] (http://stackoverflow.com/questions/121243/hidden-features-of-sql-server) - việc mở rộng này cho tất cả các nền tảng chỉ đặt điều này sâu hơn vào "chủ quan"/danh mục NARQ. – Aaronaught

+0

vui lòng đọc bản cập nhật. Tôi cũng đang tìm kiếm các kỹ thuật sql tốt đẹp phổ biến. Giống như trong ví dụ của tôi áp dụng cho tất cả các hàm RDBMSes – AlexRednic

Trả lời

6

SQL GROUP BY - CUBE, ROLLUP clauses

phân tích (AKA xếp hạng, AKA cửa sổ) có chức năng IE:

  • ROW_NUMBER
  • RANK
  • DENSE_RANK
  • NTILE
  • VỀ

Lần: Bình thường và Materialized

Thật khó để nói nhiều mà không tham khảo cú pháp cụ thể nhà cung cấp

+0

Xếp hạng rất hữu ích. –

3

Người ta không sử dụng được xây dựng trong các chức năng đầy đủ và nên làm lại cái bánh xe, ở đây là Ten SQL Server Functions That You Have Ignored Until Now

Sử dụng NEWSEQUENTIALID() thay vì NEWID() trên cột phân định duy nhất sẽ thực hiện tốt hơn vì nó sẽ không làm chia tách trang và do đó phân mảnh

Sử dụng một bảng auxilarry số để bạn có thể nhanh chóng làm một số thiết lập dựa trên lôgic

ví dụ

select DATEADD(m,number,'20010101') 
from master..spt_values 
where type = 'P' 
order by 1 

BẤT CỨ, TẤT CẢ và MỘT SỐ

+0

Tôi đã không sử dụng BẤT CỨ/TẤT CẢ/MỘT SỐ trong * độ tuổi *, bằng cách sử dụng JOINs –

+0

Mục thứ ba thường được gọi là sử dụng bảng "kiểm đếm" và có thể rất hữu ích trong việc tìm các khoảng trống theo trình tự. –

+0

Những người thực sự không biết về GETUTCDATE()? –

6

OVER Clause (SQL Server) aka Window functions (PostgreSQL) hoặc analytic functions (Oracle)

Điều này rất hay được biết với tôi. Bạn có thể làm đủ mọi thứ tiện dụng như đếm, phân vùng, xếp hạng, v.v.

+0

Tương tự với các chức năng cửa sổ PostgreSQL - http://www.postgresql.org/docs/current/static/tutorial-window.html - với nhiều cú pháp tương tự. Dường như là câu trả lời cho một nửa số câu hỏi sql tôi đã trả lời gần đây ... – araqnid

5
SELECT... EXCEPT SELECT... 

SELECT... INTERSECT SELECT... 

có thể hữu ích (và đáng lo ngại hiệu quả) tại pickout ra các hàng khác nhau hoặc chung - và đó là cho tất cả cột ở hàng - giữa các bộ. Điều này cực kỳ hữu ích khi bạn có nhiều cột.

2

Pivot

Đó là mới vào năm 2005 (mà tôi biết là một thời gian dài trước đây, nhưng có vô số người vẫn còn sử dụng 2000). Lưu một loạt các "trường hợp khi tên = 'tim' sau đó giá trị khác 0 kết thúc" để xây dựng cốt liệu của bạn cuối tuần này.

+0

PIVOT/UNPIVOT được hỗ trợ bởi SQL Server 2005+, Oracle 11g +. Tôi tin rằng đó là ANSI. CASE được hỗ trợ rộng rãi hơn, làm cho nó trở thành sở thích của tôi trên PIVOT vì lợi ích của tính di động. –

6

EXISTS. Tôi ngạc nhiên là có bao nhiêu người vẫn sử dụng COUNT (*) khi kiểm tra sự tồn tại hoặc các mệnh đề IN (SELECT ...) khi EXISTS có thể thực hiện công việc nhanh hơn nhiều.

thường xuyên Hầu hết các bạn có thể thấy:

SELECT @MyVar = Count(*) FROM Table1 WHERE.... 
If @MyVar <> 0 
BEGIN 
    --do something 
END 

khi

IF EXISTS(SELECT 1 FROM Table1 WHERE...) 
BEGIN 
    --don something 
END 

phải lúc nào cũng tốt hơn.

+0

không phải là tốt hơn để tham gia và tổng hợp hơn sử dụng truy vấn phụ? : D – AlexRednic

+0

Tham gia bên ngoài thường nhanh hơn (ít nhất là trong SQL Server 2000) hơn là không tồn tại trừ khi tập hợp không hoàn thành vị từ hiện hữu nhỏ hơn nhiều so với bảng. Tuy nhiên, hiệu suất tổng thể sẽ phụ thuộc phần lớn vào việc trình tối ưu hóa truy vấn có được quyền truy vấn hay không - điều này có thể sẽ làm trong hầu hết các trường hợp. Với trường hợp này, EXISTS có thể tốt hơn nếu nó làm cho truy vấn dễ đọc hơn. – ConcernedOfTunbridgeWells

1

dưới MySQL, sử dụng từ khóa "STRAIGHT_JOIN". Nếu bạn biết dữ liệu của mình và mối quan hệ của bảng tra cứu mà bạn đang tham gia, đôi khi trình tối ưu hóa xem xét các bảng nhỏ hơn làm cơ sở tham gia và cố gắng truy vấn số lượng bản ghi "ít hơn" vào bảng "lớn hơn" của bạn đáng kể nhiều thời gian hơn. Nếu bảng chính của bạn là đầu tiên trong "từ", và "tiêu chí" của nó lên phía trước, tham gia thẳng sẽ nhấn đầu tiên, tham gia vào phần còn lại của các bảng và được thực hiện trong thời gian không.

Tôi đã phải làm điều này đối phó với dữ liệu gov't của hơn 10 triệu bản ghi đã tham gia vào khoảng 15 bảng tra cứu. Nếu không tham gia thẳng, hệ thống sẽ bị nghẹt sau 20 giờ. Thêm Straight-join, nó đã được thực hiện trong khoảng 2 giờ.

1

Trong Sql Server, mệnh đề HAVING. Đặc biệt, HAVING (COUNT DISTINCT FOO)> @SomeNumber để nhanh chóng tìm các hàng có nhiều giá trị khác biệt cho một nhóm nhất định.

Từ MSDN:

USE AdventureWorks2008R2 ; 
GO 
SELECT SalesOrderID, SUM(LineTotal) AS SubTotal 
FROM Sales.SalesOrderDetail 
GROUP BY SalesOrderID 
HAVING SUM(LineTotal) > 100000.00 
ORDER BY SalesOrderID ; 
1

Từ PostgreSQL Documents:

Table partitioning

Phân vùng dùng để tách một cách logic một bảng lớn thành từng miếng vật lý nhỏ hơn là những gì. Phân vùng có thể cung cấp một số lợi ích:

  • Hiệu suất truy vấn có thể được cải thiện đáng kể đối với một số loại truy vấn nhất định.

  • Hiệu suất cập nhật cũng có thể được cải thiện, vì mỗi phần của bảng có chỉ mục nhỏ hơn chỉ mục trên toàn bộ tập dữ liệu sẽ là.Khi một chỉ mục không còn phù hợp một cách dễ dàng trong bộ nhớ, cả hoạt động đọc và ghi trên chỉ mục sẽ tiếp tục truy cập đĩa nhiều hơn.

  • Xóa hàng loạt có thể được thực hiện bằng cách xóa một trong các phân vùng, nếu yêu cầu đó được lên kế hoạch vào thiết kế phân vùng. DROP TABLE nhanh hơn nhiều so với DELETE hàng loạt, để không nói gì về chi phí VACUUM tiếp theo.

  • Dữ liệu hiếm khi được sử dụng có thể được di chuyển sang phương tiện lưu trữ rẻ hơn và chậm hơn.

1

Bảng có nguồn gốc để tạo "biến" và giảm mã lặp lại.

Điều gì đó tương tự nhưng có thể được mở rộng. Rõ ràng "Giá trị trung bình" có thể là một phép tính phức tạp hơn nhiều, và nếu bạn có một số nó giúp làm sạch mã.

Select *, case when AverageValue > 50 then 'Pass' Else 'Fail' end 
From 
(
Select ColA, ColB, AverageValue = (ColA+ColB)/2 
From InnerMostTable 
) AverageValues 
Order By AverageValue Desc 
+0

xem câu trả lời của leonbloy. thanh lịch hơn nhiều. – AlexRednic

2

Common Table Expressions (SQL Server 2005+)

WITH x AS (
    SELECT 1 as A, 2 as B, 3 as C 
), 
WITH y AS (
    SELECT 4 as A, 5 as B, 6 as C 
    UNION 
    SELECT 7 as A, 8 as B, 9 as C 
) 
SELECT A, B, C FROM x 
UNION 
SELECT A, B, C FROM y 

Họ thực sự tốt đẹp cho phá vỡ các truy vấn của bạn thành những bước

1

Trong SQL Server bằng cách sử dụng Convert() chức năng để có được ngày tháng trong định dạng mm/dd/yyyy thay vì hàm Cast()

SELECT convert(datetime, '1/1/2010', 101) 

Tôi sử dụng tất cả thời gian

Các vấn đề liên quan