약 2.500.000 개의 레코드가있는 테이블이있는 데이터베이스가 있습니다. 테스트 할 쿼리가 두 개인 150.000 개의 레코드를 가져옵니다. 첫 번째 결과는 30 초에서 1 분 사이의 결과를 반환합니다. 그러나 두 번째 것은 3-4 분 사이에 반응합니다. 매우 이상합니다. 유일한 변경 사항은 첫 번째 매개 변수는 사용하지 않지만 두 번째 매개 변수는 사용합니다. 나는 C# 둘 다에서 달리고있다. 매개 변수가있는 보안 문제에 대해서는 왜 그렇게 많은 시간이 걸리는지 이해할 수 없습니다. 어떤 도움을 주시면 감사하겠습니다.MSSQL 매개 변수가 더 많은 시간을 소모합니다.
첫 번째 쿼리 :
DECLARE @page INT=3
DECLARE @pagesize INT=300
string sql = "SELECT Col1,Col2,Col3 FROM
(SELECT ROW_NUMBER() OVER(ORDER BY Col1) AS rownumber,Col1,Col2,Col3";
sql += " FROM my_table WHERE Col1 LIKE '" + letter + "%') as somex
WHERE rownumber >= (@page-1)*(@pagesize)";
sql += "AND rownumber <=(@page)*@pagesize;
SELECT COUNT(*) FROM my_table WHERE col1 LIKE '" + letter + "%'";
두 번째 쿼리
DECLARE @page INT=3
DECLARE @pagesize INT=300
DECLARE @starting VARCHAR(10)='be'
string sql = "SELECT Col1,Col2,Col3FROM
(SELECT ROW_NUMBER() OVER(ORDER BY Col1) AS rownumber,Col1,Col2,Col3";
sql += " FROM my_table WHERE Col1 LIKE @letter+'%') as somex
WHERE rownumber >= (@page-1)*(@pagesize)";
sql += "AND rownumber <=(@page)*@pagesize; SELECT COUNT(*)
FROM my_table WHERE col1 LIKE @letter+'%'";
내 서버가 16기가바이트 램, 4 진짜 4 개의 가상 CPU, SATA 디스크입니다.
편집 : Col1은 클러스터형 및 비 클러스터형 인덱스입니다.
진행률 :이 쿼리는 다른 서버에서 잘 작동하는 것으로 나타났습니다. 그러나 이것은 나를 혼란스럽게합니다. 그것은 SQL Server의 일부 설정 일 수 있습니까?
(소리 https://www.simple-talk.com/sql/t-sql-programming/parameter-sniffing /). – GarethD
GarethD 's 외에도 다음을 수행해야합니다. 1 col1에 인덱스가 있는지 확인하십시오. 2 count (*) 대신 count (col1)를 수행하십시오. 3- 테이블 통계를 업데이트하십시오. – jbl
질문을 편집했습니다. col1에는 클러스터형 및 비 클러스터형 인덱스가 모두 있습니다. count (*)를 count (col1)로 변경했지만 전혀 영향을주지 않았습니다. – Kuzgun