При выполнении подсчета (агрегатного) SQL-запроса, что может ускорить время выполнения в этих 3 системах баз данных? Я уверен, что многие вещи могут ускорить его (аппаратное обеспечение для одного), но я просто начинающий администратор баз данных, поэтому я уверен, что здесь я получу несколько ответов. Я перенес около 157 миллионов строк в базу данных SQL Server, и этот запрос занимает вечность. Но в моей исходной базе данных Netezza это занимает секунды.
Например:
Нетезза 6:
SELECT COUNT(*) FROM DATABASENAME..MYTABLE
Oracle 11g:
SELECT COUNT(*) FROM MYTABLE
SQL Server 2012:
SELECT COUNT(*) FROM DATABASENAME.[dbo].[MYTABLE]
sql-server
query-performance
count
netezza
МакГайвер
источник
источник
Ответы:
Netezza - это устройство, предназначенное для сканирования больших таблиц, поэтому вы получаете такие быстрые результаты в этой системе.
Для вашего SQL Server вы можете значительно ускорить подсчет строк, выполнив запрос из DMV sys.dm_db_partition_stats.
В условиях высокой транзакции этот DMV не гарантирует 100% точности. Но, исходя из вашего вопроса, кажется, что вы просто делаете подсчет строк, чтобы проверить каждую таблицу после переноса, поэтому этот запрос должен работать для вас.
источник
Вот решение SQL Server, которое использует
COUNT_BIG
внутри индексированного представления. Это даст вам согласованный с точки зрения транзакций счет без затрат на сканирование больших таблиц или индексов и без необходимости хранения, необходимого для последнего:Это потребует одного начального сканирования (от этого не уйти), и добавит немного накладных расходов к инкрементным манипуляциям с табличными данными. Если вы выполняете большие операции с большим количеством данных (в отличие от множества мелких операций), я думаю, что издержки на изменения должны быть незначительными.
источник
В Oracle двоичный индекс дерева в столбце NOT NULL может использоваться для ответа на COUNT (*). В большинстве случаев это будет быстрее, чем FULL TABLE SCAN, поскольку индексы обычно меньше их базовой таблицы.
Тем не менее, обычный индекс двоичного дерева будет по-прежнему огромным с 157 Mrows. Если ваша таблица не обновляется одновременно (т. Е. Только процесс пакетной загрузки), то вы можете использовать вместо этого индекс растрового изображения.
Наименьший индекс растрового изображения будет выглядеть примерно так:
Пустые записи учитываются с помощью растрового индекса. Полученный индекс будет крошечным (20–30 блоков на миллион строк) по сравнению с обычным двоичным индексом дерева или базовой таблицей.
Полученный план должен показать следующие операции:
Если ваша таблица обновляется одновременно, растровый индекс с уникальным значением будет предметом спора и не должен использоваться.
источник
В Oracle простой запрос подсчета часто выполняется путем сканирования индекса вместо всей таблицы. Индекс должен быть битовым индексом или определяться для столбца с ограничением NOT NULL. Для более сложных запросов, требующих полного сканирования таблицы, вы можете использовать параллельный запрос.
Чтобы включить параллельный запрос (требуется Enterprise Edition), вы можете использовать подсказку оптимизатора:
Или включите параллельный запрос для всех запросов в таблице:
источник