Оптимизация союзов - PullRequest
1 голос
/ 27 ноября 2008

У меня возникают проблемы при попытке оптимизировать следующий запрос для SQL Server 2005. Кто-нибудь знает, как я могу улучшить его. Каждая из используемых таблиц содержит около 40 миллионов строк. Я старался изо всех сил пытаться оптимизировать его, но мне удается сделать прямо противоположное.

Спасибо

SELECT
        cos
      , SIN
    FROM
        ConSisHis2005
    union all
    SELECT
        cos
      , SIN
    FROM
        ConSisHis2006
    union all
    SELECT
        cos
      , SIN
    FROM
        ConSisHis2007
    UNION ALL
    SELECT
        cos
      , SIN
    FROM
        ConSisHis2008

Может быть, я должен был сказать что-то еще о схеме, все таблицы, используемые здесь, являются историческими таблицами, они не ссылаются на другие таблицы. И вот уже есть индекс для cos и SIN. Мне просто интересно, есть ли другой способ оптимизировать запрос ... как вы можете себе представить, получить 160-миллионные записи сложно: s

Ответы [ 7 ]

2 голосов
/ 27 ноября 2008

Другим подходом было бы решить проблему: зачем вам все 160 миллионов строк? Если вы ведете какую-то отчетность, вы можете создать отдельные таблицы отчетности, в которых уже есть некоторые данные. Или вам действительно нужно хранилище данных для поддержки ваших потребностей в отчетности.

2 голосов
/ 27 ноября 2008

Кажется, что запрос просто объединяет разделенные таблицы истории в один набор результатов, содержащий все данные. В этом случае запрос уже оптимален.

1 голос
/ 27 ноября 2008

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

1 голос
/ 27 ноября 2008

Поскольку нет предложения WHERE, я не верю, что вы можете что-то сделать, чтобы улучшить производительность этого PoV.

Вы правильно использовали UNION ALL, поэтому там нет никакой помощи.

Единственное, о чем я могу подумать - есть ли еще столбцы в таблицах? Если это так, возможно, вы извлекаете с диска больше данных, чем вам нужно, что замедляет запрос.

1 голос
/ 27 ноября 2008

Поместите составной индекс на cos и sin для каждой из таблиц. Это так же хорошо, как вы получите без реструктуризации дизайна таблицы (в этом примере, похоже, у вас должна быть только 1 таблица для начала)

0 голосов
/ 28 ноября 2008

Оптимизация не требуется. Поскольку вы выбираете все записи из всех таблиц, по определению вы получаете все записи из всех таблиц в одном наборе результатов.

Какая причина для этого?

0 голосов
/ 28 ноября 2008

Вы можете рассмотреть возможность использования таблицы с одним разделом и индикатором года.

Мне все еще любопытно - это код в представлении или SP, который работает на 160-метровых строках, или он собирается вернуть 160-метровые строки по проводу. Если это так, то это огромное количество данных, которые нужно вернуть, которые фактически являются выдержкой, и потребуется некоторое время, чтобы спуститься по проводам.

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