Таблица отображается дважды в sys.tables, один раз с индексом и один раз без

#sql-server

#sql-сервер

Вопрос:

У меня есть база данных в Azure SQL Server, и я выполняю следующий запрос, чтобы отследить мою инструкцию DELETE.

 SELECT 
     t.NAME AS TableName,
   i.name as indexName,
    p.[Rows],
    sum(a.total_pages) as TotalPages, 
    sum(a.used_pages) as UsedPages, 
    sum(a.data_pages) as DataPages,
    (sum(a.total_pages) * 8) / 1024 as TotalSpaceMB, 
    (sum(a.used_pages) * 8) / 1024 as UsedSpaceMB, 
    (sum(a.data_pages) * 8) / 1024 as DataSpaceMB
FROM 
    sys.tables t
INNER JOIN      
    sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN 
    sys.allocation_units a ON p.partition_id = a.container_id
WHERE 
    t.NAME NOT LIKE 'dt%' AND
    i.OBJECT_ID > 255 
 GROUP BY 
    t.NAME, i.object_id, i.index_id, i.name, p.[Rows]
ORDER BY 
    object_name(i.object_id) ;
  
 
 

Результаты показывают таблицу Events дважды, но один раз с индексом и один раз без него.

 #   TableName   indexName      Rows
1   Events     [NULL]          1,878
2   Events     IX_timestamp    1,886
 

Почему я запускаю следующую инструкцию delete, она удаляет данные из обеих таблиц:

 DELETE from  [dbo].[Events]
where timestamp >  parse('2021-11-29 08:59:00.1130000' as datetime)
and timestamp < cast('2021-11-30' as date)
 

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

Комментарии:

1. Вместо того, чтобы иметь две таблицы, я бы предположил, что более вероятным ответом является то, что у вас есть два индекса в одной таблице, поэтому вы получаете две строки. Я думаю, что пробел в вашем понимании может заключаться в том, что вы создали только один индекс Events , но для каждой таблицы требуется базовый индекс кучи или кластеризованный индекс, поэтому, если вы не определите свой ключ кластеризации, SQL Server создаст индекс кучи , и это то, что вы видите в своей первой строке.

2. Спасибо @GarethD, я действительно определил некластеризованный индекс только в этой таблице. Влияет ли это каким-либо образом на производительность?

3. Влияет ли это на производительность? Почти наверняка. Это отрицательно влияет на производительность? Я понятия не имею, но, вероятно. Мне нужно было бы знать намного больше об использовании таблицы, чтобы сказать что-либо с какой-либо степенью убежденности, но обычно кластеризованный индекс будет лучше, чем таблица кучи, даже если он не уникален. Для таблицы событий, предполагая, что события вставляются по мере их возникновения, я был бы склонен создать timestamp неуникальный кластеризованный индекс, но, как я уже сказал, на данный момент это лучшее предположение, основанное на предположениях

4. Если вы хотите ограничить количество строк, возвращаемых из вашего запроса, получите размер, затем ограничьте свои результаты так, чтобы возвращался только индекс с ID of 0 (куча) или 1 (кластеризованный).

5. Выглядит как куча с дополнительной призрачной строкой. Почему у вас есть куча с некластеризованным индексом — это другой вопрос…