Замедлите отличный запрос в SQL Server по большому набору данных

Проблема была в конфигурации nginx.

server {
    ...
    location / {
        proxy_pass http://[ipv6_address]:8443/;
        ...
    }
}

Косая черта в конце вызвала проблему: должно быть proxy_pass http://[ipv6_address]:8443;

Проблема 1999: создание проекта с / вызовет ошибку (404 не найден) [ 116]

Устранение неполадок

11
задан Aaron Kurtzhals 6 May 2014 в 19:37
поделиться

6 ответов

You do misunderstand the index. Even if it did use the index it would still do an index scan across 200M entries. This is going to take a long time, plus the time it takes to do the DISTINCT (causes a sort) and it's a bad thing to run. Seeing a DISTINCT in a query always raises a red flag and causes me to double check the query. In this case, perhaps you have a normalization issue?

9
ответ дан 3 December 2019 в 06:22
поделиться

Я должен попробовать что-то вроде этого:

SELECT typeName FROM [types] WITH (nolock)
group by typeName;

И, как и другие, я бы сказал, что вам нужно нормализовать этот столбец.

0
ответ дан 3 December 2019 в 06:22
поделиться

My first thought is statistics. To find last updated:

SELECT
    name AS index_name, 
    STATS_DATE(object_id, index_id) AS statistics_update_date
FROM
    sys.indexes 
WHERE
    object_id = OBJECT_ID('MyTable');

Edit: Stats are updated when indexes are rebuilt, which I see are not maintained

My second thought is that is the index still there? The TOP query should still use an index. I've just tested on one of my tables with 57 million rows and both use the index.

1
ответ дан 3 December 2019 в 06:22
поделиться

Как уже отмечали другие - когда вы делаете SELECT DISTINCT (typename) над своей таблицей, вы заканчиваете с полным сканированием таблицы, несмотря ни на что.

Так что это действительно вопрос ограничения количества строк, которые нужно отсканировать.

Вопрос в следующем: для чего вам нужны ваши имена DISTINCT? И сколько из ваших 200M строк различны? У вас есть только несколько (не более нескольких сотен) разных типов названий ??

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

Таким образом, у вас будет отдельная небольшая таблица только с отдельными записями TypeName,

1
ответ дан 3 December 2019 в 06:22
поделиться

I doubt SQL Server will even try to use the index, it'd have to do practically the same amount of work (given the narrow table), reading all 200M rows regardless of whether it looks at the table or the index. If the index on typeName was clustered it may reduce the time taken as it shouldn't need to sort before grouping.

If the cardinality of your types is low, how about maintaining a summary table which holds the list of distinct type values? A trigger on insert/update of the main table would do a check on the summary table and insert a new record when a new type is found.

4
ответ дан 3 December 2019 в 06:22
поделиться

Индекс поможет вам быстро найти строку. Но вы просите базу данных перечислить все уникальные типы для всей таблицы. Индекс не может помочь с этим.

Вы можете запустить ночное задание, которое выполняет запрос и сохраняет его в другой таблице. Если вам требуются свежие данные, вы можете сохранить последний идентификатор, включенный в ночное сканирование, и объединить результаты:

select type
from nightlyscan
union
select distinct type
from verybigtable
where rowid > lastscannedid

Другой вариант - нормализовать большую таблицу в две таблицы:

talbe1: id, guid, typeid
type table: typeid, typename

Это было бы очень полезно если число типов было относительно небольшим.

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

Вы можете запустить ночное задание, которое выполняет запрос и сохраняет его в другой таблице. Если вам требуются свежие данные, вы можете сохранить последний идентификатор, включенный в ночное сканирование, и объединить результаты:

select type
from nightlyscan
union
select distinct type
from verybigtable
where rowid > lastscannedid

Другой вариант - нормализовать большую таблицу в две таблицы:

talbe1: id, guid, typeid
type table: typeid, typename

Это было бы очень полезно если число типов было относительно небольшим.

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

Вы можете запустить ночное задание, которое выполняет запрос и сохраняет его в другой таблице. Если вам требуются свежие данные, вы можете сохранить последний идентификатор, включенный в ночное сканирование, и объединить результаты:

select type
from nightlyscan
union
select distinct type
from verybigtable
where rowid > lastscannedid

Другой вариант - нормализовать большую таблицу в две таблицы:

talbe1: id, guid, typeid
type table: typeid, typename

Это было бы очень полезно если число типов было относительно небольшим.

0
ответ дан 3 December 2019 в 06:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: