Можно ли создать индексированное представление для системных таблиц?

Это не имеет ничего общего с флагом MULTILINE; то, что вы видите, - это разница между методами find() и matches(). find() преуспевает, если совпадение найдено в любом месте целевой строки , в то время как matches() ожидает, что регулярное выражение будет соответствовать всей строке .

Pattern p = Pattern.compile("xyz");

Matcher m = p.matcher("123xyzabc");
System.out.println(m.find());    // true
System.out.println(m.matches()); // false

Matcher m = p.matcher("xyz");
System.out.println(m.matches()); // true

Кроме того, MULTILINE не означает, что вы думаете, что он делает. Многие люди, похоже, приходят к выводу, что вы должны использовать этот флаг, если ваша целевая строка содержит символы новой строки, то есть если она содержит несколько логических строк. Я видел здесь несколько ответов на SO, но на самом деле весь этот флаг изменяет поведение якорей, ^ и $.

Обычно ^ соответствует самому началу целевой строки, а $ соответствует самому концу (или перед новой строкой в ​​конце, но мы оставим это в стороне на данный момент). Но если строка содержит символы новой строки, вы можете выбрать для ^ и $ совпадение в начале и конце любой логической строки, а не только начало и конец всей строки, установив флаг MULTILINE.

Так что забудьте о том, что MULTILINE означает и просто помните, что он делает : изменяет поведение якорей ^ и $. Режим DOTALL изначально назывался «однострочным» (и все еще в некоторых вариантах, включая Perl и .NET), и он всегда вызывал подобное замешательство. Нам повезло, что разработчики Java пошли с более описательным именем в этом случае, но не было разумной альтернативы для «многострочного» режима.

В Perl, где все это безумие началось, они признали свою ошибку и избавились от «многострочных» и «однострочных» режимов в Perl 6 регулярных выражениях. Еще через двадцать лет, возможно, остальной мир последует этому примеру.

0
задан Dale Burrell 15 January 2019 в 21:25
поделиться

1 ответ

Select * from indexed_view не гарантирует ничего о порядке, возвращаемом из запроса. (как следует из комментария). Поэтому, пожалуйста, не думайте, что или ваше приложение может сломаться.

Что касается «почему вы не можете создать индексированное представление для системных таблиц?» есть несколько причин для этого.

  1. Вы можете создать ограничения для индексированных представлений, которые приведут к сбою некоторых системных команд DDL (чего не хотелось бы делать обычному пользователю).
  2. Системные таблицы являются собственно представлениями. Существуют разные базовые таблицы, и они не отображаются напрямую (хотя вы можете увидеть их в showplan). Итак, мы не позволяем вам привязываться к внутренним таблицам. Несмотря на то, что SQL редко встречается, они могут изменить эти представления (при обновлении основной версии) таким образом, что это может нарушить любые индексированные представления, созданные ранее
  3. Наконец, существует совершенно другой путь кода для реализации обновления системных таблиц (представлений). , Он не использует обычные операторы обновления. Существует много специальной логики для блокировок, защелок, поддержки системных кэшей и т. Таким образом, логика для поддержки индексированных представлений не будет работать на этих объектах. [Все это было сделано давно во имя производительности / масштаба]
0
ответ дан Ben Thul 15 January 2019 в 21:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: