Если Вы собираетесь, работают через цикл выпуска, большую функцию, Вы оставлены к ответвлению. Иначе мы работаем в соединительной линии и ответвлении для каждого производственного выпуска в данный момент, мы создаем.
Предыдущие производственные сборки перемещены в то время в old_production_, и текущий выпуск напоминания является всегда просто производством. Весь наш сервер сборки знает о производстве, то, как развернуть производственное ответвление, и мы сбрасываем ту сборку с ноги с триггером силы.
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
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.
Это самое быстрое, что я мог получить в своих проектах:
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
Я бы просто написал это так:
IF EXISTS(
SELECT 0 FROM myTable
WHERE id=7 and rowInsertDate BETWEEN '01/01/2009' AND GETDATE()
)
SELECT 1
ELSE
SELECT 0
Таким образом, вы не вернете никаких данных, просто проверьте условия. Я считаю эту структуру запроса очень быстрой.
Если вам не нужно 376986 строк и вы просто хотите знать, существует ли что-то, тогда IF EXISTS имеет гораздо больший смысл. Кроме того, еще один полезный момент - запросить индексированный столбец (первичный ключ) вместо *, потому что вас не волнуют фактические данные.
Окончательные результаты будут фактически гораздо более сложный запрос, ведущий к много параметров и построенная строка up и выполняется с помощью sp_executesql
Я думаю, вам, по крайней мере, нужен полный синтаксис FROM, JOIN и WHERE, иначе ваш фактический запрос может ничего не найти (например, добавив INNER JOIN, которого не было в исходном запросе IF EXISTS, и
Если вы собираетесь столкнуться с этой проблемой, вы можете поместить PK в какую-то «Таблицу хранения идентификаторов пакетов», чтобы вы могли просто ссылаться на PK для второй части «Представление» ваш запрос.
Что вы планируете делать, если получите 376 986 результатов? Если вы собираетесь показать их пользователю на экране с помощью какого-либо разбиения на страницы, то наличие результатов в «Таблице хранения идентификаторов пакетов» может помочь в этом (хотя, очевидно, любые добавления / удаления и т. Д. К исходным данным приведет к искажению постраничного дисплея).
В качестве альтернативы,
Во-первых, вы должны попытаться создать фиктивную базу данных, содержащую столько данных, сколько, по вашему мнению, вам (или вашим преемникам) придется иметь дело за два года. Тогда ваши тесты будут намного более продуктивными.
IF EXISTS () будет быстрее, так как движок базы данных должен найти только первую запись, соответствующую вашим критериям. Конечно, с правильными индексами это будет еще быстрее.
Еще один совет, не используйте *, так как вам на самом деле не нужно извлекать столбцы.
IF EXISTS(select 1 from myTable where id=7 and rowInsertDate BETWEEN '01/01/2009' AND GETDATE())
... должно (из того, что я читал) работать немного быстрее.
Я думаю, что ответ Алекса Баньолини правильный. Система не позволяла мне комментировать его ответ (новый аккаунт). Единственное изменение, которое я бы сделал, - это заменить второй 1 на id.
Иногда уменьшение списка в разделе проекта (это список столбцов) позволяет обработчику базы данных обращаться только к индексу, а не к таблице, что ускоряет работу. Это, конечно, зависит от вашего движка БД и структуры / размера индекса. (все даты rowInsertDate должны быть SELECT CASE WHEN EXISTS (
выберите первый идентификатор
из myTable
где id = 7
и rowInsertDate> '01 / 01/2009 '
) ТОГДА 1 ИНАЧЕ 0 ЗАКОНЧИТЬСЯ AnyData