Комментарии 13
Первичный ключ был задан в исходной табличной переменной? Если это справочник, то, полагаю, он должен там быть.
Интересно понять что в XML справочнике и сколько строк он в таблице занимал. Когда нужно справочниких хранить которые актуальны некоторый промежуток времени (час-сутки-неделя-месяц) то я делал постоянную таблицу(таблицы) и туда их заносил. Конечно нужно слегка подумать над первичным ключем и правильной реализацией "протухания" сравочника но передавать его в запросе из клиента, насколько я понимаю это ваша ситуация, я бы точно не стал. Если справочник используется не для одноразовой выборки то он точно должен быть положен в постоянную таблицу.
Сейчас он действительно лежит в постоянной таблице, что сильно облегчает жизнь. До этого это была таблица с полем XML, в котором хранились разные справочники, и ключевое поле по названию. Обновление информации в таблице справочников происходило джобом из 1с сервиса раз в какое-то время. Видимо потребность в этой информации изначально была не очень большой (да и число записей изначально не предполагалось особо большим), но потом наросло. Функционал же - определение синонимов для объектов: код и название основного объекта, код и название замены.
Да, главная проблема с табличными переменными - это Estimated Number of Rows = 1. Если потом в плане идет какой-нибудь большой Join или Key Lookup, пиши пропало.
С временными таблицами в tempdb можно делать практически что угодно. Особенно удобно, что SQL Server по ним сам статистику успевает строить - Execution Plans получаются приличные. Если план строится не очень хороший, можно поэкспериментировать с индексами по временной таблице.
Только первичный ключ в момент создания
Не только - еще можно добавить уникальный ключ. Итого два индекса в момент создания
Спасибо за уточнение, дополнительный индекс действительно можно добавить, указав Unique constraint, тем самым заставить сервер создать для нас индекс.
Да любое количество индексов. С каждой новой версией этот функционал расширялся. Начиная с SQL Server 2016 (более старой версии нет в наличии) этот код работает
DECLARE @t TABLE
(c1 int INDEX IX_c1,
c2 int INDEX IX_c2,
c3 int INDEX IX_c3,
INDEX IX_c1_c2_c3 (c1, c2, c3)
);
Отличная статья, полезно!
Добрый вечер, спасибо за статью. Эта проблема была решена с помощью deferred compilation in SQL Server 2019. Please find details in https://www.mssqltips.com/sqlservertip/5662/table-variable-deferred-compilation-in-sql-server/
Как поменять один символ в коде и спасти день