2010-07-07 24 views
9

Tôi cố gắng để hiểu những gì các +0 vào cuối truy vấn 9i Oracle này có nghĩa là:không +0 có ý nghĩa gì sau ORDER BY trong Oracle

SELECT /*+ INDEX (a CODE_ZIP_CODE_IX) */ 
     a.city, 
     a.state, 
     LPAD(a.code,5,0) ZipCode, 
     b.County_Name  CoName, 
     c.Description  RegDesc, 
     d.Description  RegTypeDesc 
FROM TBL_CODE_ZIP a, 
    TBL_CODE_COUNTY b, 
    TBL_CODE_REGION c, 
    TBL_CODE_REGION_TYPE d 
WHERE a.City = 'LONDONDERRY' 
    AND a.State = 'NH' 
    AND lpad(a.Code,5,0) = '03038' 
    AND a.Region_Type_Code = 1 
    AND b.County(+) = a.County_Code 
    AND b.STATE(+) = a.STATE 
    AND c.Code(+) = a.Region_Code 
    AND d.Code(+) = a.Region_Type_Code 
ORDER BY a.Code +0 

Bất kỳ ý tưởng?

Chú ý: Tôi không nghĩ rằng nó đã làm với tăng dần hoặc giảm dần kể từ khi tôi không thể thêm asc hoặc desc giữa a.Code và +0 và tôi có thể thêm asc hoặc desc sau +0

+0

Đây có phải là cách để buộc a.Xóa vào một kiểu dữ liệu số bằng cách gây ra chuyển đổi ngầm không? –

+0

a.Code được chỉ định là NUMBER (5) –

+0

Mọi thứ trở nên rõ ràng hơn khi mã được đặt đúng cách. – APC

Trả lời

8

+ 0 là một thủ thuật trong những ngày của trình tối ưu hóa dựa trên quy tắc, điều này làm cho không thể sử dụng chỉ mục trên cột số. Tương tự, họ đã thực hiện một || '' cho các cột chữ và số.

Đối với truy vấn của bạn, kết luận duy nhất tôi có thể tiếp cận sau khi kiểm tra xem tác giả của nó có đang vật lộn với hiệu suất không. Nếu (đó là giả định của tôi) chỉ mục CODE_ZIP_CODE_IX là một chỉ mục trên TBL_CODE_ZIP (Mã), sau đó truy vấn sẽ không sử dụng nó, mặc dù nó được gợi ý để sử dụng nó. Người sáng tạo có thể không biết rằng bằng cách sử dụng LPAD (a.code, 5,0) thay vì a.code, chỉ mục không thể được sử dụng. Một mệnh lệnh theo mệnh đề lấy tập kết quả trung gian của nó - nằm trong bộ nhớ - và sắp xếp nó. Không có chỉ mục là cần thiết cho điều đó. Nhưng với + 0 có vẻ như anh ta đang nghĩ đến việc vô hiệu hóa nó.

Vì vậy, các thủ thuật được sử dụng không hiệu quả và giờ đây chỉ gây hiểu nhầm, như bạn đã phát hiện ra.

Trân trọng, Rob.

PS1: Tốt hơn nên sử dụng LPAD (TO_CHAR (a.code), 5, '0') hoặc TO_CHAR (a.code, 'fm00009'). Sau đó, nó là rõ ràng những gì bạn đang làm với datatype.

PS2: Truy vấn của bạn có thể được hưởng lợi từ việc sử dụng chỉ mục dựa trên hàm trên LPAD (TO_CHAR (a.code), 5, '0') hoặc bất kỳ biểu thức nào bạn sử dụng để giữ lại mã zip của bạn.

7

My đoán là a.code là một VARCHAR2 có chứa một chuỗi số, và +0 là có hiệu quả đúc nó đến một số để sắp xếp sẽ là số thay vì alpha

Bạn sẽ có thể thêm ASC/DESC sau +0

+0

@MarkBaker CODE là NUMBER (5) ... nếu có ích. Tuy nhiên, tôi đã có thể chỉ định asc hoặc desc sau và nó đã hoạt động! –

+2

Có vẻ là một cách kỳ lạ để làm điều đó - có một lợi thế để thực hiện nó theo cách này thay vì chỉ sử dụng 'to_number (a.code)'? – FrustratedWithFormsDesigner

