SQL सर्वर में परिणामों को पेजिगेट करने का सबसे अच्छा तरीका क्या है
sql-server performance (10)
SQL सर्वर 2000 के लिए आप एक तालिका चर के साथ एक पहचान चर के साथ ROW_NUMBER () अनुकरण कर सकते हैं:
DECLARE @pageNo int -- 1 based
DECLARE @pageSize int
SET @pageNo = 51
SET @pageSize = 20
DECLARE @firstRecord int
DECLARE @lastRecord int
SET @firstRecord = (@pageNo - 1) * @pageSize + 1 -- 1001
SET @lastRecord = @firstRecord + @pageSize - 1 -- 1020
DECLARE @orderedKeys TABLE (
rownum int IDENTITY NOT NULL PRIMARY KEY CLUSTERED,
TableKey int NOT NULL
)
SET ROWCOUNT @lastRecord
INSERT INTO @orderedKeys (TableKey) SELECT ID FROM Orders WHERE OrderDate >= '1980-01-01' ORDER BY OrderDate
SET ROWCOUNT 0
SELECT t.*
FROM Orders t
INNER JOIN @orderedKeys o ON o.TableKey = t.ID
WHERE o.rownum >= @firstRecord
ORDER BY o.rownum
इस दृष्टिकोण को बहु-स्तंभ कुंजी वाले तालिकाओं तक बढ़ाया जा सकता है, और यह OR (जो इंडेक्स उपयोग को छोड़ देता है) का उपयोग करने के प्रदर्शन ओवरहेड को नहीं लेता है। डेटा सेट बहुत बड़ा है और अंतिम पृष्ठ के पास है तो डाउनसाइड अस्थायी स्थान की मात्रा का उपयोग किया जाता है। मैंने उस मामले में कर्सर प्रदर्शन का परीक्षण नहीं किया, लेकिन यह बेहतर हो सकता है।
ध्यान दें कि इस दृष्टिकोण को डेटा के पहले पृष्ठ के लिए अनुकूलित किया जा सकता है। इसके अलावा, ROWCOUNT का उपयोग किया गया था क्योंकि TOP SQL Server 2000 में चर को स्वीकार नहीं करता है।
एसक्यूएल सर्वर 2000, 2005, 2008, 2012 में परिणामों को पेजेट करने के लिए सबसे अच्छा तरीका (प्रदर्शन के अनुसार) क्या है यदि आप परिणाम की कुल संख्या (पेजिंग से पहले) प्राप्त करना चाहते हैं?
SQL सर्वर पक्ष में क्वेरी के परिणाम को पेजिंग के लिए ये मेरे समाधान हैं। ये दृष्टिकोण SQL Server 2008 और 2012 के बीच अलग हैं। इसके अलावा, मैंने एक कॉलम के साथ फ़िल्टरिंग और ऑर्डर की अवधारणा को जोड़ा है। जब आप अपने ग्रिडव्यू में पेजिंग और फ़िल्टरिंग और ऑर्डर कर रहे हैं तो यह बहुत ही कुशल है।
परीक्षण से पहले, आपको एक नमूना तालिका बनाना होगा और इस तालिका में कुछ पंक्ति डालना होगा: (असली दुनिया में आपको बदलना होगा जहां आपके टेबल फ़ील्ड पर विचार करने वाला क्लॉज है और शायद आपके पास चयन के मुख्य भाग में कुछ शामिल और सबक्वायरी है)
Create Table VLT
(
ID int IDentity(1,1),
Name nvarchar(50),
Tel Varchar(20)
)
GO
Insert INTO VLT
VALUES
('NAME' + Convert(varchar(10),@@identity),'FAMIL' + Convert(varchar(10),@@identity))
GO 500000
इन सभी नमूने में, मैं प्रति पृष्ठ 200 पंक्तियों से पूछताछ करना चाहता हूं और मैं पृष्ठ संख्या 1200 के लिए पंक्ति ला रहा हूं।
एसक्यूएल सर्वर 2008 में, आप सीटीई अवधारणा का उपयोग कर सकते हैं। इसके कारण, मैंने SQL सर्वर 2008+ के लिए दो प्रकार की क्वेरी लिखी है
- एसक्यूएल सर्वर 2008+
DECLARE @PageNumber Int = 1200
DECLARE @PageSize INT = 200
DECLARE @SortByField int = 1 --The field used for sort by
DECLARE @SortOrder nvarchar(255) = 'ASC' --ASC or DESC
DECLARE @FilterType nvarchar(255) = 'None' --The filter type, as defined on the client side (None/Contain/NotContain/Match/NotMatch/True/False/)
DECLARE @FilterValue nvarchar(255) = '' --The value the user gave for the filter
DECLARE @FilterColumn int = 1 --The column to wich the filter is applied, represents the column number like when we send the information.
SELECT
Data.ID,
Data.Name,
Data.Tel
FROM
(
SELECT
ROW_NUMBER()
OVER( ORDER BY
CASE WHEN @SortByField = 1 AND @SortOrder = 'ASC'
THEN VLT.ID END ASC,
CASE WHEN @SortByField = 1 AND @SortOrder = 'DESC'
THEN VLT.ID END DESC,
CASE WHEN @SortByField = 2 AND @SortOrder = 'ASC'
THEN VLT.Name END ASC,
CASE WHEN @SortByField = 2 AND @SortOrder = 'DESC'
THEN VLT.Name END ASC,
CASE WHEN @SortByField = 3 AND @SortOrder = 'ASC'
THEN VLT.Tel END ASC,
CASE WHEN @SortByField = 3 AND @SortOrder = 'DESC'
THEN VLT.Tel END ASC
) AS RowNum
,*
FROM VLT
WHERE
( -- We apply the filter logic here
CASE
WHEN @FilterType = 'None' THEN 1
-- Name column filter
WHEN @FilterType = 'Contain' AND @FilterColumn = 1
AND ( -- In this case, when the filter value is empty, we want to show everything.
VLT.ID LIKE '%' + @FilterValue + '%'
OR
@FilterValue = ''
) THEN 1
WHEN @FilterType = 'NotContain' AND @FilterColumn = 1
AND ( -- In this case, when the filter value is empty, we want to show everything.
VLT.ID NOT LIKE '%' + @FilterValue + '%'
OR
@FilterValue = ''
) THEN 1
WHEN @FilterType = 'Match' AND @FilterColumn = 1
AND VLT.ID = @FilterValue THEN 1
WHEN @FilterType = 'NotMatch' AND @FilterColumn = 1
AND VLT.ID <> @FilterValue THEN 1
-- Name column filter
WHEN @FilterType = 'Contain' AND @FilterColumn = 2
AND ( -- In this case, when the filter value is empty, we want to show everything.
VLT.Name LIKE '%' + @FilterValue + '%'
OR
@FilterValue = ''
) THEN 1
WHEN @FilterType = 'NotContain' AND @FilterColumn = 2
AND ( -- In this case, when the filter value is empty, we want to show everything.
VLT.Name NOT LIKE '%' + @FilterValue + '%'
OR
@FilterValue = ''
) THEN 1
WHEN @FilterType = 'Match' AND @FilterColumn = 2
AND VLT.Name = @FilterValue THEN 1
WHEN @FilterType = 'NotMatch' AND @FilterColumn = 2
AND VLT.Name <> @FilterValue THEN 1
-- Tel column filter
WHEN @FilterType = 'Contain' AND @FilterColumn = 3
AND ( -- In this case, when the filter value is empty, we want to show everything.
VLT.Tel LIKE '%' + @FilterValue + '%'
OR
@FilterValue = ''
) THEN 1
WHEN @FilterType = 'NotContain' AND @FilterColumn = 3
AND ( -- In this case, when the filter value is empty, we want to show everything.
VLT.Tel NOT LIKE '%' + @FilterValue + '%'
OR
@FilterValue = ''
) THEN 1
WHEN @FilterType = 'Match' AND @FilterColumn = 3
AND VLT.Tel = @FilterValue THEN 1
WHEN @FilterType = 'NotMatch' AND @FilterColumn = 3
AND VLT.Tel <> @FilterValue THEN 1
END
) = 1
) AS Data
WHERE Data.RowNum > @PageSize * (@PageNumber - 1)
AND Data.RowNum <= @PageSize * @PageNumber
ORDER BY Data.RowNum
GO
और एसक्यूएल सर्वर 2008+ में सीटीई के साथ दूसरा समाधान
DECLARE @PageNumber Int = 1200
DECLARE @PageSize INT = 200
DECLARE @SortByField int = 1 --The field used for sort by
DECLARE @SortOrder nvarchar(255) = 'ASC' --ASC or DESC
DECLARE @FilterType nvarchar(255) = 'None' --The filter type, as defined on the client side (None/Contain/NotContain/Match/NotMatch/True/False/)
DECLARE @FilterValue nvarchar(255) = '' --The value the user gave for the filter
DECLARE @FilterColumn int = 1 --The column to wich the filter is applied, represents the column number like when we send the information.
;WITH
Data_CTE
AS
(
SELECT
ROW_NUMBER()
OVER( ORDER BY
CASE WHEN @SortByField = 1 AND @SortOrder = 'ASC'
THEN VLT.ID END ASC,
CASE WHEN @SortByField = 1 AND @SortOrder = 'DESC'
THEN VLT.ID END DESC,
CASE WHEN @SortByField = 2 AND @SortOrder = 'ASC'
THEN VLT.Name END ASC,
CASE WHEN @SortByField = 2 AND @SortOrder = 'DESC'
THEN VLT.Name END ASC,
CASE WHEN @SortByField = 3 AND @SortOrder = 'ASC'
THEN VLT.Tel END ASC,
CASE WHEN @SortByField = 3 AND @SortOrder = 'DESC'
THEN VLT.Tel END ASC
) AS RowNum
,*
FROM VLT
WHERE
( -- We apply the filter logic here
CASE
WHEN @FilterType = 'None' THEN 1
-- Name column filter
WHEN @FilterType = 'Contain' AND @FilterColumn = 1
AND ( -- In this case, when the filter value is empty, we want to show everything.
VLT.ID LIKE '%' + @FilterValue + '%'
OR
@FilterValue = ''
) THEN 1
WHEN @FilterType = 'NotContain' AND @FilterColumn = 1
AND ( -- In this case, when the filter value is empty, we want to show everything.
VLT.ID NOT LIKE '%' + @FilterValue + '%'
OR
@FilterValue = ''
) THEN 1
WHEN @FilterType = 'Match' AND @FilterColumn = 1
AND VLT.ID = @FilterValue THEN 1
WHEN @FilterType = 'NotMatch' AND @FilterColumn = 1
AND VLT.ID <> @FilterValue THEN 1
-- Name column filter
WHEN @FilterType = 'Contain' AND @FilterColumn = 2
AND ( -- In this case, when the filter value is empty, we want to show everything.
VLT.Name LIKE '%' + @FilterValue + '%'
OR
@FilterValue = ''
) THEN 1
WHEN @FilterType = 'NotContain' AND @FilterColumn = 2
AND ( -- In this case, when the filter value is empty, we want to show everything.
VLT.Name NOT LIKE '%' + @FilterValue + '%'
OR
@FilterValue = ''
) THEN 1
WHEN @FilterType = 'Match' AND @FilterColumn = 2
AND VLT.Name = @FilterValue THEN 1
WHEN @FilterType = 'NotMatch' AND @FilterColumn = 2
AND VLT.Name <> @FilterValue THEN 1
-- Tel column filter
WHEN @FilterType = 'Contain' AND @FilterColumn = 3
AND ( -- In this case, when the filter value is empty, we want to show everything.
VLT.Tel LIKE '%' + @FilterValue + '%'
OR
@FilterValue = ''
) THEN 1
WHEN @FilterType = 'NotContain' AND @FilterColumn = 3
AND ( -- In this case, when the filter value is empty, we want to show everything.
VLT.Tel NOT LIKE '%' + @FilterValue + '%'
OR
@FilterValue = ''
) THEN 1
WHEN @FilterType = 'Match' AND @FilterColumn = 3
AND VLT.Tel = @FilterValue THEN 1
WHEN @FilterType = 'NotMatch' AND @FilterColumn = 3
AND VLT.Tel <> @FilterValue THEN 1
END
) = 1
)
SELECT
Data.ID,
Data.Name,
Data.Tel
FROM Data_CTE AS Data
WHERE Data.RowNum > @PageSize * (@PageNumber - 1)
AND Data.RowNum <= @PageSize * @PageNumber
ORDER BY Data.RowNum
- एसक्यूएल सर्वर 2012+
DECLARE @PageNumber Int = 1200
DECLARE @PageSize INT = 200
DECLARE @SortByField int = 1 --The field used for sort by
DECLARE @SortOrder nvarchar(255) = 'ASC' --ASC or DESC
DECLARE @FilterType nvarchar(255) = 'None' --The filter type, as defined on the client side (None/Contain/NotContain/Match/NotMatch/True/False/)
DECLARE @FilterValue nvarchar(255) = '' --The value the user gave for the filter
DECLARE @FilterColumn int = 1 --The column to wich the filter is applied, represents the column number like when we send the information.
;WITH
Data_CTE
AS
(
SELECT
*
FROM VLT
WHERE
( -- We apply the filter logic here
CASE
WHEN @FilterType = 'None' THEN 1
-- Name column filter
WHEN @FilterType = 'Contain' AND @FilterColumn = 1
AND ( -- In this case, when the filter value is empty, we want to show everything.
VLT.ID LIKE '%' + @FilterValue + '%'
OR
@FilterValue = ''
) THEN 1
WHEN @FilterType = 'NotContain' AND @FilterColumn = 1
AND ( -- In this case, when the filter value is empty, we want to show everything.
VLT.ID NOT LIKE '%' + @FilterValue + '%'
OR
@FilterValue = ''
) THEN 1
WHEN @FilterType = 'Match' AND @FilterColumn = 1
AND VLT.ID = @FilterValue THEN 1
WHEN @FilterType = 'NotMatch' AND @FilterColumn = 1
AND VLT.ID <> @FilterValue THEN 1
-- Name column filter
WHEN @FilterType = 'Contain' AND @FilterColumn = 2
AND ( -- In this case, when the filter value is empty, we want to show everything.
VLT.Name LIKE '%' + @FilterValue + '%'
OR
@FilterValue = ''
) THEN 1
WHEN @FilterType = 'NotContain' AND @FilterColumn = 2
AND ( -- In this case, when the filter value is empty, we want to show everything.
VLT.Name NOT LIKE '%' + @FilterValue + '%'
OR
@FilterValue = ''
) THEN 1
WHEN @FilterType = 'Match' AND @FilterColumn = 2
AND VLT.Name = @FilterValue THEN 1
WHEN @FilterType = 'NotMatch' AND @FilterColumn = 2
AND VLT.Name <> @FilterValue THEN 1
-- Tel column filter
WHEN @FilterType = 'Contain' AND @FilterColumn = 3
AND ( -- In this case, when the filter value is empty, we want to show everything.
VLT.Tel LIKE '%' + @FilterValue + '%'
OR
@FilterValue = ''
) THEN 1
WHEN @FilterType = 'NotContain' AND @FilterColumn = 3
AND ( -- In this case, when the filter value is empty, we want to show everything.
VLT.Tel NOT LIKE '%' + @FilterValue + '%'
OR
@FilterValue = ''
) THEN 1
WHEN @FilterType = 'Match' AND @FilterColumn = 3
AND VLT.Tel = @FilterValue THEN 1
WHEN @FilterType = 'NotMatch' AND @FilterColumn = 3
AND VLT.Tel <> @FilterValue THEN 1
END
) = 1
)
SELECT
Data.ID,
Data.Name,
Data.Tel
FROM Data_CTE AS Data
ORDER BY
CASE WHEN @SortByField = 1 AND @SortOrder = 'ASC'
THEN Data.ID END ASC,
CASE WHEN @SortByField = 1 AND @SortOrder = 'DESC'
THEN Data.ID END DESC,
CASE WHEN @SortByField = 2 AND @SortOrder = 'ASC'
THEN Data.Name END ASC,
CASE WHEN @SortByField = 2 AND @SortOrder = 'DESC'
THEN Data.Name END ASC,
CASE WHEN @SortByField = 3 AND @SortOrder = 'ASC'
THEN Data.Tel END ASC,
CASE WHEN @SortByField = 3 AND @SortOrder = 'DESC'
THEN Data.Tel END ASC
OFFSET @PageSize * (@PageNumber - 1) ROWS FETCH NEXT @PageSize ROWS ONLY;
आपने भाषा निर्दिष्ट नहीं की है और न ही आप किस ड्राइवर का उपयोग कर रहे हैं। इसलिए मैं इसे संक्षेप में वर्णित कर रहा हूं।
- स्क्रोल करने योग्य परिणामसेट / डेटासेट बनाएं। इसके लिए टेबल पर प्राथमिक होना आवश्यक है
- अंत तक कूदो
- पंक्ति गणना का अनुरोध करें
- पेज की शुरुआत में कूदो
- पृष्ठ के अंत तक पंक्तियों के माध्यम से स्क्रॉल करें
इस दृष्टिकोण को आजमाएं:
SELECT TOP @offset a.*
FROM (select top @limit b.*, COUNT(*) OVER() totalrows
from TABLENAME b order by id asc) a
ORDER BY id desc;
एसक्यूएल सर्वर 2012 से, हम FETCH NEXT
प्राप्त करने के लिए OFFSET
और FETCH NEXT
क्लॉज का उपयोग कर सकते हैं।
SQL सर्वर के लिए इसे आज़माएं:
SQL सर्वर 2012 में ORDER BY खंड में एक नई सुविधा जोड़ा गया था, सेट डेटा के अनुकूलन की क्वेरी करने के लिए, टी-एसक्यूएल में लिखने वाले किसी भी व्यक्ति के लिए डेटा पेजिंग के साथ काम आसान बनाना, साथ ही साथ SQL सर्वर में पूरी निष्पादन योजना के लिए।
पिछले उदाहरण में उपयोग किए गए एक ही तर्क के साथ टी-एसक्यूएल स्क्रिप्ट के नीचे।
--CREATING A PAGING WITH OFFSET and FETCH clauses IN "SQL SERVER 2012" DECLARE @PageNumber AS INT, @RowspPage AS INT SET @PageNumber = 2 SET @RowspPage = 10 SELECT ID_EXAMPLE, NM_EXAMPLE, DT_CREATE FROM TB_EXAMPLE ORDER BY ID_EXAMPLE OFFSET ((@PageNumber - 1) * @RowspPage) ROWS FETCH NEXT @RowspPage ROWS ONLY;
केस वार के बाद उपयोग करना आसान लगता है और तेजी से पेज नंबर सेट करें।
use AdventureWorks
DECLARE @RowsPerPage INT = 10, @PageNumber INT = 6;
with result as(
SELECT SalesOrderDetailID, SalesOrderID, ProductID,
ROW_NUMBER() OVER (ORDER BY SalesOrderDetailID) AS RowNum
FROM Sales.SalesOrderDetail
where 1=1
)
select SalesOrderDetailID, SalesOrderID, ProductID from result
WHERE result.RowNum BETWEEN ((@PageNumber-1)*@RowsPerPage)+1
AND @RowsPerPage*(@PageNumber)
सीटीई के साथ भी
use AdventureWorks
DECLARE @RowsPerPage INT = 10, @PageNumber INT = 6
SELECT SalesOrderDetailID, SalesOrderID, ProductID
FROM (
SELECT SalesOrderDetailID, SalesOrderID, ProductID,
ROW_NUMBER() OVER (ORDER BY SalesOrderDetailID) AS RowNum
FROM Sales.SalesOrderDetail
where 1=1
) AS SOD
WHERE SOD.RowNum BETWEEN ((@PageNumber-1)*@RowsPerPage)+1
AND @RowsPerPage*(@PageNumber)
परिणाम और पेजिंग की कुल संख्या प्राप्त करना दो अलग-अलग संचालन हैं। इस उदाहरण के लिए, आइए मान लें कि आप जिस प्रश्न से निपट रहे हैं वह है
SELECT * FROM Orders WHERE OrderDate >= '1980-01-01' ORDER BY OrderDate
इस मामले में, आप परिणामों का कुल संख्या निर्धारित करेंगे:
SELECT COUNT(*) FROM Orders WHERE OrderDate >= '1980-01-01'
... जो अक्षम प्रतीत हो सकता है, लेकिन वास्तव में सुंदर प्रदर्शनकर्ता है, मानते हैं कि सभी इंडेक्स इत्यादि ठीक तरह से स्थापित हैं।
अगला, वास्तविक परिणामों को एक पेजेड फैशन में वापस पाने के लिए, निम्न क्वेरी सबसे कुशल होगी:
SELECT *
FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY OrderDate ) AS RowNum, *
FROM Orders
WHERE OrderDate >= '1980-01-01'
) AS RowConstrainedResult
WHERE RowNum >= 1
AND RowNum < 20
ORDER BY RowNum
यह मूल क्वेरी के पंक्तियों 1-1 को वापस कर देगा। यहां विशेष बात यह है कि विशेष रूप से वेब ऐप्स के लिए, आपको पंक्तियों को वापस करने के अलावा, किसी भी राज्य को रखने की आवश्यकता नहीं है।
मैं भी बहुत उत्सुक था कि क्यों माइक्रोसॉफ्ट offset/limit
साथ माइक्रोसॉफ्ट या पोस्टग्रेएसक्यूएल में सरल प्रश्नों का समर्थन नहीं करता है। अंत में, माइक्रोसॉफ्ट एसक्यूएल सर्वर 2012 जारी किया गया, मुझे वास्तव में पेजिनेशन के लिए इसकी सादगी पसंद है, आपको यहां दिए गए जटिल प्रश्नों का उपयोग करने की आवश्यकता नहीं है।
अगली 10 पंक्तियां प्राप्त करने के लिए बस यह क्वेरी चलाएं:
SELECT * FROM TableName ORDER BY id OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;
http://technet.microsoft.com/en-us/library/gg699618.aspx
इसका उपयोग करते समय विचार करने के लिए महत्वपूर्ण बिंदु:
- ऑफसेट और फीट क्लॉज का उपयोग करना अनिवार्य है।
- ऑफसेट खंड FETCH के साथ अनिवार्य है। आप कभी भी उपयोग नहीं कर सकते, आदेश ... FETCH।
- शीर्ष क्वेरी अभिव्यक्ति में OFFSET और FETCH के साथ जोड़ा नहीं जा सकता है।
एमएसडीएन: ROW_NUMBER (ट्रांजैक्ट-एसक्यूएल)
परिणाम विभाजन के विभाजन के भीतर पंक्ति की अनुक्रमिक संख्या देता है, प्रत्येक विभाजन में पहली पंक्ति के लिए 1 से शुरू होता है।
निम्नलिखित उदाहरण ऑर्डरडेट के क्रम में 50 से 60 के साथ पंक्तियों को वापस लाता है।
WITH OrderedOrders AS
(
SELECT
ROW_NUMBER() OVER(ORDER BY FirstName DESC) AS RowNumber,
FirstName, LastName, ROUND(SalesYTD,2,1) AS "Sales YTD"
FROM [dbo].[vSalesPerson]
)
SELECT RowNumber,
FirstName, LastName, Sales YTD
FROM OrderedOrders
WHERE RowNumber > 50 AND RowNumber < 60;
RowNumber FirstName LastName SalesYTD
--- ----------- ---------------------- -----------------
1 Linda Mitchell 4251368.54
2 Jae Pak 4116871.22
3 Michael Blythe 3763178.17
4 Jillian Carson 3189418.36
5 Ranjit Varkey Chudukatil 3121616.32
6 José Saraiva 2604540.71
7 Shu Ito 2458535.61
8 Tsvi Reiter 2315185.61
9 Rachel Valdez 1827066.71
10 Tete Mensa-Annan 1576562.19
11 David Campbell 1573012.93
12 Garrett Vargas 1453719.46
13 Lynn Tsoflias 1421810.92
14 Pamela Ansman-Wolfe 1352577.13
ROW_NUMBER
तकनीक के लिए, यदि आपके पास उपयोग करने के लिए सॉर्टिंग कॉलम नहीं है, तो आप निम्नानुसार CURRENT_TIMESTAMP
उपयोग कर सकते हैं:
SELECT TOP 20
col1,
col2,
col3,
col4
FROM (
SELECT
tbl.col1 AS col1
,tbl.col2 AS col2
,tbl.col3 AS col3
,tbl.col4 AS col4
,ROW_NUMBER() OVER (
ORDER BY CURRENT_TIMESTAMP
) AS sort_row
FROM dbo.MyTable tbl
) AS query
WHERE query.sort_row > 10
ORDER BY query.sort_row
इसने मेरे लिए टेबल आकारों पर 700,000 तक की खोज के लिए अच्छा काम किया है।
यह 11 से 30 के रिकॉर्ड प्राप्त करता है।