Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Hiệu suất chậm trên Hibernate + Java nhưng nhanh khi tôi sử dụng TOAD với cùng một truy vấn Oracle gốc

Tôi nghĩ điều gì đang xảy ra với mã này:

SQLQuery query = session.createSQLQuery("myNamedNativeQuery");
query.setParameter(nameParameter1, value1);
query.setParameter(nameParameter2, value2);
query.uniqueResult(); 

đây có phải là:

ở dòng 1:một kế hoạch truy vấn được tạo dựa trên một số giá trị mong đợi cho các tham số được đặt tên của bạn.

ở dòng 4:truy vấn được thực thi với value1 và value2, nhưng những giá trị đó không phải là "giá trị tốt" cho kế hoạch truy vấn đã được xây dựng ở dòng 1 và do đó, cơ sở dữ liệu đang thực hiện một kế hoạch rất không phù hợp với các giá trị thực và nó sẽ rất nhiều thời gian.

Tại sao?

Nhìn vào mã nguồn của HibernateSessionImpl.createSQLQuery(...) Tôi đã tìm thấy dòng mã này:

SQLQueryImpl query = new SQLQueryImpl(
                sql,
                        this,
                        factory.getQueryPlanCache().getSQLParameterMetadata( sql )
        );

đang gọi getQueryPlanCache() với một số tham sốMetaData. Tôi cho rằng siêu dữ liệu này không đủ tốt .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ResultSet.getString (Ngày) khác nhau dựa trên trình điều khiển

  2. Truy vấn tốt nhất để đạt được chỉ mục Oracle với liên kết và giá trị null

  3. Oracle chèn vào table2 sau đó xóa khỏi table1, ngoại lệ nếu thất bại

  4. Ánh xạ dữ liệu cột thành một giá trị (Oracle)

  5. Loại bỏ các kết quả trùng lặp trong một truy vấn chọn có chứa cột CLOB