Оригинальное сообщение на: https://siderite.dev/blog/careful-with-table-partitioning-in-sql
У меня возникла ситуация, когда я пытался оптимизировать запрос. И после некоторых исследований я наткнулся на нечто странное: запрос по первичному ключу генерировал много чтений. Я соединял свою таблицу с временной таблицей из 10 идентификаторов, и было 630 чтений! Как так?
Сначала я подумал, что это из-за того, как работают индексы. Первичный ключ состоял из RowId и RowDate, и даже если я знал, что теоретически поиск по RowId должен использовать первичный ключ, доказательства были против меня: при запросе по RowId и RowDate я получал ожидаемые 10 прочтений.
Я создал два запроса, один с RowDate и другой без RowDate. Затем я сравнил их планы выполнения. Они были идентичны! Только один занял намного больше времени, в частности, на поиск индекса (который правильно использовал первичный ключ). Когда я посмотрел на свойства этого элемента плана, я увидел нечто странное:
Actual Partitions Accessed 1…63!
Затем я понял, что таблица была разбита на разделы по столбцу RowDate. В этом случае RowDate имеет приоритет перед любым индексированным столбцом! Вы можете подумать о разделении таблицы как о принудительном добавлении столбцов раздела к каждому индексу в таблице, включая первичный ключ. На самом деле, разделенная таблица действует как несколько отдельных таблиц с одинаковым определением (столбцы, индексы и т.д.), только с разными данными. Индексы работают на каждом отдельном разделе. Когда вы разбиваете таблицу, вы также разбиваете ее индексы.
По правде говоря, я ожидал, что план выполнения запроса покажет разбиение на разделы как отдельный шаг. Я понимаю, что это трудно концептуализировать, не создавая столько путей выполнения, сколько разделов, но все же в форме плана должно быть указание, которое дает понять, что вы выполняете запрос к нескольким разделам.
После использования RowDate SQL-движок выбирал один раздел моей строки, а затем использовал индекс первичного ключа для ее поиска. Вместо 63*10 чтений, только 10 чтений, количество строк в таблице id.
Поэтому будьте осторожны, когда используете разделение таблицы, ВСЕГДА используйте столбцы раздела в запросах к таблице, иначе вы получите столько параллельных поисков, сколько разделов, независимо от индексов, которые вы создали, поскольку они также разделены.
Надеюсь, это поможет!