Я думаю, что он сказал, что когда вы используете подготовленные операторы, SQL-сервер может кэшировать ваш план выполнения запроса, поэтому, даже если вы измените некоторые параметры в выполняющемся запросе, сервер может выбрать неправильный (возможно, кэшированный) план выполнения. это будет работать очень плохо.
Он также упомянул новую функцию SQL Server 2008, заставляющую движок переоценивать планы выполнения, которые он использовал для преодоления этой ситуации.
С подготовленными заявлениями у меня есть только одна проблема. Рассмотрим следующий код Java:
String sql = "select * from table where name like ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "PATTERN%");
ResultSet rs = pstmt.executeQuery();
Здесь вы ожидаете, что если у вас есть индекс для таблицы (имя), он будет использоваться планом запроса. Ну, не будет. Потому что PraparedStatement должен предварительно компилироваться и ожидать худшего: например, '%PATTERN%'. Так что оптимизировать не получится. Мне потребовалось некоторое время, чтобы понять это. Это заставляло мою базу данных страдать. :(
Надеюсь, поможет.
person
Pablo Santa Cruz
schedule
24.03.2009