SqlServer
一、复杂sql
1.1 行转列,多行合并一个字符串
-- 基础数据
SELECT * FROM DailyVisit
where Date in('2024-10-01','2024-10-02','2024-10-03') order by date
-- 行转列
select * FROM DailyVisit
pivot(max(info) for Date in([2024-10-01],[2024-10-02],[2024-10-03])) as tmp
-- 某个字段多行合并成一个字符串(stuff:替换函数,for xml path:多行转xml字符串)
select stuff(
(select ','+convert(nvarchar(50),Date,23)--常见三种:120 23 24
from DailyVisit
where Date in('2024-10-01','2024-10-02','2024-10-03')
for xml path('')
),1,1,'')
结果如下:

1.2 分页查询
SELECT 1,[Type]
,[Date]
,[Info]
,[IsDeleted] FROM DailyVisit
ORDER BY 1 OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY
-- order by可指定字段名来排序;
-- order by 1是指用第1列排序的意思,配合select 1 用常数做第1列,可以不打乱默认排序实现分页查询。
二、SQL使用笔记
1、(sql server 2012后)跳过n条记录取m条记录: order by …… OFFSET n ROWS FETCH NEXT m ROWS ONLY
三、查看系统
1、查看监听端口:exec sys.sp_readerrorlog 0, 1, 'listening'
2、查看服务名、计算机名:
SELECT @@SERVERNAME as '服务名',SERVERPROPERTY('SERVERNAME') as '计算机名'
3、查看索引大小:
SELECT i.name AS IndexName, SUM(s.used_page_count) * 8 AS IndexSizeKB
FROM sys.dm_db_partition_stats AS s
JOIN sys.indexes AS i
ON s.[object_id] = i.[object_id] AND s.index_id = i.index_id
WHERE i.name = '索引名称'
GROUP BY i.name ORDER BY i.name
4、添加(非聚集/聚集)主键
alter table TableName add primary key clustered--主键且聚集 nonclustered 主键但非聚集
(
columnName ASC
)
四、其他知识
1、【假设当前主机名:host-1,数据库实例名:testSql,端口为:1234】安装SqlServer后,如果要把端口修改为1433,去SqlServer配置管理器把对应实例的TCP/IP监听端口的TCP PORT都改成1433,然后重启SqlServer服务。重启完成后,数据库连接串也从【host-1\testSql,1234】变成【host-1\testSql,1433】。
2、数据库撑爆磁盘解决方案:
- a.右击数据库→任务→收缩,然后收缩文件和数据库,包括对应日志(SqlServer数据库扩充后不会自动释放空余的空间)。
- b.不需要做数据库增量备份(不需要开启CDC)的数据库,右击属性→选项→恢复模式→改成简单,再用a的方式收缩一次日志文件。
- c.右击数据库,选择属性→文件,添加其他磁盘作为备用存储。
- d.分离数据库文件,将文件移动到比较大的磁盘分区,再把文件重新关联数据库。
3、一千万条数据,建立索引时间约为4秒,索引占用空间大小约为200M。(索引字段大小为10)
本文提供了SqlServer的优化策略,如索引使用、SQL查询优化、系统监控及数据库管理技巧,包括端口修改、磁盘空间解决方案等,适用于数据库管理员和技术人员。

540

被折叠的 条评论
为什么被折叠?



