Showing posts with label SQL. Show all posts
Showing posts with label SQL. Show all posts

Sunday, February 17, 2019

Creating distinct pairs of values from database table

SELECT * FROM tbl1;
A
B

SELECT t1.val, t2.val
FROM tbl1 t1, tbl1 t2;

A A
B A
A B
B B

SELECT t1.val, t2.val
FROM tbl1 t1, tbl1 t2
WHERE t1.val <> t2.val;

B A
A B

SELECT t1.val, t2.val
FROM tbl1 t1, tbl1 t2
WHERE t1.val <> t2.val
AND t1.val < t2.val;

A B

Tuesday, August 4, 2015

Size of SQL Server Tables Query

SELECT
    s.Name AS SchemaName,
    t.NAME AS TableName,
    p.rows AS RowCounts,
    SUM(a.total_pages) * 8 AS TotalSpaceKB,
    SUM(a.used_pages) * 8 AS UsedSpaceKB,
    (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB
FROM
    sys.tables t
INNER JOIN
    sys.schemas s ON s.schema_id = t.schema_id
INNER JOIN    
    sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN
    sys.allocation_units a ON p.partition_id = a.container_id
WHERE
    t.NAME NOT LIKE 'dt%'    -- filter out system tables for diagramming
    AND t.is_ms_shipped = 0
    AND i.OBJECT_ID > 255
GROUP BY
    t.Name, s.Name, p.Rows
ORDER BY
    TotalSpaceKB DESC, s.Name, t.Name

Delete old rows from very large SQL Tables

Objective: Delete rows older a than a certain date/time (age in hours)

Assumptions: The row ids are in ascending order of their creation date

Algorithm:

Get the lowest_id in the table.
SELECT TOP 1 Id From table with(nolock) order by id asc option(maxdop 1)

Get upper_id for the batch by adding the batch size to the lowest_id.
SELECT top 1 id from table with(nolock) where id >= lowestId and id < lowestid+batchcount order by id DESC option (MAXDOP 1)

Get the date_created for the row with upper_id.
SELECT date_created from tablename with(nolock) where id=upper_id option (MAXDOP 1)

If the upperend_date_created older than the specified number of hours, delete all rows below the upper_id .

IF upperend_date_created  <= DATEADD(HOUR, - hours,  GETUTCDATE())
  delete from table where id <= upperendid option (maxdop 1)