У меня есть кусок кода, который выполняет вставки в сильно денормализованные таблицы. Таблицы имеют количество столбцов в диапазоне от ~ 100 до 300+. Это SQL Server 2008 R2, работающий на Windows Server 2008.
Каждая вставка состоит из вставки в несколько таблиц в рамках одной транзакции. Некоторые вставки пакетируются NHibernate, но некоторые не могут, но тем не менее все они находятся в одной транзакции.
Когда я выполняю вставки, скажем, 500 раз, неоднократно вызывая фрагмент кода, который выполняет вставку, я получаю в среднем ~ 360 мс.
Странно то, что когда я запускаю тестовый код одновременно, используя 4 процесса (один и тот же exe-файл запускается из 4 разных командных строк в Windows Server 2008), производительность вставки для вызова становится намного выше. Я вижу всплески, которые идут со скоростью 90 мс (почти X4 быстрее). Я измеряю время вставки из кода.
Поскольку 4 процесса ничего не знают друг о друге, я предполагаю, что это как-то связано с SQL Server, но я понятия не имею, почему. Я хотел бы знать, почему это происходит, и если есть какая-либо конфигурация, которая позволила бы мне получить такую же производительность, когда вставки не так часто.
Предложения, касающиеся методов мониторинга SQL Server, чтобы понять, что происходит на уровне БД, также приветствуются.
источник
некоторые серверы / процессоры / операционные системы запоминают шаблоны. как кеш.
Поскольку вы делаете одно и то же 4 раза, я уверен, что есть способы, которые могут срезать углы. Я предполагаю, что в первом случае вы думаете об этом как об одном долгом процессе (пример 1), но вторым способом is видит повторно использованный код и запускает его как кеш (example2), или это может быть первый процесс, который должен вместить его в (ram example3).
пример1: 0111110000110111110000111011111000011110111110000
пример2: 0111110000 | 11 | 0111110000 | 111 | 0111110000 | 1111 | 0111110000
пример3: 0111110000011111000001111100000111110000 пример3: цикл: 0111110000
Я знаю, что сервер Ubuntu делает это с повторными запросами MySQL. Я могу сохранить их в кеше, хотя на самом деле единственная разница во времени составляет 10-40 мм, но это складывается. Когда я учился в школе, были классы, которые показали, что вы должны заставить программы (perl / php) использовать этот кеш, чтобы быть быстрее.
Но это может зависеть от программы, на каком языке, на каком языке она была скомпилирована или как она была запрограммирована.
источник