2010-10-01 3 views
1

У меня есть текст SQL «SELECT * FROM TABLE1 WITH (NOLOCK)».Как вы используете NOLOCK с TADOQuery и TADOTable?

Два вопроса:

  1. Как мне сделать мой TADOQuery использовать NOLOCK подсказку без необходимости включения, что в тексте SQL? У меня буквально тысячи TADOQuery с динамическим построением их SQL, и было бы сложно добавить WITH (NOLOCK) ко всем из них, не говоря уже о том, что я использую с платформами баз данных, отличными от MSSQL. Существует ли свойство TADOQuery?

  2. Как добиться того же результата с помощью TADOTable? У TADOTable нет никакого SQL-кода, так как я могу сказать ему использовать подсказку NOLOCK?

Благодаря

ответ

1

, если вы используете MS SQL, бегите ниже заявление сразу на связи

SET TRANSACTION ИЗОЛЯЦИЯ LEVEL READ UNCOMMITTED

Cheer AP

+1

Да. И знаете ли вы последствия? Если это не уровень по умолчанию, есть веская причина. Для защиты целостности данных существуют транзакции и блокировки. Прежде чем выбросить это, я бы подумал дважды - должна быть очень веская причина. – 2010-10-02 16:47:35

+0

Является ли это утверждение применимым только к одному сеансу (т. Е. Мне нужно делать это каждый раз, когда я запускаю свое приложение)? Или он постоянно установлен на базу данных? Это влияет только на инструкции SELECT или на все SQL-запросы? –

+1

Это только для сеанса. Это повлияет на все операторы DML, например, любое предложение where будет «читать» базу данных. Ваш запрос может (и будет ...) возвращает результаты, которые никогда не существовали в базе данных. Если ваша база данных не доступна только для чтения, вы ищете проблемы. Используя подсказку NOLOCK для данного запроса, зная, что делать, это нормально. Использование его для целой сессии, если база данных не доступна только для чтения, очень опасна. Производительность - это еще не все. Пользователь обычно предпочитает правильный результат, даже если медленнее, чем неправильный, быстрее. – 2010-10-10 16:13:37

2

Подсказки базы данных конкретно, таким образом, вы должны выдавать правильный по одному для каждой базы данных поддерживается. В некоторых базах данных нет ничего эквивалентного, например, Oracle не позволяет ничего подобного (читатели никогда не блокируют писателей, а писатели никогда не блокируют читателей, тем самым не нужно).

IMHO вы не должны использовать компоненты TADOTable вообще - в любом случае AFAIK у вас нет способа указать подсказку для сгенерированного запроса, что в любом случае является слишком общим.

Также вы должны быть ОЧЕНЬ осторожны в использовании NOLOCK. Это означает, ЧТО ПРОЧИТАНО, aka грязный читает. Вы обходите защиту транзакций, и если у вас нет веских оснований обойти это, вы не должны этого делать - прирост производительности может не стоить потери целостности и согласованности данных.

+0

Дополнительная информация для C. Smith: NOLOCK намек на SQL оптимизатор. Если SQL не существует, оптимизатора SQL нет (у вас нет доступа к нему, так или иначе), что означает, что вы не можете дать ему подсказку. –

+0

Даже в транзакционных средах коэффициент усиления может быть очень высоким с SQL Server (в моем случае 2000, позже 2005), поскольку он слишком быстро продвигает блокировки на блокировки таблиц под нагрузкой. Добавление nolock ко всем таблицам, которые являются просто поиском (и только изменение говорит один раз несколько раз в год, когда машина находится под техническим обслуживанием в любом случае), улучшенная производительность (измеренная под напряжением, а не синтетическим) запросов со многими (5-6) таблицами присоединяется с иногда более 100%. –

+0

Да, по той же причине таблицы MySQL ISAM быстрее, чем InnoDB: они не используют транзакции. Проблема в том, как механизм блокировки разработан в некоторых базах данных - другие никогда не увеличивают блокировку. Я не сказал «никогда не использовать NOLOCK». Я просто сказал * будьте очень осторожны *, потому что OP сказал, что у него есть * тысячи * запросов, чтобы изменить, как любой намек, вы должны использовать его надлежащим образом только в правильной ситуации - зная, какие из эффектов он имеет. – 2010-10-02 12:38:28

 Смежные вопросы

  • Нет связанных вопросов^_^