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 .