Оптимизирован ли этот способ для извлечения значений, которых нет в базе данных? - PullRequest
3 голосов
/ 26 января 2012

Для получения значений, которые не находятся в дБ, я использую Common Table Expression следующим образом:

;WITH new_id (id) AS (
  SELECT '0x01'
  UNION ALL SELECT '0x00'
  UNION ALL SELECT '0x03'
  UNION ALL SELECT '0x04'
  UNION ALL SELECT '0x05'
)

SELECT  id AS p
FROM   new_id ni EXCEPT(SELECT id FROM table)

Является ли это оптимизированным способом получения значений, которые не хранятся в БД?

С уважением,

Флориан

1 Ответ

3 голосов
/ 26 января 2012

Это должно быть хорошо.

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

Из этого быстрого теста у них есть преимущество перед табличными переменными, поскольку SQL Server, похоже, хранит некоторую статистическую информацию о них, поэтому может выбрать подходящий тип соединения.

Я только что попробовал CTE с 500 строками и 50 разными значениями, и приблизительное число строк в приведенном ниже плане было правильным. (хотя это немного стыдно, что все это было решено во время компиляции и, вероятно, сгенерирован отдельный список id с этой целью, что SQL Server не просто подставляет это в план, вместо того, чтобы сделайте это снова во время выполнения)

Plan

...