我在Patient
& Person
表中有200,000行,查詢顯示需要30秒才能執行。查詢處理200000條記錄的速度非常慢
我已經在表中PersonId
和PatientId
Patient
表中定義了主鍵(和聚簇索引)。我還可以在這裏做什麼來提高我的程序的性能?
數據庫開發方面的新手。我只知道基本的SQL。也不確定SQL Server能夠快速處理200,000行。
全動態過程,你可以在https://github.com/Padayappa/SQLProblem/blob/master/Performance
任何人看到處理面臨這樣巨大的行?我該如何提高績效?
DECLARE @return_value int,
@unitRows bigint,
@unitPages int,
@TenantId int,
@unitItems int,
@page int
SET @TenantId = 1
SET @unitItems = 20
SET @page = 1
DECLARE @PatientSearch TABLE(
[PatientId] [bigint] NOT NULL,
[PatientIdentifier] [nvarchar](50) NULL,
[PersonNumber] [nvarchar](20) NULL,
[FirstName] [nvarchar](100) NOT NULL,
[LastName] [nvarchar](100) NOT NULL,
[ResFirstName] [nvarchar](100) NOT NULL,
[ResLastName] [nvarchar](100) NOT NULL,
[AddFirstName] [nvarchar](100) NOT NULL,
[AddLastName] [nvarchar](100) NOT NULL,
[Address] [nvarchar](255) NULL,
[City] [nvarchar](50) NULL,
[State] [nvarchar](50) NULL,
[ZipCode] [nvarchar](20) NULL,
[Country] [nvarchar](50) NULL,
[RowNumber] [bigint] NULL
)
INSERT INTO @PatientSearch SELECT PAT.PatientId
,PAT.PatientIdentifier
,PER.PersonNumber
,PER.FirstName
,PER.LastName
,RES_PER.FirstName AS ResFirstName
,RES_PER.LastName AS ResLastName
,ADD_PER.FirstName AS AddFirstName
,ADD_PER.LastName AS AddLastName
,PER.Address
,PER.City
,PER.State
,PER.ZipCode
,PER.Country
,ROW_NUMBER() OVER (ORDER BY PAT.PatientId DESC) AS RowNumber
FROM dbo.Patient AS PAT
INNER JOIN dbo.Person AS PER
ON PAT.PersonId = PER.PersonId
INNER JOIN dbo.Person AS RES_PER
ON PAT.ResponsiblePersonId = RES_PER.PersonId
INNER JOIN dbo.Person AS ADD_PER
ON PAT.AddedBy = ADD_PER.PersonId
INNER JOIN dbo.Booking AS B
ON PAT.PatientId = B.PatientId
WHERE PAT.TenantId = @TenantId AND B.CategoryId = @CategoryId
GROUP BY PAT.PatientId
,PAT.PatientIdentifier
,PER.PersonNumber
,PER.FirstName
,PER.LastName
,RES_PER.FirstName
,RES_PER.LastName
,ADD_PER.FirstName
,ADD_PER.LastName
,PER.Address
,PER.City
,PER.State
,PER.ZipCode
,PER.Country
;
SELECT @unitRows = @@ROWCOUNT
,@unitPages = (@unitRows/@unitItems) + 1;
SELECT *
FROM @PatientSearch AS IT
WHERE RowNumber BETWEEN (@page - 1) * @unitItems + 1 AND @unitItems * @page
你插入你的表變量有多少行?您最好創建一個實際的臨時表('#PatientSearch')。原因在於查詢優化器總是會假定一個表變量只有一行(它缺少任何統計信息),因此如果將大量行插入表變量 – 2013-03-27 07:00:05
@marc_s,它實際上會插入所有200000行爲空搜索:( – Billa 2013-03-27 07:01:13
***爲什麼***你需要將所有200'000行復制到臨時表中才能開始?不能只在實際數據上定義一個CTE,並添加' ROW_NUMBER()'函數,並用它來選擇你的數據 – 2013-03-27 07:02:44