Эффективный способ проверить, возвратит ли SQL-запрос результаты

Если Вы собираетесь, работают через цикл выпуска, большую функцию, Вы оставлены к ответвлению. Иначе мы работаем в соединительной линии и ответвлении для каждого производственного выпуска в данный момент, мы создаем.

Предыдущие производственные сборки перемещены в то время в old_production_, и текущий выпуск напоминания является всегда просто производством. Весь наш сервер сборки знает о производстве, то, как развернуть производственное ответвление, и мы сбрасываем ту сборку с ноги с триггером силы.

20
задан Filip Ekberg 10 November 2009 в 15:33
поделиться

8 ответов

IF EXISTS should be more efficient, because it is optimised to stop as soon as it find the first row. This is how I would always do this kind of check, not using a COUNT().

For performance comparison, just ensure you are testing fairly by clearing down the data and execution plan caches (non-production db server only) before each test:

DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
7
ответ дан 30 November 2019 в 00:19
поделиться

Do you have an index on id and date?

maybe you just want:

select top 1  1 from myTable where id=7 and rowInsertDate > '01/01/2009' 

note: this would return 1 if data exists, or nothing otherwise.

another edit. This won't return a row with the value null if there is no data, but rather will not return any rows. More like null in its more figurative sense.

11
ответ дан 30 November 2019 в 00:19
поделиться

Это самое быстрое, что я мог получить в своих проектах:

SELECT CASE WHEN EXISTS (
  select top 1 1 
  from myTable 
  where id=7 
  and rowInsertDate BETWEEN '01/01/2009' AND GETDATE()
) THEN 1 ELSE 0 END AS AnyData
10
ответ дан 30 November 2019 в 00:19
поделиться

Я бы просто написал это так:

IF EXISTS(
      SELECT 0 FROM myTable 
      WHERE id=7 and rowInsertDate BETWEEN '01/01/2009' AND GETDATE()
)
SELECT 1
ELSE
SELECT 0

Таким образом, вы не вернете никаких данных, просто проверьте условия. Я считаю эту структуру запроса очень быстрой.

3
ответ дан 30 November 2019 в 00:19
поделиться

Если вам не нужно 376986 строк и вы просто хотите знать, существует ли что-то, тогда IF EXISTS имеет гораздо больший смысл. Кроме того, еще один полезный момент - запросить индексированный столбец (первичный ключ) вместо *, потому что вас не волнуют фактические данные.

2
ответ дан 30 November 2019 в 00:19
поделиться

Окончательные результаты будут фактически гораздо более сложный запрос, ведущий к много параметров и построенная строка up и выполняется с помощью sp_executesql

Я думаю, вам, по крайней мере, нужен полный синтаксис FROM, JOIN и WHERE, иначе ваш фактический запрос может ничего не найти (например, добавив INNER JOIN, которого не было в исходном запросе IF EXISTS, и

Если вы собираетесь столкнуться с этой проблемой, вы можете поместить PK в какую-то «Таблицу хранения идентификаторов пакетов», чтобы вы могли просто ссылаться на PK для второй части «Представление» ваш запрос.

Что вы планируете делать, если получите 376 986 результатов? Если вы собираетесь показать их пользователю на экране с помощью какого-либо разбиения на страницы, то наличие результатов в «Таблице хранения идентификаторов пакетов» может помочь в этом (хотя, очевидно, любые добавления / удаления и т. Д. К исходным данным приведет к искажению постраничного дисплея).

В качестве альтернативы,

1
ответ дан 30 November 2019 в 00:19
поделиться

Во-первых, вы должны попытаться создать фиктивную базу данных, содержащую столько данных, сколько, по вашему мнению, вам (или вашим преемникам) придется иметь дело за два года. Тогда ваши тесты будут намного более продуктивными.

IF EXISTS () будет быстрее, так как движок базы данных должен найти только первую запись, соответствующую вашим критериям. Конечно, с правильными индексами это будет еще быстрее.

Еще один совет, не используйте *, так как вам на самом деле не нужно извлекать столбцы.

IF EXISTS(select 1 from myTable where id=7 and rowInsertDate BETWEEN '01/01/2009' AND GETDATE())

... должно (из того, что я читал) работать немного быстрее.

0
ответ дан 30 November 2019 в 00:19
поделиться

Я думаю, что ответ Алекса Баньолини правильный. Система не позволяла мне комментировать его ответ (новый аккаунт). Единственное изменение, которое я бы сделал, - это заменить второй 1 на id.

Иногда уменьшение списка в разделе проекта (это список столбцов) позволяет обработчику базы данных обращаться только к индексу, а не к таблице, что ускоряет работу. Это, конечно, зависит от вашего движка БД и структуры / размера индекса. (все даты rowInsertDate должны быть

SELECT CASE WHEN EXISTS ( выберите первый идентификатор из myTable где id = 7 и rowInsertDate> '01 / 01/2009 ' ) ТОГДА 1 ИНАЧЕ 0 ЗАКОНЧИТЬСЯ AnyData

0
ответ дан 30 November 2019 в 00:19
поделиться
Другие вопросы по тегам:

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