2010-10-14 25 views
6

Một số bài viết tôi tìm thấy trên internet so với ISNULL với COALESCE, vì vậy tôi nghĩ câu hỏi của tôi hơi khác một chút.COALESCE và KHÔNG CÓ hiệu suất NULL khi kiểm tra chuỗi trống

Tôi tự hỏi điều gì là tốt hơn về hiệu suất?

SELECT * FROM mytable WHERE mycolumn IS NOT NULL AND mycolumn <> ''; 

Hoặc

SELECT * FROM mytable WHERE COALESCE(mycolumn,'') <> ''; 

Ngoài biểu diễn, được có bất kỳ mối quan tâm khác tôi nên xem xét khi quyết định?

EDIT:

Tôi đang sử dụng Teradata.

Trả lời

7

Phiên bản này là hơi sargable hơn và cho phép một chỉ số để được (khả năng) sử dụng

SELECT * FROM mytable WHERE mycolumn IS NOT NULL AND mycolumn <> ''; 

Nó có thể được đơn giản hóa để

SELECT * FROM mytable WHERE mycolumn <> ''; 

Lý do tại sao tôi nói "nhẹ" và "có khả năng "đó là vị ngữ không bình đẳng có thể có nghĩa là bạn kết thúc với một quét toàn bộ anyway.

+0

Là câu hỏi tiếp theo, nếu chúng tôi biết rằng chỉ mục sẽ được sử dụng, chúng tôi có thể tự động tối ưu hóa sql (hậu trường) và dịch COALESCE (mycolumn, '') <> '' thành cột của tôi KHÔNG NULL và mycolumn <> ''. Tôi có ý nghĩa không? – Russell

+0

Tôi tin rằng bạn có thể thấy rằng NUSI có thể không được sử dụng để đáp ứng sự so sánh bất bình đẳng. Thật đáng để xem EXPLAIN để xác nhận xem trình tối ưu hóa có đang sử dụng NUSI hay không. –

1

Bạn cũng có thể xem xét sử dụng ANSI_NULL ON setting. Điều này sẽ ngầm lọc ra các giá trị null trên một cột mà bạn đưa ra một đối số tìm kiếm. Làm điều này đơn giản hóa truy vấn của bạn, tôi không chắc nó có làm cho nó nhanh hơn không. Về lý luận, về lý thuyết, vì các đối số bộ lọc ít cần được đánh giá và không có hàm nào được sử dụng trong mệnh đề where nên cho phép chọn chỉ mục đầy đủ. Ví dụ: bạn có thể xác định lại truy vấn của mình như sau:

SET ANSI_NULLS ON; 
SELECT * FROM mytable WHERE NOT mycolumn = ''; 

Tôi hy vọng điều này sẽ hữu ích.

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