Может ли SQL Server автоматически считывать более одной таблицы, если данные охватывают более одной таблицы без изменения запроса? - PullRequest
2 голосов
/ 07 июля 2011

У меня есть таблица с именем «customer», в которой слишком много строк, и было принято решение разбить таблицу на несколько таблиц по столбцу даты InsertedDate.Данные охватывают годы 2009-2011.

Я бы хотел каждый год ставить в свою таблицу.Таким образом, клиенты за 2009 год переходят в одну таблицу под названием «customer2009» и т. Д.

Скажем, у меня есть запрос типа:

SELECT LastName
  FROM Customer 
 WHERE InsertedDate BETWEEN '12/20/2009' 
                        AND '01/15/2010'

Есть ли функция в SQL Server (в Enterperiseиздание?) где, если он получает такой запрос, он разумно знает, чтобы получить данные из разных таблиц.Причина, по которой я спрашиваю, состоит в том, что я не хочу изменять запрос на: (есть сотни запросов)

SELECT LastName 
  FROM Customer2009
 WHERE InsertedDate >= '12/20/2009' 
UNION
SELECT LastName 
  FROM Customer2010 
 WHERE InsertedDate <= '01/15/2010'

Я хотел бы прочитать технический документ и лучшие практики и архитектуру для этого типаЕсли хороший ресурс существует.

Добавление:

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

Ответы [ 5 ]

12 голосов
/ 07 июля 2011

Просмотр разбиения таблиц в SQL Server 2005 +.

3 голосов
/ 07 июля 2011

Вы можете создать представление:

create view vCustomer
as
SELECT LastName 
FROM Customer2009
WHERE InsertedDate >= '12/20/2009' 
UNION
SELECT LastName 
FROM Customer2010 
WHERE InsertedDate <= '01/15/2010'

Конечно, вам все равно нужно обновить сохраненные процедуры, но это будет немного проще.

SELECT LastName
FROM vCustomer 
WHERE InsertedDate BETWEEN '12/20/2009' AND '01/15/2010'
0 голосов
/ 07 июля 2011

Можно рассмотреть два варианта: встроенные функции разбиения (как предложено Джо Стефанелли ) и ручное разбиение, которое включает создание многораздельного представления. Секционированные представления имеют некоторые ограничения, но они также дают вам возможность использовать дополнительные аппаратные ресурсы, например, для разделения данных между различными экземплярами SQL Server. Вы можете найти полезную информацию здесь

0 голосов
/ 07 июля 2011

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

CREATE OR REPLACE VIEW vw_all_customers AS
SELECT * FROM Customer2009
UNION
SELECT * FROM Customer2010
...
;

Это представление дает вам возможность делать такие вещи:

SELECT LastName
FROM vw_all_customers
WHERE InsertedDate >= '12/20/2009' 
AND InsertedDate <= '01/15/2010'
0 голосов
/ 07 июля 2011

Может быть view - это решение? почему нет, если так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...