+0

@FrustratedWithFormsDesigner - viết ngắn hơn? Nếu không thì không có sự khác biệt đáng kể (ngoài việc kiểm soát định dạng bằng TO_NUMBER). –

3

Lưu ý: Tôi đã xóa câu trả lời này, vì Mark B là người đánh máy nhanh hơn. Tuy nhiên, tôi đã tái instated nó bởi vì tôi nghĩ rằng có một số giá trị trong việc chứng minh những gì có thể có được những mục đích cơ bản của SQL mà Lucas đăng.


Giả sử CODE là cột VARCHAR2 chứa chuỗi chữ số (mã zip). Vấn đề là varchars sắp xếp thành chuỗi không phải là số. Thêm một số không đến MÃ spawns một diễn viên tiềm ẩn đến số, và do đó phân loại số lượng:

SQL> select id, code 
    2 from t72 
    3 order by code 
    4/

     ID CODE 
---------- ----- 
     1 1 
     2 11 
     3 111 
     4 12 

SQL> select id, code 
    2 from t72 
    3 order by code+0 
    4/

     ID CODE 
---------- ----- 
     1 1 
     2 11 
     4 12 
     3 111 

SQL> 

Nếu các mã được lưu trữ đã được trái đệm bằng zero thì các diễn viên sẽ không có được cần thiết, vì chúng sẽ sắp xếp trong thứ tự số.

Như những người khác đã quan sát, sử dụng TO_NUMBER() sẽ là lựa chọn tốt hơn. Các +0 là ít rõ ràng hơn một diễn viên rõ ràng, và nó luôn luôn là tốt để được rõ ràng về ý định.

+0

Liệu 'to_number (a.code)' có cùng tác dụng, hoặc có sự khác biệt với '+ 0' không? – FrustratedWithFormsDesigner

+1

Tôi nghĩ to_number sẽ có tác dụng tương tự và sẽ rõ ràng hơn cho người đọc. –

+0

+1 cho ví dụ đã làm về những gì tôi đã đề xuất –

1

Có chỉ mục trên TBL_CODE_ZIP.Code không? Tôi đã nhìn thấy các truy vấn thêm 0 vào một số (hoặc '' thành chuỗi) để buộc trình tối ưu hóa tránh sử dụng chỉ mục cho phần đó của truy vấn. (Tất nhiên, cách thích hợp để tránh sử dụng chỉ mục là thêm gợi ý thích hợp)

Có thể người viết gốc gặp sự cố khi ORDER BY được tối ưu hóa để quét chỉ mục, khiến truy vấn chạy chậm hơn; vì vậy họ đã thêm +0 để buộc một đường dẫn truy cập khác và thực hiện một kiểu sắp xếp thông thường.

+0

Có, có một chỉ mục, được gọi là CODE_ZIP_CODE_IX có a.Code trong đó và trong truy vấn này, chúng tôi đang "gợi ý" để sử dụng chỉ mục đó. Khi tôi xem xét nó thông qua Kế hoạch Giải thích so sánh và không có +0 các kế hoạch giống hệt nhau. –

+1

@Lucas, có, nó sẽ không nhất thiết tạo ra sự khác biệt * bây giờ *. Ngoài ra, các nhà phát triển có thể đã có một niềm tin sai lầm rằng điều này sẽ làm cho nó nhanh hơn bởi vì "nó làm việc cho tôi trước" :) –

+0

Tôi đồng ý, một trong những đồng nghiệp của tôi nghĩ rằng điều này có thể còn sót lại từ một thực hiện cho Oracle 8. sự thấu hiểu. –

0

Tất cả xin lỗi vì câu trả lời vì đây là câu hỏi rất cũ. Tuy nhiên, +0 là gợi ý cho cơ sở dữ liệu của bạn để bỏ qua chỉ mục (nếu nó nằm trên cột .Code) cho truy vấn cụ thể này,

Một số chỉ mục thời gian thực hiện truy xuất nhanh trong một thời gian. cơ sở dữ liệu.

vì vậy bây giờ bạn có hai tùy chọn sử dụng eigther +0 gợi ý hoặc xóa chỉ mục nếu nó trên a.code bạn sẽ nhận được cùng một tốc độ.