Files
sql-scripts/test idx usage with definition.sql
Thierry Schork 7cf858256a initial commit
2022-12-30 12:10:12 +01:00

225 lines
11 KiB
PL/PgSQL

/*
Test index / fk retrieval query
02.11.2022, TSC
*/
USE [sandbox];
IF OBJECT_ID('dbo.parent') IS NULL
BEGIN
--DROP TABLE dbo.parent
ALTER TABLE [dbo].[child]
DROP CONSTRAINT IF EXISTS [fk_child__REF__parent];
CREATE TABLE [dbo].[parent] ([id] INT NOT NULL
CONSTRAINT [pk_parent]
PRIMARY KEY ([id]));
PRINT 'parent table created';
END;
IF OBJECT_ID('dbo.child') IS NULL
BEGIN
--DROP TABLE dbo.child;
CREATE TABLE [dbo].[child] ([id] INT IDENTITY NOT NULL,
[parent_id] INT NOT NULL,
[ins_date] SMALLDATETIME NOT NULL
CONSTRAINT [df_child_COL_insDate]
DEFAULT CURRENT_TIMESTAMP
CONSTRAINT [pk_child]
PRIMARY KEY ([id]));
PRINT 'child table created';
END;
IF OBJECT_ID('fk_child__REF__parent') IS NULL
BEGIN
ALTER TABLE [dbo].[child]
ADD CONSTRAINT [fk_child__REF__parent]
FOREIGN KEY ([parent_id])
REFERENCES [dbo].[parent] ([id]);
PRINT 'fk created';
END;
IF INDEXPROPERTY(OBJECT_ID('child'), 'CIX_child_parent_id', 'IndexID') IS NULL
BEGIN;
CREATE NONCLUSTERED INDEX [CIX_child_parent_id]
ON [dbo].[child] ([parent_id]);
PRINT 'idx created';
END;
TRUNCATE TABLE [dbo].[child];
DELETE FROM [dbo].[parent]
WHERE 1 = 1;
INSERT INTO [dbo].[parent] ([id])
VALUES (1);
INSERT INTO [dbo].[child] ([parent_id])
VALUES (1);
SELECT SCHEMA_NAME([tab].[schema_id]) + '.' + [tab].[name] AS [table],
[col].[column_id],
[col].[name] AS [column_name],
CASE
WHEN [fk].[object_id] IS NOT NULL THEN '>-'
ELSE NULL END AS [rel],
SCHEMA_NAME([pk_tab].[schema_id]) + '.' + [pk_tab].[name] AS [primary_table],
[pk_col].[name] AS [pk_column_name],
[fk_cols].[constraint_column_id] AS [NO],
[fk].[name] AS [fk_constraint_name]
FROM [sys].[tables] [tab]
INNER JOIN [sys].[columns] [col]
ON [col].[object_id] = [tab].[object_id]
LEFT OUTER JOIN [sys].[foreign_key_columns] [fk_cols]
ON [fk_cols].[parent_object_id] = [tab].[object_id]
AND [fk_cols].[parent_column_id] = [col].[column_id]
LEFT OUTER JOIN [sys].[foreign_keys] [fk]
ON [fk].[object_id] = [fk_cols].[constraint_object_id]
LEFT OUTER JOIN [sys].[tables] [pk_tab]
ON [pk_tab].[object_id] = [fk_cols].[referenced_object_id]
LEFT OUTER JOIN [sys].[columns] [pk_col]
ON [pk_col].[column_id] = [fk_cols].[referenced_column_id]
AND [pk_col].[object_id] = [fk_cols].[referenced_object_id]
WHERE [fk].[object_id] IS NOT NULL
--AND SCHEMA_NAME(tab.SCHEMA_ID) = 'dbo'
--AND tab.name='customer'
ORDER BY SCHEMA_NAME([tab].[schema_id]) + '.' + [tab].[name],
[col].[column_id];
;WITH [ColInfo]
AS (SELECT [o].[name] AS [TblName],
[s].[name] + '.' + [o].[name] AS [SchemaTbl],
[i].[name] AS [IndexName],
[i].[is_primary_key] AS [IsPrimaryKey],
[i].[is_unique_constraint] AS [IsUniqueConstraint],
[i].[is_unique] AS [IsUnique],
[c].[name] AS [ColName],
[c].[is_computed] AS [IsComputedCol],
[ic].[is_included_column] AS [IsIncludedCol],
[ic].[key_ordinal],
[i].[filter_definition] AS [FilterDefinition]
FROM [sys].[objects] [o]
INNER JOIN [sys].[schemas] [s]
ON [o].[schema_id] = [s].[schema_id]
INNER JOIN [sys].[columns] [c]
ON [o].[object_id] = [c].[object_id]
INNER JOIN [sys].[indexes] [i]
ON [c].[object_id] = [i].[object_id]
INNER JOIN [sys].[index_columns] [ic]
ON [i].[index_id] = [ic].[index_id]
AND [o].[object_id] = [ic].[object_id]
AND [c].[column_id] = [ic].[column_id])
--- Index Read/Write stats (all tables in current DB) ordered by Reads (Query 62) (Overall Index Usage - Reads)
SELECT [o].[name] AS [tblName],
[o].[type],
[i].[name] AS [IndexName],
[i].[index_id],
[s].[user_seeks] + [s].[user_scans] + [s].[user_lookups] AS [Reads],
[s].[user_updates] AS [Writes],
CASE
WHEN [s].[user_updates] > [s].[user_seeks] + [s].[user_scans] + [s].[user_lookups] THEN
[s].[user_updates] - ([s].[user_seeks] + [s].[user_scans] + [s].[user_lookups])
ELSE ([s].[user_seeks] + [s].[user_scans] + [s].[user_lookups]) - [s].[user_updates] END AS [delta],
[i].[type_desc] AS [IndexType],
[i].[fill_factor] AS [FillFactor],
[i].[has_filter],
[i].[filter_definition],
[s].[last_user_scan],
[s].[last_user_lookup],
[s].[last_user_seek],
[idx_cols].[IndexColumns],
[idx_cols].[IncludedColumns],
[fk].[primary_table],
[fk].[pk_column_name],
[fk].[fk_constraint_name]
FROM [sys].[dm_db_index_usage_stats] AS [s] WITH (NOLOCK)
INNER JOIN [sys].[indexes] AS [i] WITH (NOLOCK)
ON [s].[object_id] = [i].[object_id]
INNER JOIN [sys].[objects] [o] WITH (NOLOCK)
ON [s].[object_id] = [o].[object_id]
OUTER APPLY ( SELECT DISTINCT [x].[TblName],
[x].[IndexName],
[x].[IsPrimaryKey],
[x].[IsUniqueConstraint],
[x].[IsUnique],
--,size.IndexSizeKB
[c].[IndexColumns],
[ci].[IncludedColumns],
[cc].[ComputedColumns],
[x].[FilterDefinition]
FROM [ColInfo] [x]
CROSS APPLY ( SELECT STUFF([sq].[strXML], 1, 2, '') AS [IndexColumns]
FROM ( SELECT ', ' + ISNULL([x2].[ColName], '')
FROM [ColInfo] [x2]
WHERE [x].[TblName] = [x2].[TblName]
AND [x].[IndexName] = [x2].[IndexName]
AND [x2].[IsIncludedCol] = 0
ORDER BY [x2].[key_ordinal]
FOR XML PATH('')) [sq]([strXML]) ) [c]
OUTER APPLY ( SELECT STUFF([sq].[strXML], 1, 2, '') AS [IncludedColumns]
FROM ( SELECT ', ' + ISNULL([x2].[ColName], '')
FROM [ColInfo] [x2]
WHERE [x].[TblName] = [x2].[TblName]
AND [x].[IndexName] = [x2].[IndexName]
AND [x2].[IsIncludedCol] = 1
ORDER BY [x2].[key_ordinal]
FOR XML PATH('')) [sq]([strXML]) ) [ci]
OUTER APPLY ( SELECT STUFF([sq].[strXML], 1, 2, '') AS [ComputedColumns]
FROM ( SELECT ', ' + ISNULL([x2].[ColName], '')
FROM [ColInfo] [x2]
WHERE [x].[TblName] = [x2].[TblName]
AND [x].[IndexName] = [x2].[IndexName]
AND [x2].[IsComputedCol] = 1
ORDER BY [x2].[key_ordinal]
FOR XML PATH('')) [sq]([strXML]) ) [cc]
WHERE [x].[TblName] = [o].[name]
AND [x].[IndexName] = [i].[name]) [idx_cols]
LEFT OUTER JOIN ( SELECT SCHEMA_NAME([tab].[schema_id]) + '.' + [tab].[name] AS [table],
[col].[column_id],
[col].[name] AS [column_name],
CASE
WHEN [fk].[object_id] IS NOT NULL THEN '>-'
ELSE NULL END AS [rel],
SCHEMA_NAME([pk_tab].[schema_id]) + '.' + [pk_tab].[name] AS [primary_table],
[pk_col].[name] AS [pk_column_name],
[fk_cols].[constraint_column_id] AS [NO],
[fk].[name] AS [fk_constraint_name],
[tab].[name] AS [tbl_name]
FROM [sys].[tables] [tab]
INNER JOIN [sys].[columns] [col]
ON [col].[object_id] = [tab].[object_id]
LEFT OUTER JOIN [sys].[foreign_key_columns] [fk_cols]
ON [fk_cols].[parent_object_id] = [tab].[object_id]
AND [fk_cols].[parent_column_id] = [col].[column_id]
LEFT OUTER JOIN [sys].[foreign_keys] [fk]
ON [fk].[object_id] = [fk_cols].[constraint_object_id]
LEFT OUTER JOIN [sys].[tables] [pk_tab]
ON [pk_tab].[object_id] = [fk_cols].[referenced_object_id]
LEFT OUTER JOIN [sys].[columns] [pk_col]
ON [pk_col].[column_id] = [fk_cols].[referenced_column_id]
AND [pk_col].[object_id] = [fk_cols].[referenced_object_id]
WHERE [fk].[object_id] IS NOT NULL) [fk]
ON [fk].[tbl_name] = [o].[name]
AND [idx_cols].[IndexColumns] LIKE '%' + [fk].[column_name] + '%'
WHERE [o].[type] = 'U' -- user table
AND [i].[index_id] = [s].[index_id]
AND [s].[database_id] = DB_ID()
AND [o].[name] = 'child'
--AND i.name IN
-- (
-- N'NCIX_Entry_COL_ET_accounting_period',
-- N'NCIX_Entry_COL_ET_entry_type',
-- N'NCIX_Entry_COL_ET_predefined_entry',
-- N'NCIX_Entry_COL_ET_bmc_user_profile',
-- N'NCIX_Entry_COL_ET_currency',
-- N'NCIX_Entry_COL_ET_entry_address'
-- )
ORDER BY [delta] DESC
--ORDER BY user_seeks + user_scans + user_lookups DESC -- Order by reads
--ORDER BY s.user_updates DESC OPTION -- Order by writes
OPTION (RECOMPILE);