我正在从事一个项目,该项目将测量文件中的数据解析到 Posgres 9.3.5 数据库中。
核心是一个表(按月分区),其中包含每个测量点的一行:
CREATE TABLE "tblReadings2013-10-01"
(
-- Inherited from table "tblReadings_master": "sessionID" integer NOT NULL,
-- Inherited from table "tblReadings_master": "fieldSerialID" integer NOT NULL,
-- Inherited from table "tblReadings_master": "timeStamp" timestamp without time zone NOT NULL,
-- Inherited from table "tblReadings_master": value double precision NOT NULL,
CONSTRAINT "tblReadings2013-10-01_readingPK" PRIMARY KEY ("sessionID", "fieldSerialID", "timeStamp"),
CONSTRAINT "tblReadings2013-10-01_fieldSerialFK" FOREIGN KEY ("fieldSerialID")
REFERENCES "tblFields" ("fieldSerial") MATCH SIMPLE
ON UPDATE CASCADE ON DELETE RESTRICT,
CONSTRAINT "tblReadings2013-10-01_sessionFK" FOREIGN KEY ("sessionID")
REFERENCES "tblSessions" ("sessionID") …Run Code Online (Sandbox Code Playgroud) 我有一个使用 SQL Server 2012 Enterprise Edition 作为后端的 Web 系统。
我们的一个查询特别繁重,大约需要 60 秒。我对这个查询进行了大量分析,知道时间花在了 INSERT INTO 表变量 SELECT FROM 表中。这意味着表上应该有一个共享锁,但并行进程应该能够并行运行此查询。
一个 Web 端点在不同的进程中并行调用其中 3 个过程。由于我们有 4 个内核,我希望 SQL 服务器应该在一个内核上运行一个进程,因此 3 个进程同时运行,这样我们的查询时间约为 60 秒。
然而,大多数情况下,它会在运行 2 个进程之间切换,然后每 20-30 秒运行 1 个进程。我可以看到 CPU 使用率在 25% 到 50% 之间跳跃(因为是 4 核机器)。
未运行的进程处于 RUNNABLE 状态,因此它们似乎只是在等待 CPU 时间,没有导致问题的表锁。
有时它实际上一次只运行 1 个,有时同时运行 3 个,因此某些事情会导致一些决策。
我已经检查过许可看到所有 4 个核心(确实如此)并且处理器关联设置为全部使用。由于这不在查询中,我不希望 MAX_DOP 对此产生影响,但我已在 0 和 2 处尝试过。
知道是什么影响了 SQL 服务器的决策制定吗?如果我们可以改变这种行为?