Я пишу инструмент нагрузочного тестирования SQL, в котором пользователь может просто указать количество условий в разделе WHERE (и некоторые другие функции) с помощью ползунков, а затем нажать кнопку «Старт» для запуска нагрузочного тестирования базы данных. мое приложение

Проблема в следующем: если я использую логический оператор OR для объединения предложений, СУБД прекратит проверку раздела WHERE, как только встретит предикат, возвращающий TRUE. С логическим оператором И аналогичная ситуация: как только СУБД встречает предикат, возвращающий FALSE, СУБД прекращает проверку раздела WHERE. Как заставить СУБД проверять все пункты раздела WHERE независимо от значений TRUE / FALSE?

sql
0
teXI 8 Фев 2021 в 06:16

2 ответа

Лучший ответ

Вы не можете.

SQL - это декларативный язык, а не императивный. Это означает, что ядро ​​базы данных может абсолютно бесплатно использовать любые виды оптимизации (и грязные уловки) для получения правильного результата в соответствии с вашей спецификацией.

Более того, стратегия, которую движок может выбрать сегодня, может измениться в будущем без предварительного уведомления, если она будет возвращать правильный результат. Логика оптимизатора обычно очень проста (и предсказуема) в базах данных низкого уровня, в то время как она очень сложна в базах высокого уровня (больше операций, лучшие гистограммы, более разумная логика и т. Короче говоря, стратегия заключается в постоянной адаптации конкретного метода к существующим условиям: данные, представленные в каждой таблице, аппаратные и программные условия и т. Д.

2
The Impaler 8 Фев 2021 в 11:59

Я решил добавить в свое приложение «Режим защиты от короткого замыкания» и создать раздел WHERE, например, «WHERE ((cond1 = cond2) = cond3) = cond4)» или «WHERE cond1 = (cond2 = (cond3 = cond4))», последний вариант реализовать проще.

ОБНОВЛЕНИЕ: защита добавлена

0
teXI 8 Фев 2021 в 05:18
66095503