اسان ٽيبل جو نالو ڳولڻ لاء ايندڙ قدم ۾ data_file_id استعمال ڪرڻ وارا آهيون. توھان صرف ايندڙ قدم ڏانھن وڃو، پر جيڪڏھن توھان فائل جي نالي ۾ دلچسپي رکو ٿا، توھان ان کي ڳولي سگھوٿا ھڪڙي سوال کي ھلائيندي مليل ڊيٽابيس جي حوالي سان، ھن سوال ۾ data_file_id کي متبادل بڻايو:
USE WideWorldImporters;
GO
SELECT
name,
physical_name
FROM sys.database_files
WHERE file_id = 3;
GO
WideWorldImporters ڊيٽابيس ۾ هي هڪ فائل آهي جنهن کي WWI_UserData سڏيو ويندو آهي ۽ مون ان کي C:MSSQLDATAWideWorldImporters_UserData.ndf تي بحال ڪيو آهي. (اڙي، توهان مون کي سسٽم ڊرائيو تي فائلون وجهي پڪڙيو! نه! اهو شرمناڪ آهي).
1.3) ڊي بي سي سي پيج تان اعتراض جو نالو حاصل ڪريو
اسان هاڻي ڄاڻون ٿا ته صفحو #70133 datafile 3 ۾ WorldWideImporters ڊيٽابيس سان تعلق رکي ٿو. اسان هن صفحي جي مواد کي غير دستاويزي DBCC پيج استعمال ڪندي ڏسي سگھون ٿا ۽ پرچم 3604 کي نشانو بڻايو.
نوٽ: مان DBCC PAGE استعمال ڪرڻ کي ترجيح ڏيان ٿو بحال ٿيل ڪاپي تي ڪنهن ٻئي سرور تي، ڇاڪاڻ ته اهو غير دستاويزي مواد آهي. ڪجهه حالتن ۾، هوء ڊمپ جي نتيجي ۾ ٿي سگھي ٿو (لڳ ڀڳ مترجم - لنڪ، بدقسمتي سان، ڪٿي به نه ٿو، پر يو آر ايل جي ذريعي، اسان فلٽر ٿيل انڊيڪس بابت ڳالهائي رهيا آهيون).
/* This trace flag makes DBCC PAGE output go to our Messages tab
instead of the SQL Server Error Log file */
DBCC TRACEON (3604);
GO
/* DBCC PAGE (DatabaseName, FileNumber, PageNumber, DumpStyle)*/
DBCC PAGE ('WideWorldImporters',3,70133,2);
GO
USE WideWorldImporters;
GO
SELECT
sc.name as schema_name,
so.name as object_name,
si.name as index_name
FROM sys.objects as so
JOIN sys.indexes as si on
so.object_id=si.object_id
JOIN sys.schemas AS sc on
so.schema_id=sc.schema_id
WHERE
so.object_id = 94623380
and si.index_id = 1;
GO
۽ هتي اسان ڏسون ٿا ته تالا تي انتظار Sales.OrderLines ٽيبل جي PK_Sales_OrderLines انڊيڪس تي هو.
نوٽ: SQL سرور 2014 ۽ مٿي ۾، اعتراض جو نالو پڻ ڳولهي سگھجي ٿو غير دستاويزي DMO sys.dm_db_database_page_allocations استعمال ڪندي. پر توهان کي ڊيٽابيس ۾ هر صفحي تي سوال ڪرڻو پوندو، جيڪو وڏي ڊيٽابيس لاءِ تمام سٺو نٿو لڳي، تنهنڪري مون استعمال ڪيو DBCC پيج.
1.4) ڇا اهو ممڪن آهي ته صفحي تي ڊيٽا کي ڏسڻ لاء جيڪو بلاڪ ڪيو ويو آهي؟
نوو، ها. پر... ڇا توهان کي پڪ آهي ته توهان کي واقعي ان جي ضرورت آهي؟
اهو سست آهي جيتوڻيڪ ننڍڙي ٽيبل تي. پر اهو هڪ قسم جو ٿڌو آهي، تنهنڪري توهان هيستائين پڙهيو آهي... اچو ته %%physloc%% بابت ڳالهايون!
Use WideWorldImporters;
GO
SELECT
sys.fn_PhysLocFormatter (%%physloc%%),
*
FROM Sales.OrderLines (NOLOCK)
WHERE sys.fn_PhysLocFormatter (%%physloc%%) like '(3:70133%'
GO
جيئن مون چيو، اهو سست آهي جيتوڻيڪ ننڍڙي ٽيبل تي. مون درخواست ۾ NOLOCK شامل ڪيو ڇاڪاڻ ته اسان وٽ اڃا تائين ڪا به ضمانت نه آهي ته جيڪو ڊيٽا اسان ڏسڻ چاهيون ٿا اهو بلڪل ساڳيو آهي جيئن اهو ان وقت هو جڏهن تالا دريافت ڪيو ويو هو - تنهنڪري اسان محفوظ طور تي گندا پڙهي سگهون ٿا.
پر، هوري، سوال مون کي اهي ئي 25 قطارون موٽائي ٿو، جن لاءِ اسان جي سوال وڙهندي هئي.
PAGE لاڪ جي باري ۾ ڪافي. ڇا جيڪڏهن اسان هڪ KEY تالا جو انتظار ڪري رهيا آهيون؟
جيڪڏهن توهان جو سوال انڊيڪس انٽري تي بند ڪرڻ جي ڪوشش ڪري ٿو ۽ پنهنجو پاڻ کي بند ڪيو وڃي ٿو، توهان کي مڪمل طور تي مختلف قسم جو پتو ملندو.
ٽوڙڻ "6:72057594041991168 (ce52f92a058c)" حصن ۾، اسان حاصل ڪريون ٿا:
database_id = 6
hobt_id = 72057594041991168
جادو هيش = (ce52f92a058c)
2.1) ڊيڪرپٽ ڊيٽابيس_id
اهو بلڪل ساڳيو ڪم ڪري ٿو جيئن مٿي ڏنل مثال سان! اسان سوال استعمال ڪندي ڊيٽابيس جو نالو ڳوليندا آهيون:
SELECT
name
FROM sys.databases
WHERE database_id=6;
GO
مليل ڊيٽابيس جي حوالي سان، توهان کي سوال ڪرڻو پوندو sys.partitions سان گڏ ڪجهه جوائن جيڪي ٽيبل ۽ انڊيڪس جا نالا طئي ڪرڻ ۾ مدد ڪندا۔۔۔
USE WideWorldImporters;
GO
SELECT
sc.name as schema_name,
so.name as object_name,
si.name as index_name
FROM sys.partitions AS p
JOIN sys.objects as so on
p.object_id=so.object_id
JOIN sys.indexes as si on
p.index_id=si.index_id and
p.object_id=si.object_id
JOIN sys.schemas AS sc on
so.schema_id=sc.schema_id
WHERE hobt_id = 72057594041991168;
GO
اهو مون کي ٻڌائي ٿو ته درخواست جي انتظار ۾ هئي Application.Countries lock استعمال ڪندي PK_Application_Countries index.